欢迎投稿

今日深度:

Hadoop之压缩,

Hadoop之压缩,


1 gzip压缩

优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便。

缺点:不支持split。

应用场景:当每个文件压缩之后在130M以内的(1个块大小内),都可以考虑用gzip压缩格式。譬如说一天或者一个小时的日志压缩成一个gzip文件,运行mapreduce程序的时候通过多个gzip文件达到并发。hive程序,streaming程序,和java写的mapreduce程序完全和文本处理一样,压缩之后原来的程序不需要做任何修改。

2 lzo压缩

优点:压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;可以在linux系统下安装lzop命令,使用方便。

缺点:压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)。

应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越越明显。

3 snappy压缩

优点:高速压缩速度和合理的压缩率;支持hadoop native库。

缺点:不支持split;压缩率比gzip要低;hadoop本身不支持,需要安装;linux系统下没有对应的命令。

应用场景:当mapreduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式;或者作为一个mapreduce作业的输出和另外一个mapreduce作业的输入。

4 bzip2压缩

优点:支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便。

缺点:压缩/解压速度慢;不支持native。

应用场景:适合对速度要求不高,但需要较高的压缩率的时候,可以作为mapreduce作业的输出格式;或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。

最后用一个表格比较上述4种压缩格式的特征(优缺点):

4种压缩格式的特征的比较
压缩格式 split native 压缩率 速度 是否hadoop自带 linux命令 换成压缩格式后,原来的应用程序是否要修改
gzip 很高 比较快 是,直接使用 和文本处理一样,不需要修改
lzo 比较高 很快 否,需要安装 需要建索引,还需要指定输入格式
snappy 比较高 很快 否,需要安装 没有 和文本处理一样,不需要修改
bzip2 最高 是,直接使用 和文本处理一样,不需要修改


lzo压缩默认的是不支持切分的,也就是说,如果直接把lzo文件当作Mapreduce任务的输入,那么Mapreduce只会用一个Map来处理这个输入文件,这显然不是我们想要的。其实我们只需要对lzo文件建立索引,这样这个lzo文件就会支持切分,也就可以用多个Map来处理lzo文件。我们可以用 《Hadoop 2.2.0安装和配置lzo》 文章中编译的hadoop-lzo-0.4.20-SNAPSHOT.jar包来对lzo文件建立索引(假如在/home/wyp/input目录下有个cite.txt.lzo文件,这个目录是在HDFS上):

1 $ $HADOOP_HOMOE/bin/hadoop jar                 
2                  $HADOOP_HOMOE/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
3                  com.hadoop.compression.lzo.DistributedLzoIndexer
4                  /home/wyp/input/cite.txt.lzo

生成出来的索引文件后缀为.index,并存放在lzo同一目录下.在本例中产生的索引文件是存放在/home/wyp/input目录下,名称为cite.txt.lzo.index。

我们也可以用下面的方法对lzo文件来建立索引:

1 $ $HADOOP_HOMOE/bin/hadoop jar                 
2               $HADOOP_HOMOE/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
3               com.hadoop.compression.lzo.LzoIndexer
4               /home/wyp/input/cite.txt.lzo

这个方法和上面方法产生出来的索引文件是一样的;但是上面的方法是通过启用Mapreduce任务来执行的,而这里的方法只在一台客户机上运行,效率很慢!

那么,如何在Mapreduce任务中使用lzo文件。下面分别对Mapreduce程序、Streaming程序以及Hive分别进行说明:

1、对于Mapreduce程序,我们需要把程序中所有的TextInputFormat修改为LzoTextInputFormat,如下:
1 job.setInputFormatClass(TextInputFormat.class);
2  
3 修改为
4  
5 job.setInputFormatClass(LzoTextInputFormat.class);

LzoTextInputFormat类需要引入相应的包,如果你是使用pom文件,可以引入以下依赖:

1 <dependency>
2             <groupId>com.hadoop.gplcompression</groupId>
3             <artifactId>hadoop-lzo</artifactId>
4             <version>0.4.19</version>
5 </dependency>

如果你的输入格式不是LzoTextInputFormat类,那么Mapreduce程序将会把.index文件也当作是数据文件!修改完之后,需要重新编译你的Mapreduc程序。这样在运行Mapreduce程序的时候,将lzo文件所在的目录当作输入即可,Mapreduce程序会识别出.index文件的:

1 $ /home/q/hadoop-2.2.0/bin/hadoop jar
2                                   statistics2.jar com.wyp.Sts
3                                   -Dmapreduce.job.queuename=queue1
4                                   /home/wyp/input
5                                   /home/wyp/resluts
2、对于Streaming程序来说,可以通过-inputformat指定输入的文件格式,使用如下:
1 $ bin/hadoop jar
2              $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
3              -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
4              -input /home/wyp/input
5              -output /home/wyp/results
6              -mapper /bin/cat
7              -reducer wc
对应Streaming作业还需要注意的是,使用DeprecatedLzoTextInputFormat输入格式,会把文本的行号当作key传送到reduce的,所以我们需要将行号去掉,可以用下面方法实现:

1 $ bin/hadoop jar
2              $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
3              -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
4              -input /home/wyp/input
5              -D stream.map.input.ignoreKey=true
6              -output /home/wyp/results
7              -mapper /bin/cat
8              -reducer wc
3、对于Hive,需要在建表的时候注意,如下:
1 hive> create table lzo(
2     > id int,
3     > name string)
4     > STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
5     > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
6 OK
7 Time taken: 3.423 seconds

注意4,5行代码。这样就可以使用lzo文件了,并支持分割。

Snappy是用C++开发的压缩和解压缩开发包,旨在提供高速压缩速度和合理的压缩率。Snappy比zlib更快,但文件相对要大20%到100%。在64位模式的Core i7处理器上,可达每秒250~500兆的压缩速度。
  Snappy的前身是Zippy。虽然只是一个数据压缩库,它却被Google用于许多内部项目程,其中就包括BigTable,MapReduce和RPC。Google宣称它在这个库本身及其算法做了数据处理速度上的优化,作为代价,并没有考虑输出大小以及和其他类似工具的兼容性问题。Snappy特地为64位x86处理器做了优化,在单个Intel Core i7处理器内核上能够达到至少每秒250MB的压缩速率和每秒500MB的解压速率。
  如果允许损失一些压缩率的话,那么可以达到更高的压缩速度,虽然生成的压缩文件可能会比其他库的要大上20%至100%,但是,相比其他的压缩库,Snappy却能够在特定的压缩率下拥有惊人的压缩速度,“压缩普通文本文件的速度是其他库的1.5-1.7倍,HTML能达到2-4倍,但是对于JPEG、PNG以及其他的已压缩的数据,压缩速度不会有明显改善”。
  这篇文章主要是用来介绍如何给Hadoop集群中添加Snappy解压缩库。

  一、安装snappy

1 yum install snappy snappy-devel

  二、使得Snappy类库对Hadoop可用

1 ln -sf /usr/lib64/libsnappy.so /usr/lib/hadoop/lib/native/.

  三、 在$HADOOP_HOME/etc/hadoop/core-site.xml文件中加入snappy配置

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     </value>
9 </property>

下面是配置在map的输出启用压缩

1 <property>
2     <name>mapreduce.map.output.compress</name>
3     <value>true</value>
4 </property>
5  
6 <property>
7     <name>mapreduce.map.output.compress.codec</name>
8     <value>org.apache.hadoop.io.compress.SnappyCodec</value>
9 </property>

  四、重新启动hadoop的相关进程,使得上面的配置生效

  如果你要在Mapreduce程序里面使用Snappy相关类库,可以用下面的方法实现

01 ...
02  
03 Configuration conf = new Configuration();
04  
05 //对map输出的内容进行压缩
06 conf.set("mapred.compress.map.output","true");
07 conf.set("mapred.map.output.compression.codec",
08                       "org.apache.hadoop.io.compress.SnappyCodec");
09  
10 //对reduce输出的内容进行压缩
11 conf.set("mapred.output.compress","true");
12 conf.set("mapred.output.compression",
13                      "org.apache.hadoop.io.compress.SnappyCodec");
14  
15 ...

本博客文章除特别声明,全部都是原创!

尊重原创,转载请注明: 转载自过往记忆(http://www.iteblog.com/)
本文链接地址: 《给Hadoop集群中添加Snappy解压缩库》(http://www.iteblog.com/archives/966)



www.htsjk.Com true http://www.htsjk.com/Hadoop/41150.html NewsArticle Hadoop之压缩, 1 gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带...
相关文章
    暂无相关文章
评论暂时关闭