2013-02-06 40 views
1

如果我有两个文本文件,一个和,有什么区别:两个concatenated bz2文件和一个由两个连接文件构成的bz2文件有什么区别?

BZ2一二-c> out.bz2

......还有......

cat one two | bzip2 -c> out.bz2

具体来说,我使用pbzip2生成bz2文件,将它们放在HDFS上,然后从猪身上读取它们,然后打到MAPREDUCE-477。我无法从版本0.20升级我的hadoop群集,使用非并行bz2实现太慢,我想使用非块压缩算法。

有什么办法可以将连接的bz2文件转换为非连接的文件吗?甚至,我将如何修改pbzip2,以便它生成非串联的bz2文件?

谢谢 -

回答

1

通常压缩通过更短的东西替换模式。例如,如果你有“你好,那里再见”,那么你可以用第一个引用(引用小于原始5字节)的引用替换第二个“there”。

现在想象一下如果你有2个文件,一个包含“你好”,另一个包含“再见那里”。如果你连接然后压缩,那么压缩有更多的数据可以使用,并可以用第一个引用代替第二个“there”。如果分别压缩这两个文件,然后将其连接起来不会发生。

现在想象一下,如果你连接然后压缩,使得第二个“there”(从第二个文件)被第一个“there”(从第一个文件)引用替换;然后尝试将压缩数据拆分回2个压缩文件。你最终会得到的是一个2个文件,其中第二个文件引用了该文件中不存在的内容,该内容不能被解压缩。

注意:现代压缩技术比我上面描述的复杂得多 - 我简化了很多来说明。

如果您需要并行压缩和解压缩大量数据,则无法完成。相反,您需要将大量数据分成小块;使小件可以分别压缩/解压缩,并且许多小件可以并行压缩/解压缩。

+0

是的,但bz2是块压缩算法,所以块之间不应该存在依赖关系?他们可能有不同的字典,但我不确定在某些应用程序(例如MAPREDUCE-477)中只读取第一个文件的块是如何产生的? –

+0

如果块是1000字节,第一个文件是1300字节,第二个文件是1700字节;然后猜测当文件连接在一起然后压缩时,中间的块将包含哪些内容。 – Brendan