Hadoop支持lzo壓縮(版本cdh5.15.1)

參考文章:
https://www.iteblog.com/archives/992.html
https://blog.csdn.net/muyingmiao/article/details/102259663
https://programmer.group/using-lzo-compression-and-supporting-slicing-for-hadoop.html

Hadoop經常用於處理大量的數據,如果期間的輸出數據、中間數據能壓縮存儲,對系統的I/O性能會有提升。綜合考慮壓縮、解壓速度、是否支持split,目前lzo是最好的選擇。LZO(LZO是Lempel-Ziv-Oberhumer的縮寫)是一種高壓縮比和解壓速度極快的編碼,它的特點是解壓縮速度非常快,無損壓縮,壓縮後的數據能準確還原,lzo是基於block分塊的,允許數據被分解成chunk,能夠被並行的解壓。LZO庫實現了許多有下述特點的算法:
  (1)、解壓簡單,速度非常快。
  (2)、解壓不需要內存。
  (3)、壓縮相當地快。
  (4)、壓縮需要64 kB的內存。
  (5)、允許在壓縮部分以損失壓縮速度爲代價提高壓縮率,解壓速度不會降低。
  (6)、包括生成預先壓縮數據的壓縮級別,這樣可以得到相當有競爭力的壓縮比。
  (7)、另外還有一個只需要8 kB內存的壓縮級別。
  (8)、算法是線程安全的。
  (9)、算法是無損的。

一 安裝lzo相關依賴

[root@JD ~]# yum install -y svn ncurses-devel
[root@JD ~]# yum install -y gcc gcc-c++ make cmake
[root@JD ~]# yum install -y openssl openssl-devel svn ncurses-devel zlib-devel libtool 
[root@JD ~]# yum install -y lzo lzo-devel lzop autoconf automake cmake

二 編譯lzo

[hadoop@JD ~]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
[hadoop@JD ~]$ tar -zxvf lzo-2.06.tar.gz
[hadoop@JD ~]$ cd lzo-2.06
[hadoop@JD ~]$ export CFLAGS=-m64
[hadoop@JD ~]$ mkdir compile
[hadoop@JD ~]$ ./configure -enable-shared -prefix=/home/hadoop/app/lzo-2.06/compile
[hadoop@JD ~]$ make &&  make install

三 編譯Hadoop-lzo

下載源碼

wget https://github.com/twitter/hadoop-lzo/archive/master.zip

解壓

[hadoop@JD software]$ unzip -d ~/app/ hadoop-lzo-master.zip

進入解壓後的目錄

[hadoop@JD app]$ cd hadoop-lzo-master/
[hadoop@JD hadoop-lzo-master]$ 

修改此目錄下pom.xml文件

<repositories>
	#添加cloudera倉庫
    <repository>
     <id>cloudera</id>
     <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
    </repository>
  </repositories>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    #因爲用的是cdh的
    <hadoop.current.version>2.6.0-cdh5.15.1</hadoop.current.version>
    <hadoop.old.version>1.0.4</hadoop.old.version>
</properties>

添加環境變量

[hadoop@JD hadoop-lzo-master]$ export CFLAGS=-m64
[hadoop@JD hadoop-lzo-master]$ export CXXFLAGS=-m64

#Modify the actual path for your hadoop
[hadoop@JD hadoop-lzo-master]$ export C_INCLUDE_PATH=/home/hadoop/app/lzo-2.06/compile/include
[hadoop@JD hadoop-lzo-master]$ export LIBRARY_PATH=/home/hadoop/app/lzo-2.06/compile/lib

編譯源碼:

mvn clean package -DskipTests

在這裏插入圖片描述進入target/native/Linux-amd64-64

[hadoop@JD hadoop-lzo-master]$ cd target/native/Linux-amd64-64/
[hadoop@JD Linux-amd64-64]$ mkdir ~/app/hadoop-lzo-files
[hadoop@JD Linux-amd64-64]$ tar -cBf - -C lib . | tar -xBvf - -C ~/app/hadoop-lzo-files
拷貝文件
[hadoop@hadoop-01 hadoop-lzo-files]$ cp ~/app/hadoop-lzo-files/libgplcompression* $HADOOP_HOME/lib/native/

四 修改hadoop配置

vi core-site.xml

修改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.BZip2Codec,
               org.apache.hadoop.io.compress.SnappyCodec,
               com.hadoop.compression.lzo.LzoCodec,
               com.hadoop.compression.lzo.LzopCodec
        </value>
    </property>

  <property>
      <name>io.compression.codec.lzo.class</name>
      <value>com.hadoop.compression.lzo.LzoCodec</value>
  </property>

修改mapred-site.xml配置文件

    <property>
      <name>mapred.compress.map.output</name>
      <value>true</value>
    </property>
 
    <property>
        <name>mapred.map.output.compression.codec</name>
        <value>com.hadoop.compression.lzo.LzoCodec</value>
    </property>
 
    <property>
        <name>mapred.child.env</name>
        <value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value>
    </property>

五 準備數據

準備一個753M的數據
在這裏插入圖片描述
然後壓縮此文件

lzop -f access.txt

在這裏插入圖片描述

六 wordcount

首先把數據上傳到hdfs

hdfs dfs -put access.txt.lzo /lzo-data/input

文件如下
在這裏插入圖片描述
計算wordcount

hadoop jar \
/home/hadoop/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.15.1.jar \
wordcount \
-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat \
/lzo-data/input/access.txt.lzo \
/lzo-data/output3

從下圖可以看出,沒有分片
在這裏插入圖片描述

七 文件添加index

hadoop jar \
/home/hadoop/app/hadoop-lzo-master/target/hadoop-lzo-0.4.21-SNAPSHOT.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer  \
/lzo-data/input/access.txt.lzo

在這裏插入圖片描述
再次計算wordcount

hadoop jar \
/home/hadoop/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.15.1.jar \
wordcount \
-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat \
/lzo-data/input/access.txt.lzo \
/lzo-data/output4

從下圖,我們可以看出分成3個
在這裏插入圖片描述

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