我们已经意识到有点为时已晚,在gzip格式Hadoop的处理归档我们的文件是不是个好主意。 Gzip已没有裂开的,以供参考,在这里是我不会重复的问题:
- 关于Hadoop的非常基本的问题,并压缩输入文件
- Hadoop的gzip压缩文件
- 只使用一个映射的Hadoop gzip的输入文件
- 为什么不能Hadoop的分裂出一个大的文本文件,然后使用gzip压缩的分裂?
我的问题是:是BZip2压缩最好的档案压缩,这将允许Hadoop的并行处理一个单一的存档文件? Gzip已绝对不是,从我的阅读LZO有一些问题。
BZIP2是Hadoop中可分离的-它提供非常好的压缩比但是从CPU时间和性能没有提供最佳的结果,因为压缩是非常耗费CPU。
LZO是裂开的Hadoop中-利用Hadoop的LZO你有裂开的LZO压缩文件。 你需要有外部.lzo.index文件能够并行处理。 该库提供产生在本地或分布式方式这些索引的所有的装置。
LZ4是裂开的Hadoop中-利用Hadoop的4mc你已经裂开的压缩4mc文件。 你不需要任何外部索引,并且可以生成与提供的命令行工具或通过的Java / C ++代码,内/外Hadoop的档案。 4mc使得可在Hadoop LZ4在速度/压缩比任何水平:从快速模式达到500百万字节/秒压缩速度达到高/超模式提供了增加的压缩比,几乎GZIP一个相媲美。
我不认为对方的回答是正确的,bzip2的根据是:
http://comphadoop.weebly.com/
是裂开的。 LZO是太多,如果索引 。
因此,答案是肯定的,如果你想使用更多映射器比你有文件,那么你要使用的bzip2。
要做到这一点,你可以写一个简单的MR作业来读取数据然后就再次写出来,然后你需要确保你设置mapred.output.compression.codec
到org.apache.hadoop.io.compress.BZip2Codec
这里有五种方式使用gzip,三需要的指数,二没有。
它可以创建任何gzip文件的索引,即不专门建造的,如做zran.c 。 然后你就可以在块边界开始减压。 该指数包括未压缩数据历史的32K在每个入口点。
如果你正在构建gzip文件,那么就可以用周期性的入口点,其指数并不需要解压缩历史上那些切入点,使一个较小的指数作出。 这是用做Z_FULL_FLUSH
选项deflate()
中的zlib。
你也可以做一个Z_SYNC_FLUSH
接着是Z_FULL_FLUSH
在每一个这样的点,这将插入两个标记。 然后,你可以搜索九字节模式00 00 ff ff 00 00 00 ff ff
找到那些。 那没有比搜索中的bzip2文件中6字节标记不同,但假阳性是9个字节不太可能。 那么你并不需要一个单独的索引文件。
GZIP和XZ支持简单的串联。 这使您可以轻松地在另一种方式并行减压准备存档。 简而言之:
gzip < a > a.gz
gzip < b > b.gz
cat a.gz b.gz > c.gz
gunzip < c.gz > c
cat a b | cmp - c
将导致比较成功。
然后,您可以简单地压缩在所需大小的块,将结果连接。 保存索引以gzip的每一个流的开始的偏移。 从这些偏移解压缩。 你可以挑选块的大小根据自己的喜好,这取决于你的应用程序。 如果你让他们不过过小,压缩会受到影响。
随着gzip文件格式的简单拼接,你也可以放弃该指数如果你做的每个块的固定的未压缩的大小。 然后,每个组块具有相同的四个字节,在little-endian顺序未压缩的长度,例如端部00 00 10 00
1个MIB块,随后1f 8b 08
从下一个块,这是一个gzip报头的开始。 然后,该7字节的标记可以搜索就像bzip2的标志,虽然再次与误报的概率较小。
同样可以用串联XZ文件,其标题是7个字节来完成: fd 37 7a 58 5a 00 00
。
我的2分钱小费,bZIP结构是一个书写非常缓慢。 与Apache 1.6.2星火,Hadoop的2.7测试compresse 50Go的一个简单的JSON文件,它需要2个时间的bZIP比gzip。
但随着bZIP结构,50Go ==> 4去吧!