在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上使用压缩也有两个比较麻烦的地方:第一,有些压缩格式不能被分块,并行的处理,比如gzip。第二,另外的一些压缩格式虽然支持分块处理,但是解压的过程非常的缓慢,使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的未经过压缩的数据来进行对比:

压缩格式 文件 大小(GB) 压缩时间 解压时间 None some_logs 8.0 - - Gzip some_logs.gz 1.3 241 72 LZO some_logs.lzo 2.0 55 35
| 压缩 格式 | 文件 |

压缩格式 文件 大小(GB) 压缩时间 解压时间
None some_logs 8.0 - -
Gzip some_logs.gz 1.3 241 72
LZO some_logs.lzo 2.0 55 35

可以看出,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高效的处理了。

在hadoop集群中安装lzo

要在hadoop中搭建lzo使用环境非常简单:

安装lzop native libraries
例如:sudo yum install lzop lzo2
从如下地址下载 hadooplzo支持到源代码:http://github.com/kevinweil/hadoop-lzo
编译从以上链接checkout下来到代码,通常为:ant compile-native tar
将编译出来到hadoop-lzo-*.jar部署到hadoop集群到各个slave到某个有效目录下,如HADOOOPHOME/lib将以上编译所得到hadoop−lzonativelibbinary部署到集群到某个有效目录下,如HADOOOP_HOME/lib 将以上编译所得到hadoop-lzo native libbinary部署到集群到某个有效目录下,如HADOOOPH​OME/lib将以上编译所得到hadoop−lzonativelibbinary部署到集群到某个有效目录下,如HADOOP_HOME/lib/native/Linux-amd64-64。
将如下配置到 core-site.xml 中:

io.compression.codecs
org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec

io.compression.codec.lzo.class
com.hadoop.compression.lzo.LzoCodec

将如下配置到mapred-site.xml中:

mapred.child.env
JAVA_LIBRARY_PATH=/path/to/your/native/hadoop-lzo/libs

如果想要mapreduce再写中间结果时也使用压缩,可以将如下配置也写入到mapred-site.xml中。

mapred.map.output.compression.codec
com.hadoop.compression.lzo.LzoCodec

如果以上所有操作都成功,那么现在就可以尝试使用lzo了。比如打包一个lzo都压缩文件,如lzo_log文件,上传到hdfs中,然后用以下命令进行测试:
hadoop jar /path/to/hadoop-lzo.jarcom.hadoop.compression.lzo.LzoIndexerhdfs://namenode:9000/lzo_logs

如果要写一个job来使用lzo,可以找一个job,例如wordcount,将当中到TextInputFormat修改为LzoTextInputForma,其他都不用修改,job就能从hdfs上读入lzo压缩文件,进行分布式都分块并行处理。

hadoop中使用lzo压缩算法相关推荐

  1. 7、大数据中常见的文件存储格式以及hadoop中支持的压缩算法

    Hadoop系列文章目录 1.hadoop3.1.4简单介绍及部署.简单验证 2.HDFS操作 - shell客户端 3.HDFS的使用(读写.上传.下载.遍历.查找文件.整个目录拷贝.只拷贝文件.列 ...

  2. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  3. 4种常用压缩格式在hadoop中的应用

    目前在hadoop中用得比较多的有lzo,gzip,snappy,bzip2这4种压缩格式,笔者根据实践经验介绍一下这4种压缩格式的优缺点和应用场景,以便大家在实践中根据实际情况选择不同的压缩格式. ...

  4. hadoop配置支持LZO压缩格式

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 简介 安装lzo lzo并不是linux系统原生支持,所以需要下载安装软件包.这里至少需要安装3个软件包:lzo ...

  5. Zookeeper 在Hadoop中的应用

    Zookeeper 简单介绍 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目.它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集 ...

  6. 数据蒋堂 | Hadoop中理论与工程的错位

    作者:蒋步星 来源:数据蒋堂 校对:林亦霖 本文共1400字,建议阅读6分钟. 本文分析了在Hadoop的设计和实现中的理论问题和工程问题. Hadoop是当前重要的大数据计算平台,它试图摒弃传统数据 ...

  7. hadoop中的序列化与Writable类

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable-class.html,转载请注明源地址. hadoop中自带的org.apache.h ...

  8. 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

    hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...

  9. Hadoop中Context类的作用和Mapper<LongWritable, Text, Text, LongWritable>.Context context是怎么回事【笔记自用】

    问题导读: 1.Context能干什么? 2.你对Context类了解多少? 3.Context在mapreduce中的作用是什么? 下面我们通过来源码,来得到Context的作用: 下面主要对Set ...

最新文章

  1. Chrome之排序问题
  2. MFC 加入背景图片并让控件背景透明
  3. 韩寒:一个产品经理的自我修养
  4. [html] iframe如何自动调整高度?
  5. git简单使用(二)---远程仓库的建立与远程库的克隆
  6. 萌新的Python练习实例100例(一)四个数字组成互不相同且无重复的三位数
  7. ubuntu两个conda安装和切换
  8. 如何识别媒体偏见_面部识别,种族偏见和非洲执法
  9. Jensen不等式简介及推导
  10. 一个QQ盗号木马是这样诞生的(C#)
  11. Android 手机获取Mac地址的方法
  12. autocad.net 画多段线_AutoCAD2016绘制多段线图文教程
  13. unity 图文混排方案
  14. 什么软件可以把真人照片卡通化、动漫化?
  15. QT-QMainWindow布局设置
  16. 编程语言C语言用中文代写方法,C语言中如何输入汉字,C语言乱码详细解答
  17. lv双肩包尺寸对照表_最值得入手的10款LV双肩包包书包图片大全
  18. 阿里巴巴2020年校招开始啦
  19. Windows XP 超级140个技巧
  20. 黑猴子的家:HBase 高可用 HA

热门文章

  1. gnuplot小功能
  2. 计算总成绩和平均成绩
  3. 国产蓝牙耳机哪款值得入手?高性价比游戏低延迟蓝牙耳机推荐
  4. WIn10 1909 Windows Hello 指纹:出现错误,请稍后再试一次
  5. Spire.doc实现对word的操作(包括文字,表格,图片)
  6. 求两个字符串的最大连续公共字串
  7. 红帽6.4版本安装详细步骤
  8. CAD想画得快,你需要看看我的吐槽
  9. 常用语言注释使用格式
  10. libVLC 事件机制