Hadoop配置lzo壓縮

前言

  • 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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章