1.概述
因为flink框架读压缩文件支持的格式如下,没有LZO压缩格式,所以需要在源码的基础上做一点添加。这里只是提供一下思路,具体的代码细节还需要自己去敲。
2. 具体实现
首先,flink内部读压缩文件,以文件后缀名为key,以压缩类型工厂对象为value组成的Map来 保存 不同的压缩文件对应着不同的解压工厂对象的映射关系。
通过上图可以看到FileInputFormat这个类会将所有的支持的解压缩工厂对象初始化到一个Map中,后续处理压缩文件时,可以直接根据压缩文件的后缀,找到对应的解压缩工厂对象去处理。
所以,要想让他支持LZO压缩格式,我们需要自己写一个lzo的工厂类追加上去即可。
<dependency> <groupId>org.anarres.lzo</groupId> <artifactId>lzo-core</artifactId> <version>1.0.5</version> </dependency>
因为要支持LZO解压缩,所以要引入lzo的maven依赖,至于为什么要new MyLzopInputStream这个类,主要是因为线上hive用的lzo压缩版本比我引入的lzo依赖要高,
所以,我这里基于LzopInputStream新建了一个类,修改了下它的版本号,使其与线上的lzo压缩版本一致。详细请看后面的描述。
至于修改FIleInputFormat这个类,可以用覆盖的方式,也可以基于现有的重新定义一个类直接修改。我用的第二种方式,复制了FileInputFormat所有代码,类名更改为MyFileInputFormat,
将图中圈出的代码加入。然后我在调用flink读文件的时候,调用自己的MyFileInputFormat即可。
3.lzo版本不兼容问题解决
运行程序,报如下错误:
Compressed with incompatible lzo version: 0x2060 (expected 0x2050)
这个事因为程序希望处理的事2050版本的压缩文件,但实际得压缩文件时2060版本产生的。因为我引入的maven依赖已经是最新的了。
所以这里只能自己来处理了。
如上图,需要将0x2050改为0x2060,至于用那种方式,自行选择。