2013-02-06 38 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