1.概述

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

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop

2. 具体实现

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_02

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_03

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

 

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_04

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_03

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

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

 


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


spark 跨节点读取linux 本地文件 spark读取lzo文件_flink_06

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_03

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

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

 

spark 跨节点读取linux 本地文件 spark读取lzo文件_flink_08

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_03

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

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

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

运行程序,报如下错误:

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

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

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

 

spark 跨节点读取linux 本地文件 spark读取lzo文件_hadoop_10

 

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