当前位置:   article > 正文

hadoop3.x支持LZO压缩配置_hadoop lzo

hadoop lzo

前提

在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理。这样的特点,就可以让lzo在hadoop上成为一种非常好用的压缩格式。

lzo本身不是splitable的,所以当数据为text格式时,用lzo压缩出来的数据当做job的输入是一个文件作为一个map。但是sequencefile本身是分块的,所以sequencefile格式的文件,再配上lzo的压缩格式,就可实现lzo文件方式的splitable

由于压缩的数据通常只有原始数据的1/4,在HDFS中存储压缩数据,可以使集群能保存更多的数据,延长集群的使用寿命。不仅如此,由于mapreduce作业通常瓶颈都在IO上,存储压缩数据就意味这更少的IO操作,job运行更加的高效。但是,在hadoop上使用压缩也有两个比较麻烦的地方:1) 第一,有些压缩格式不能被分块,并行的处理,比如gzip。

2) 第二,另外的一些压缩格式虽然支持分块处理,但是解压的过程非常的缓慢,使job的瓶颈转移到了cpu上,例如bzip2。

    比如我们有一个1.1GB的gzip文件,该文件 被分成128MB/chunk存储在hdfs上,那么它就会被分成9块。为了能够在mapreduce中并行的处理各个chunk,那么各个mapper之间就有了依赖。而第二个mapper就会在文件的某个随机的byte出进行处理。那么gzip解压时要用到的上下文字典就会为空,这就意味这gzip的压缩文件无法在hadoop上进行正确的并行处理。也就因此在hadoop上大的gzip压缩文件只能被一个mapper来单个的处理,这样就很不高效,跟不用mapreduce没有什么区别了。而另一种bzip2压缩格式,虽然bzip2的压缩非常的快,并且甚至可以被分块,但是其解压过程非常非常的缓慢,并且不能被用streaming来读取,这样也无法在hadoop中高效的使用这种压缩。即使使用,由于其解压的低效,也会使得job的瓶颈转移到cpu上去。

如果能够拥有一种压缩算法,即能够被分块,并行的处理,速度也非常的快,那就非常的理想。这种方式就是lzo。lzo的压缩文件是由许多的小的blocks组成(约256K),使的hadoop的job可以根据block的划分来splitjob。不仅如此,lzo在设计时就考虑到了效率问题,它的解压速度是gzip的两倍,这就让它能够节省很多的磁盘读写,它的压缩比的不如gzip,大约压缩出来的文件比gzip压缩的大一半,但是这样仍然比没有经过压缩的文件要节省20%-50%的存储空间,这样就可以在效率上大大的提高job执行的速度。以下是一组压缩对比数据,使用一个8.0GB的未经过压缩的数据来进行对比:


可以看出,lzo压缩文件会比gzip压缩文件稍微大一些,但是仍然比原始文件要小很多倍,并且lzo文件压缩的速度几乎相当于gzip的5倍,而解压的速度相当于gzip的两倍。lzo文件可以根据blockboundaries来进行分块,比如一个1.1G的lzo压缩文件,那么处理第二个128MBblock的mapper就必须能够确认下一个block的boundary,以便进行解压操作。lzo并没有写什么数据头来做到这一点,而是实现了一个lzoindex文件,将这个文件(foo.lzo.index)写在每个foo.lzo文件中。这个index文件只是简单的包含了每个block在数据中的offset,这样由于offset已知的缘故,对数据的读写就变得非常的快。通常能达到90-100MB/秒,也就是10-12秒就能读完一个GB的文件。一旦该index文件被创建,任何基于lzo的压缩文件就能通过load该index文件而进行相应的分块,并且一个block接一个block的被读取。也因此,各个mapper都能够得到正确的block,这就是说,可以只需要进行一个LzopInputStream的封装,就可以在hadoop的mapreduce中并行高效的使用lzo。如果现在有一个job的InputFormat是TextInputFormat,那么就可以用lzop来压缩文件,确保它正确的创建了index,将TextInputFormat换成LzoTextInputFormat,然后job就能像以前一样正确的运行,并且更加的快。有时候,一个大的文件被lzo压缩过之后,甚至都不用分块就能被单个mapper高效的处理了。

1.hadoop-lzo编译

hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需要依赖hadoop和lzo进行编译,编译步骤如下

  1. Hadoop支持LZO
  2. 0. 环境准备
  3. maven(下载安装,配置环境变量,修改sitting.xml加阿里云镜像)
  4. gcc-c++
  5. zlib-devel
  6. autoconf
  7. automake
  8. libtool
  9. 通过yum安装即可,yum -y install gcc-c++ lzo-devel zlib-devel autoconf automake libtool
  10. 1. 下载、安装并编译LZO
  11. wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
  12. tar -zxvf lzo-2.10.tar.gz
  13. cd lzo-2.10
  14. ./configure -prefix=/usr/local/hadoop/lzo/
  15. make -j 20
  16. make install
  17. 2. 编译hadoop-lzo源码
  18. 2.1 下载hadoop-lzo的源码,下载地址:https://github.com/twitter/hadoop-lzo/archive/master.zip
  19. 2.2 解压之后,修改pom.xml
  20. <hadoop.current.version>3.1.3</hadoop.current.version>
  21. 2.3 声明两个临时环境变量
  22. export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include
  23. export LIBRARY_PATH=/usr/local/hadoop/lzo/lib
  24. 2.4 编译
  25. 进入hadoop-lzo-master,执行maven编译命令
  26. mvn package -Dmaven.test.skip=true
  27. 2.5 进入target,hadoop-lzo-0.4.21-SNAPSHOT.jar 即编译成功的hadoop-lzo组件

网上也有一些编译好的jar包可下载:

https://mvnrepository.com/artifact/com.hadoop.gplcompression/hadoop-lzo?repo=twitter

or 

https://maven.twttr.com/com/hadoop/gplcompression/hadoop-lzo/0.4.20/hadoop-lzo-0.4.20.jar

or 百度网盘: ​​​​​​​ [下载地址​​​​​​​] 提取码 jlpb

2、jar包部署

将编译好后的hadoop-lzo-0.4.20.jar放入集群每个实例的${HADOOP_HOME}/share/hadoop/common/下,

  1. hadoop-3.3.3]$ ll share/hadoop/common
  2. total 8332
  3. -rw-r--r-- 1 hadoop3 hadoop3 4470534 May 10 00:38 hadoop-common-3.3.3.jar
  4. -rw-r--r-- 1 hadoop3 hadoop3 3384543 May 10 00:38 hadoop-common-3.3.3-tests.jar
  5. -rw-r--r-- 1 hadoop3 hadoop3 96468 May 10 00:39 hadoop-kms-3.3.3.jar
  6. -r-------- 1 hadoop3 hadoop3 193831 Aug 7 22:17 hadoop-lzo-0.4.20.jar
  7. -rw-r--r-- 1 hadoop3 hadoop3 166444 May 10 00:39 hadoop-nfs-3.3.3.jar
  8. -rw-r--r-- 1 hadoop3 hadoop3 191511 May 10 00:40 hadoop-registry-3.3.3.jar
  9. drwxr-xr-x 2 hadoop3 hadoop3 4096 May 10 01:44 jdiff
  10. drwxr-xr-x 2 hadoop3 hadoop3 4096 May 10 00:39 lib
  11. drwxr-xr-x 2 hadoop3 hadoop3 4096 May 10 01:44 sources
  12. drwxr-xr-x 3 hadoop3 hadoop3 4096 May 10 01:44 webapps

scp  hadoop-lzo-0.4.20.jar host2:~/tools/hadoop-3.3.3/share/hadoop/common

3、配置压缩文件

让jar包的压缩功能应用到起来. vim core-site.xml

  1. <property>
  2. <name>io.compression.codecs</name>
  3. <value>
  4. org.apache.hadoop.io.compress.GzipCodec,
  5. org.apache.hadoop.io.compress.DefaultCodec,
  6. org.apache.hadoop.io.compress.BZip2Codec,
  7. org.apache.hadoop.io.compress.SnappyCodec,
  8. com.hadoop.compression.lzo.LzoCodec,
  9. com.hadoop.compression.lzo.LzopCodec
  10. </value>
  11. </property>
  12. <property>
  13. <name>io.compression.codec.lzo.class</name>
  14. <value>com.hadoop.compression.lzo.LzoCodec</value>
  15. </property>

同步到集群其他节点: scp  core-site.xml host2:~/tools/hadoop-3.3.3/etc/hadoop

4、启动集群

sbin/stop-dfs.sh、sbin/stop-yarn.sh

sbin/start-dfs.sh、sbin/start-yarn.sh

5、测试

测试wordcount, 看其结果:

  1. hdfs dfs -mkdir /data/wordcount01
  2. hdfs dfs -put README.txt /data/wordcount01
  3. hadoop jar \
  4. share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount \
  5. -Dmapreduce.output.fileoutputformat.compress=true \
  6. -Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec \
  7. /data/wordcount01/README.txt /data/output01/04
  8. hadoop-3.3.3]$ hdfs dfs -ls /data/output01/04
  9. Found 2 items
  10. -rw-r--r-- 2 hadoop3 supergroup 0 2022-08-07 23:41 /data/output01/04/_SUCCESS
  11. -rw-r--r-- 2 hadoop3 supergroup 224 2022-08-07 23:41 /data/output01/04/part-r-00000.lzo
  12. 创建lzo索引:
  13. hadoop-3.3.3]$ hadoop jar share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /data/output01/04/part-r-00000.lzo
  14. hadoop-3.3.3]$ hdfs dfs -ls /data/output01/04
  15. -rw-r--r-- 2 hadoop3 supergroup 0 2022-08-07 23:41 /data/output01/04/_SUCCESS
  16. -rw-r--r-- 2 hadoop3 supergroup 224 2022-08-07 23:41 /data/output01/04/part-r-00000.lzo
  17. -rw-r--r-- 2 hadoop3 supergroup 8 2022-08-07 23:45 /data/output01/04/part-r-00000.lzo.index
  18. 对上面创建了索引的文件再次执行wordcount:
  19. hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount -Dmapreduce.output.fileoutputformat.compress=true -Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec /data/output01/04 /data/output01/05
  20. hadoop-3.3.3]$ hdfs dfs -ls /data/output01/05
  21. Found 2 items
  22. -rw-r--r-- 2 hadoop3 supergroup 0 2022-08-08 10:29 /data/output01/05/_SUCCESS
  23. -rw-r--r-- 2 hadoop3 supergroup 240 2022-08-08 10:29 /data/output01/05/part-r-00000.lzo

LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/519994
推荐阅读
相关标签
  

闽ICP备14008679号