分类:
2010-09-09 13:36:56
hadoop中支持的压缩方式有多种,比如Gzip,bzip2,zlib等,其中Gzip是hadoop中内置就支持的一种压缩方式,这种压缩方式在平 时的开发人员和员中使用的比较广泛,压缩比也比较高,压缩速度也还不 错,所以很多人都喜欢第一趋向于使用这种压缩格式进行的压缩。
在hadoop中,要在mapreduce 的job中使用gzip压缩是比较容易的,不记得是从哪个版本开始,hadoop就内置了使用gzip压缩格式读取输入文件,写中间结果和输出结果的支 持。
要在hadoop的mapreduce中使用gzip非常简单,分为以下几种情况:
以下是使用hadoop-0.19.1对一个11358 Byte的文件进行三种方式的压缩的对比:
HDFS bytes read | HDFS bytes written | Local bytes read | Local bytes written | |
Map | 13872 | 0 | 0 | 9922 |
Reduce | 0 | 6117 | 9860 | 9860 |
Total | 13872 | 6117 | 9860 | 19782 |
HDFS bytes read | HDFS bytes written | Local bytes read | Local bytes written | |
Map | 13872 | 0 | 0 | 9922 |
Reduce | 0 | 2663 | 9860 | 9860 |
Total | 13872 | 2663 | 9860 | 19782 |
HDFS bytes raed | HDFS bytes written | Local bytes read | Local bytes written | |
Map | 13872 | 0 | 0 | 4221 |
Reduce | 0 | 2663 | 3623 | 3423 |
Total | 13872 | 2663 | 3623 | 7844 |
因此我们可以看到,在hadoop中使用gzip压缩来进行读取,中间结果,数据结果的保存都是非常的容易,因为hadoop native本身就提供了我们相应的类来解析和压缩数据。不过这里要特别提到的是:gzip压缩格式在hadoop中的支持有一定的局限性: 由于gzip压缩算法本身的原因,我们无法对gzip压缩文件进行分块,也就是说,在hadoop中,如果想要用hadoop 的mapreduce来处理数据,没一个mapper就必须对应一个gz文件,不能多个mapper对一个gzip文件的多个chunk进行并行的处理, 因此如果要在hadoop mapreduce任务中使用gzip,在数据处理之前就需要对数据进行认为的切分,让一个mapper来处理一块数据。这样其实有一点有违 mapreduce的本质。