flink批处理读lzo压缩文件

1.概述

因为flink框架读压缩文件支持的格式如下,没有LZO压缩格式,所以需要在源码的基础上做一点添加。这里只是提供一下思路,具体的代码细节还需要自己去敲。

1618974580867-656.png

2. 具体实现

1618985594667-476.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

首先,flink内部读压缩文件,以文件后缀名为key,以压缩类型工厂对象为value组成的Map来 保存 不同的压缩文件对应着不同的解压工厂对象的映射关系。

 

1618986339275-825.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

通过上图可以看到FileInputFormat这个类会将所有的支持的解压缩工厂对象初始化到一个Map中,后续处理压缩文件时,可以直接根据压缩文件的后缀,找到对应的解压缩工厂对象去处理。

所以,要想让他支持LZO压缩格式,我们需要自己写一个lzo的工厂类追加上去即可。

 

<dependency>
    <groupId>org.anarres.lzo</groupId>
    <artifactId>lzo-core</artifactId>
    <version>1.0.5</version>
</dependency>

1618986939206-556.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

因为要支持LZO解压缩,所以要引入lzo的maven依赖,至于为什么要new MyLzopInputStream这个类,主要是因为线上hive用的lzo压缩版本比我引入的lzo依赖要高,

所以,我这里基于LzopInputStream新建了一个类,修改了下它的版本号,使其与线上的lzo压缩版本一致。详细请看后面的描述。

 

1618987584056-286.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

至于修改FIleInputFormat这个类,可以用覆盖的方式,也可以基于现有的重新定义一个类直接修改。我用的第二种方式,复制了FileInputFormat所有代码,类名更改为MyFileInputFormat,

将图中圈出的代码加入。然后我在调用flink读文件的时候,调用自己的MyFileInputFormat即可。

3.lzo版本不兼容问题解决

运行程序,报如下错误:

Compressed with incompatible lzo version: 0x2060 (expected 0x2050)

这个事因为程序希望处理的事2050版本的压缩文件,但实际得压缩文件时2060版本产生的。因为我引入的maven依赖已经是最新的了。

所以这里只能自己来处理了。

  

如上图,需要将0x2050改为0x2060,至于用那种方式,自行选择。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值