[经验案例] 如何在MRS服务中使用LZO压缩算法

LZO是一种非常高效的压缩算法,相比其它Hadoop支持的压缩算法,它提供极高的解压缩速度,且解压缩速度不受压缩比影响,对压缩包制作索引以后支持文件分片操作,非常适合用于hadoop的分布式处理场景。但由于其开源License问题,MRS和开源Hadoop一样,并没有默认集成hadoop-lzo。下面,我给大家分享一下如何手动编译lzo并用于mapreduce分布式计算框架。


环境准备

准备一个绑定了EIP(弹性公网IP)的Euler 2.2操作系统的ECS,用于编译hadoop-lzo包。我在操作时直接使用了MRS集群的一个Master节点作为编译环境,如果你的MRS集群是生产环境,不建议这样操作。节点准备好以后,执行以下操作:

1.  安装gcc。用于编译lzo native library。

yum install gcc

2. 下载maven,并解压到/opt目录下。用于编译hadoop-lzo。

下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

解压后指定JAVA_HOME路径,并将maven的bin目录添加到PATH环境变量。

export JAVA_HOME=/opt/client/JDK/jdk/
export PATH=/opt/apache-maven-3.6.1/bin:$PATH


安装lzo

  1. 下载lzo包 (例如下载2.10版本),并解压到/opt/lzo目录下

    下载地址: http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz

  2. 编译安装

./configure --enable-shared --prefix /usr/local/lzo-2.10
make && sudo make install

    

下载hadoop-lzo并编译

  1. 下载hadoop-lzo,并解压到/opt/lzo目录下

    下载地址:https://github.com/twitter/hadoop-lzo/tree/release-0.4.20

  2. 添加lzo环境变量

export C_INCLUDE_PATH=/usr/local/lzo-2.10/include
export LIBRARY_PATH=/usr/local/lzo-2.10/lib

   3. 执行编译。这一步需要从公网下载依赖的jar包,根据网络情况,可能需要几分钟到几十分钟不等。建议给EIP分配一个较大的带宽以节省时间,华为云入网流量不收费。

mvn  clean package -Dmaven.javadoc.skip=true


编译后,得到hadoop-lzo-0.4.20.jar包,路径如下:/opt/lzo/hadoop-lzo/hadoop-lzo-release-0.4.20/target/hadoop-lzo-0.4.20.jar



运行MapReduce作业

以wordcount作业为例,

通过-libjars添加编译得到的hadoop-lzo-0.4.20.jar包。

通过“-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat”参数指定LzoTextInputFormat作为作业的imputformat。

通过“-Dio.compression.codecs=com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec”添加lzo压缩算法类。

完整命令如下:

hadoop jar /opt/client/HDFS/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1-mrs-2.0.jar wordcount -libjars /opt/lzo/hadoop-lzo/hadoop-lzo-release-0.4.20/target/hadoop-lzo-0.4.20.jar -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat -Dio.compression.codecs=com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec /tmp/lzoinput /tmp/output


修改客户端配置

修改客户端配置文件/opt/client/HDFS/hadoop/etc/hadoop/core-site.xml,方便在hdfs dfs -text等命令中浏览lzo压缩包中的内容。

在io.compression.codecs配置项中添加

com.hadoop.compression.lzo.LzoCodec

com.hadoop.compression.lzo.LzopCodec

修改后配置项完整内容如下:

io.compression.codecsorg.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.Lz4Codec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.GzipCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec


修改后,可以直接使用如下命令查看lzo压缩包中的内容

hdfs dfs -text hdfs://hacluster/tmp/lzoinput/a-13563.lzo


在Hive中使用LZO压缩算法

可以参考官方给出的配置方法:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO

亲测在MRS集群中也同样适用。

但需要注意一点,如果你的表压缩文件是lzo_deflate格式的,建表时指定“STORED AS INPUTFORMAT”一定要是hadoop自带的“org.apache.hadoop.mapred.TextInputFormat”,而不是上述官方指导中给出的"com.hadoop.mapred.DeprecatedLzoTextInputFormat"。