最近开发了一个监测电商产品点击的监测系统,用最常规的写入日志的方式来记录商品的点击记录(不用Hbase因为文件速度写入更快)。然后今天读取昨天的数据进入Hbase进行统计。计算汇总完毕,Java处理Hbase返回汇总数据给MYSQL。
读取数据方案:昨天及以前的数据从Hbase,今天的数据从日志文件里读取。
日志文件如下
2020-05-25.log
2020-05-24.log
2020-05-23.log
目前数据量不大,一天1万条,1M,但是随着业务的增长,会扩张到30万条。这样记录就变得很大了,我无法对一个文件进行实时扫描。
我需要读取今天的只要程序读取2020-05-25.log的日志即可
当服务器每日发生一个日志,因为会发生反复读取问题,所以正确的做法是每个被读取进去Hbase的日志文件都不应该再次扫描读取,而是从Hbase来读取。
当每天发生的日志很多,那么单独日志文件会变得很大比如200M,这个时候需要限制每个日志文件大小比如限制为10M,当文件超过了10M,那么日志重命名为2020-05-25.log.1 再次超过日志重命名为2020-05-25.log.2 日志文件结构如下
2020-05-25.log.2
2020-05-25.log.1
2020-05-25.log
2020-05-24.log
2020-05-23.log
扫描日志进入Hbase大系统的算法,按节奏一次读入2020-05-25.log.1 2020-05-25.log.2的数据,而即时数据,依然扫描2020-05-25.log这个文件。因为文件小,可以读取的足够快。
RandomAccessFile类中seek方法可以从指定位置读取文件,可以用来实现文件实时读取
RandomAccessFile 可以实现对一个很大文件,只快速读取最后一些字节的操作,这样也可以实现5分钟数据情况
https://java-er.com/blog/java-randomaccessfile/