Hadoop配置lzo压缩

20 篇文章 0 订阅
7 篇文章 0 订阅

前言

  • OS:CentOS 7
  • hadoop:2.7.7
  • lzo:lzo-2.10
  • Apache Maven:3.6.0
  • JDK:1.8.0_221
  • hadoop-lzo是一个围绕lzo压缩算法实现的Maven项目,基于hadoop提供的API实现了lzo压缩算法的编解码器,以及其他的一些自定义hadoop组件,本文主要演示如何编译此Git项目,并配置到hadoop集群中,实现lzo算法在集群中的使用
  • 由于Hadoop和hadoop-lzo中目前都未集成lzo算法函数库,因此在编译hadoop-lzo项目之前需要保证lzo依赖库正确安装,参考博客:Linux之配置lzo压缩
  • 如果不想自行编译的可以直接去 mvnrepository 下载已经编译好的jar包,如:hadoop-lzo-0.4.20.jar,然后从步骤三开始配置即可

安装步骤

一、下载hadoop-lzo项目源码

hadoop-lzo项目源码地址:GitHub

hadoop-lzo压缩包下载地址: https://github.com/twitter/hadoop-lzo/archive/master.zip


二、编译源码

1)解压压缩包
unzip hadoop-lzo-master.zip -d /opt/module
2)修改pom.xml部分属性

进入hadoop-lzo解压路径下,修改pom.xml文件,找到properties标签,修改hadoop.current.version变量值,将其设置为当前hadoop版本号

cd /opt/module/hadoop-lzo-master/
vim pom.xml
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hadoop.current.version>2.7.7</hadoop.current.version><!-- 此值设置为当前hadoop版本号 -->
    <hadoop.old.version>1.0.4</hadoop.old.version>
  </properties>
3)设置编译相关变量
# 设置lzo编译后生成的include文件夹路径
export C_INCLUDE_PATH=/opt/module/lzo-2.10-compiled/include
# 设置lzo编译后生成的lib文件夹路径
export LIBRARY_PATH=/opt/module/lzo-2.10-compiled/lib
4)编译Maven项目
mvn clean package -Dmaven.test.skip=true

三、配置Hadoop支持lzo

1)复制添加jar包

将编译生成的target文件夹下的hadoop-lzo-0.4.21-SNAPSHOT.jar文件复制到$HADOOP_HOME/share/hadoop/common路径下

cp hadoop-lzo-0.4.21-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common

PS:记得同步集群中$HADOOP_HOME/share/hadoop/common文件夹中的hadoop-lzo-0.4.21-SNAPSHOT.jar文件

2)设置读取压缩文件时使用的编解码器

修改配置文件$HADOOP_HOME/etc/hadoop/core-site.xml,在configuration标签中,添加如下配置,然后同步集群的core-site.xml配置文件

    <!-- 配置使用的各种压缩算法的编/解码器 -->
    <property>
        <name>io.compression.codecs</name>
        <value>
            org.apache.hadoop.io.compress.GzipCodec,
            org.apache.hadoop.io.compress.DefaultCodec,
            org.apache.hadoop.io.compress.DeflateCodec,
            org.apache.hadoop.io.compress.BZip2Codec,
            org.apache.hadoop.io.compress.SnappyCodec,
            org.apache.hadoop.io.compress.Lz4Codec,
            com.hadoop.compression.lzo.LzoCodec,
            com.hadoop.compression.lzo.LzopCodec
        </value>
        <description>
            A comma-separated list of the compression codec classes that can
            be used for compression/decompression. In addition to any classes specified
            with this property (which take precedence), codec classes on the classpath
            are discovered using a Java ServiceLoader.
        </description>
    </property>

    <!-- 配置lzo编解码器相关参数 -->
    <property>
        <name>io.compression.codec.lzo.class</name>
        <value>com.hadoop.compression.lzo.LzoCodec</value>
    </property>
3)开启mapreduce压缩功能

启动mapreduce压缩功能,并设置成最终输出文件使用lzo压缩。在mapred-site.xml文件中的configuration标签中添加如下配置,然后同步集群中此配置文件:

PS:若mapreduce.output.fileoutputformat.compress.codec参数设置为com.hadoop.compression.lzo.LzoCodec,则MR输出文件为.lzo_deflate,若此参数设置为com.hadoop.compression.lzo.LzopCodec,则MR输出文件为.lzo,只有.lzo压缩文件才支持建立索引,支持建立lzo索引,进而支持压缩文件分片

    <!-- 以下是关于压缩功能的相关配置 -->

    <!-- map输出是否压缩 -->
    <!-- 默认值:false -->
    <property>
        <name>mapreduce.map.output.compress</name>
        <value>true</value>
        <description>
            Should the outputs of the maps be compressed before being
            sent across the network. Uses SequenceFile compression.
        </description>
    </property>
    <!-- 设置map输出压缩所使用的对应压缩算法的编解码器,此处使用snappy压缩,如果未配置snappy则使用lzo压缩 -->
    <!-- 默认值:org.apache.hadoop.io.compress.DefaultCodec -->
    <property>
        <name>mapreduce.map.output.compress.codec</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
        <description>
            If the map outputs are compressed, how should they be compressed?
        </description>
    </property>
    <!-- 设置job最终输出文件是否压缩 -->
    <!-- 默认值:false -->
    <property>
        <name>mapreduce.output.fileoutputformat.compress</name>
        <value>true</value>
        <description>Should the job outputs be compressed?
        </description>
    </property>
    <!-- 设置job最终输出文件所使用的压缩算法对应的编解码器,此处使用lzo压缩,结果文件会以lzo结尾 -->
    <!-- 默认值:org.apache.hadoop.io.compress.DefaultCodec -->
    <property>
        <name>mapreduce.output.fileoutputformat.compress.codec</name>
        <value>com.hadoop.compression.lzo.LzopCodec</value>
        <description>If the job outputs are compressed, how should they be compressed?
        </description>
    </property>
    <!-- 设置序列文件的压缩格式,建议设置成BLOCK -->
    <!-- 默认值:RECORD -->
    <property>
        <name>mapreduce.output.fileoutputformat.compress.type</name>
        <value>BLOCK</value>
        <description>If the job outputs are to compressed as SequenceFiles, how should
               they be compressed? Should be one of NONE, RECORD or BLOCK.
        </description>
    </property>
4)测试是否开启lzo压缩

创建文本文件 SteveJobs_speech.txt 作为wordcount程序输入文件,其中内容如下:

And that is as true for your work as it is for your lovers. Your work is going to fill a
large part of your life, and the only way to be truly satisfied is to do what you believe
is great work. And the only way to do great work is to love what you do. If you haven't
found it yet, keep looking. Don't settle. As with all matters of the heart, you'll know
when you find it. And, like any great relationship, it just gets better and better as
the years roll on. So keep looking until you find it. Don't settle.

将文本文件上传至hdfs中

hadoop fs -mkdir -p /tmp/data/input /tmp/data/output
hadoop fs -put -f SteveJobs_speech.txt /tmp/data/input

调用hadoop自带的wordcount程序

hadoop fs -rm -R /tmp/data/output/wordcount && \
hadoop jar \
/opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar \
wordcount /tmp/data/input/SteveJobs_speech.txt /tmp/data/output/wordcount

观察hdfs中的输出文件,是否以lzo结尾

hadoop fs -ls /tmp/data/output/wordcount
[tomandersen@hadoop101 /]$ hadoop fs -ls /tmp/data/output/wordcount
Found 2 items
-rw-r--r--   1 tomandersen supergroup          0 2020-06-11 11:17 /tmp/data/output/wordcount/_SUCCESS
-rw-r--r--   1 tomandersen supergroup        460 2020-06-11 11:17 /tmp/data/output/wordcount/part-r-00000.lzo

若生成结果为lzo结尾的压缩文件,则表明lzo压缩算法配置成功。也可以使用lzop工具进行解压输出文件,验证其中的具体内容是否正确


四、建立文件索引,支持lzo压缩文件分片

对于lzo压缩文件,MR Job默认是不会对其进行分片的,即最小分片大小只能是hdfs-site.xml文件中设置的块大小。通过此工程中提供的Java程序能够为指定的hdfs中的lzo压缩文件建立索引,同时配合其提供的com.hadoop.mapreduce.LzoTextInputFormat(新)或com.hadoop.mapred.DeprecatedLzoTextInputFormat(旧),可以实现大型lzo压缩文件的读取时分片(默认处理压缩文件时无法分片)。

PS:只有.lzo文件支持建立索引,然后读取时分片,.lzo_deflate文件不支持建立索引。

1)针对指定lzo压缩文件,建立lzo索引文件

假设大型lzo压缩文件为/tmp/data/input/big_file.lzo,大小为1GB,则建立lzo索引命令如下:

hadoop jar \
/opt/module/hadoop-2.7.7/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer \
/tmp/data/input/big_file.lzo

运行结束后,会在相同路径下生成big_file.lzo.index文件

2)基于LzoTextInputFormat和lzo索引,实现读取lzo压缩文件时分片

此处以wordcount程序为例,在提交MR Job时,设置InputFormat为LzoTextInputFormat,实现读取文件时分片

hadoop fs -rm -R /tmp/data/output/wordcount && \
hadoop jar \
/opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar \
wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat \
/tmp/data/input/big_file.lzo /tmp/data/output/wordcount

End~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值