大数据文件解析项目

1 技术栈: javase, flinkx平台, hive, kafka, maven, mysql

2 文件类型: 分为csv格式,xml格式和普通的文本格式文件; 按照业务类型可分为两百多种类型文件

(如: inc*99s, inc*51s, ofc*51c, rd1001, rd1002,rd1027, ncm文件, 资金划付文件, Authlog大文件(2G)等)

3 实现解析过程: 引入flinkx包, 实现flinkx提供的接口, 并实现

void open(String fiileName, String filePath, InputStream in);// 一些初始化参数

boolean hasNext(); // 判断是否有下一行

String[] lineData(); // 循环io流文件内容,每读取一行数据则解析一行数据成对应的字段,并返回解析结果

void close() // 关闭资源

通过实现上面四个接口方法进行解析并返回数据;

流程: flinkx平台会配置很多定时任务,每一个定时任务配置一个job,这个job可以指定对应的文件名称及路径正则,然后获取到文件后,将文件io流

调用java程序的那4个方法,去执行。 当调用open方法时,会先使用serviceload机制通过文件名正则去判断并获取到对应的解析类。

每一种类型文件都有一个唯一的文件名正则。每一种类型格式的文件都会配置对应的字段和截取字段的长度或者分隔符到配置文件中,以及文件编码。

文件头字段 + 记录行字段  + 文件尾字段

还有监控告警功能, 对文件头和尾是否存在校验, 行字段个数校验,总条数校验等

,每解析完成一个文件无论解析是否成功都发送一条kafka消息给nifi平台落到表里面做监控告警

写了很多通用的解析类,还有一些单独处理的解析类。

4 遇到的问题及处理: 每条数据都需要生成一个自增18位长度的id, 刚开始使用了时间戳生成,但是多进程并发情况下会产生重复id;

 后来用redis实现了唯一自增id; 不过单独用redis成本高且不易维护风险大。后面使用了java原生代码--雪花算法生成。

基于雪花算法做了一些改造,因为公司服务器有几百上千台,并且将java程序打包嵌入到flinkx平台会启动多个任务同时执行,多进程运行。

此时建立了两张表, 一张服务器信息表: 记录服务器域名, 编号字段(每台服务器对应一个自增数字的编号)

进程表: 服务器域名字段,进程编号字段(从1开始递增,超过128则重置为1),因为同一台服务器进程数预估不会超过这个数字

进程编号和服务器编号用做雪花算法的方法参数,

1个符号位 + 41个时间戳位 + 10位的机器编号 + 12位的进程位

具体参考博客: https://www.cnblogs.com/ladeng19/p/17241036.html

用了google重试工具类对http请求以及数据库连接重试,

数据库更新进程表时使用了悲观锁去更新,即每次操作都先  xxx for update  (xxx表示正常的sql)

 

posted @ 2023-03-23 22:28  剑阁丶神灯  阅读(30)  评论(0编辑  收藏  举报