參考文章:
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個