【Hadoop|hadoop-2.6.0-cdh-5.15.1 使用lzo压缩 安装及测试】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)、算法是无损的。
来源: https://www.iteblog.com/archives/992.html
这里至少需要安装3个软件包:lzo, lzop, hadoop-gpl-packaging。gpl-packaging的作用主要是对压缩的lzo文件创建索引,否则的话,无论压缩文件是否大于hdfs的block大小,都只会按照默认启动2个map操作
1.安装依赖包
[root@hadoop001 ~]# yum -y installlzo-develzlib-develgcc autoconf automake libtool
2.安装lzo
#解压
[root@hadoop001 software]# tar -zxvf lzo-2.10.tar.gz -C /root/source
#配置 编译安装
[root@hadoop001 lzo-2.10]#./configure -enable-shared -prefix=/usr/local/hadoop/lzo/
[root@hadoop001 lzo-2.10]#make &&make install#查看 /usr/local/hadoop/lzo
[root@hadoop001 lzo]# ll
total 0
drwxr-xr-x 3 root root16 Oct8 19:52 include
drwxr-xr-x 3 root root 114 Oct8 19:52 lib
drwxr-xr-x 3 root root16 Oct8 19:52 share
[root@hadoop001 lzo]#
- 注: 将/usr/local/hadoop/lzo目录下的所有文件打包,并同步到集群中的所有机器上
3,安装 lzop
#下载
[root@hadoop001 software]#wget http://www.lzop.org/download/lzop-1.04.tar.gz
[root@hadoop001 software]# tar -zxvf lzop-1.04.tar.gz -C /root/source
#配置 编译安装
[root@hadoop001 lzop-1.04]#./configure -enable-shared -prefix=/usr/local/hadoop/lzop/
[root@hadoop001 lzop-1.04]#make &&make install
4. 安装 Hadoop-LZO
#下载
[root@hadoop001 software]# wget https://github.com/twitter/hadoop-lzo/archive/master.zip
#解压
[root@hadoop001 software]# unzip master.zip
- hadoop-lzo中的pom.xml依赖了hadoop2.6.4,视自己环境而定,hadoop版本修改为2.6.0:
UTF-8
2.6.4
1.0.4
#进入 目录 依次执行 一下命令
[root@hadoop001 hadoop-lzo-master]# export CFLAGS=-m64
[root@hadoop001 hadoop-lzo-master]# export CXXFLAGS=-m64
[root@hadoop001 hadoop-lzo-master]#export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include
[root@hadoop001 hadoop-lzo-master]# export LIBRARY_PATH=/usr/local/hadoop/lzo/lib
[root@hadoop001 hadoop-lzo-master]# mvn clean package -Dmaven.test.skip=true[root@hadoop001 hadoop-lzo-master]#cd target/native/Linux-amd64-64
[root@hadoop001 Linux-amd64-64]# tar -cBf - -C lib . | tar -xBvf - -C ~
./
./libgplcompression.so.0.0.0
./libgplcompression.so.0
./libgplcompression.so
./libgplcompression.la
./libgplcompression.a其中libgplcompression.so和libgplcompression.so.0是链接文件,指向libgplcompression.so.0.0.0,
将刚刚生成的libgplcompression*和target/hadoop-lzo-0.4.18-SNAPSHOT.jar同步到集群中的所有机器对应的目录。
[root@hadoop001 ~]#cp ~/libgplcompression* $HADOOP_HOME/lib/native/ #到 /root/software/hadoop-lzo-master/target
[root@hadoop001 hadoop-lzo-master]# cd target
[root@hadoop001 target]# cp hadoop-lzo-0.4.21-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/
5 Hadoop配置
- hadoop-env.sh修改
#增加
export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib
- core-site.xml 新增压缩配置
io.compression.codecs
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.BZip2Codec
io.compression.codec.lzo.class
com.hadoop.compression.lzo.LzoCodec
- mapred-site.xml 配置
mapred.compress.map.output
true
mapred.map.output.compression.codec
com.hadoop.compression.lzo.LzoCodec
mapred.child.env
LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib
- 将配置分发到集群的每台机器上 重启Hadoop
#压缩测试文件
[hadoop@hadoop001 data]$ lzop test.txt
[hadoop@hadoop001 data]$ ll
total 14160
-rw-r--r-- 1 hadoop hadoop46 Oct8 21:47 test.txt
-rw-r--r-- 1 hadoop hadoop100 Oct8 21:47 test.txt.lzo
#上传到hdfs
[hadoop@hadoop001 data]$ hadoop fs -put test.txt.lzo /data
#使用自带的wordcount测试
hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.15.1.jar wordcount /data/test.txt.lzo outdata/lzo1
#不支持分片:
19/10/08 22:03:17 INFO mapreduce.JobSubmitter: number of splits:1
- 创建lzo文件索引
[hadoop@hadoop001 mapreduce]$ hadoop jar $HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.LzoIndexer /data/test.txt.lzo
[hadoop@hadoop001 mapreduce]$ hadoop fs -ls /data
Found 2 items
-rw-r--r--1 hadoop supergroup100 2019-10-08 21:55 /data/test.txt.lzo
-rw-r--r--1 hadoop supergroup8 2019-10-08 22:17 /data/test.txt.lzo.index
- 外部指定 输出压缩格式 -D
[hadoop@hadoop001 mapreduce]$hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.15.1.jar wordcount \
-D mapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat \
-D mapred.output.compress=true \
-D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \/data/test.txt.lzo outdata/lzo3
[hadoop@hadoop001 mapreduce]$ hadoop fs -ls /user/hadoop/outdata/lzo3
Found 2 items
-rw-r--r--1 hadoop supergroup0 2019-10-08 22:34 /user/hadoop/outdata/lzo3/_SUCCESS
-rw-r--r--1 hadoop supergroup70 2019-10-08 22:34 /user/hadoop/outdata/lzo3/part-r-00000.lzo
总结
- lzo 不支持分片时,不论多大都只有一个 map处理 耗费时间
- lzo 支持分片时 即创建文件索引,要合理控制生成的lzo大小,不要超过一个block大小,好处是文件大小不受限制,可以将文件设置的稍微大点,这样有利于减少文件数目。但是生成lzo.index文件虽然占空间不大但也本身需要开销
- 如若不在代码中指定 job.setInputFormatClass(LzoTextInputFormat.class); 则Mapreduce程序将会把索引文件.index也当作是数据文件
推荐阅读
- StarRocks|使用StarRocks内置工具Routine Load同步Mysql/TiDB/PG等增量更新数据到StarRocks
- Hadoop|Hadoop之Flume采集文件到hdfs
- 思普大数据技术|Hadoop生态之Hadoop体系架构(一)
- 笔记|nfs网络文件系统
- #|Spark Streaming与流处理
- 笔记|hadoop核心组件——HDFS系列讲解之HDFS其他功能介绍
- 笔记|hadoop核心组件——HDFS系列讲解之HDFS基本介绍
- 笔记|hadoop核心组件——HDFS系列讲解之HDFS的高级使用命令
- 大数据技术栈|(七)Hadoop 3.3.0学习——HDFS