2013-03-27 90 views
1

我會複製很多大的weblogs文件壓縮爲gzip在hadoop。 我需要在這些文件上運行多個map/reduce。hadoop策略與大gzip文件

就我的理解,只有一個Map/Reduce將由文件運行。 就我而言,這是不可接受的,因爲我們需要儘快完成這些工作。

將gzip文件拆分成較小的塊(在將它們複製到hadoop或之後)爲 能夠運行儘可能多的map/reduce是否常見?

感謝您的幫助。

+0

我有很多gzip文件的遠程備份服務器。我會將它們複製到hadoop中。我會再次編輯我的問題。 – rguillemette 2013-03-28 18:14:11

+0

現在還不清楚。你只是複製文件?你沒有解壓他們? – 2013-03-28 22:40:34

回答

2

您可以使用lzop生成文件的lzo壓縮副本 - 雖然壓縮比低於gzip,但lzo解壓縮速度非常快。

類似的東西;

gunzip --stdout file.gz | lzop -ofile.lzo

應該工作。

將lzo文件複製到hdfs中,然後安裝hadoop-lzo並使用它爲lzo文件生成索引;

Hadoop的罐子(路徑Hadoop的LZO JAR)com.hadoop.compression.lzo.LzoIndexer file.lzo

(你也可以使用com.hadoop.compression.lzo。DistributedLzoIndexer如果你喜歡)

這將爲lzo文件創建一個索引。

然後,Hadoop將在生成MapReduce作業的拆分以將.lzo壓縮文件分發到多個映射器/ reducer時使用(使用正確的輸入格式)索引。

這裏有更詳細的信息;

https://github.com/twitter/hadoop-lzo

,並在這裏,回購,解決一些問題的一個分支;

https://github.com/kevinweil/hadoop-lzo

+0

謝謝馬特。拆分文件或lzo似乎是正確的方法。 – rguillemette 2013-04-03 16:33:19

1

我還沒有對你的問題清楚,所以我會回答這個問題,你可以讓我知道,如果我接近:

如何使用的map/reduce範式來解壓一個大的gzip文件?

除非專門爲此準備了gzip文件,否則無法映射出解壓縮作業。減壓必須連續進行。儘管bzip2壓縮數據已經在單獨的可解壓縮塊中,但不能解壓整個塊已經連續地指向它們,這可能會破壞目的。

您提到了LZO的「容器」格式,如果我理解正確的話,對於gzip和bzip2也可以。

對於任何這些格式,您可以通過分段壓縮來準備gzip流以進行並行解壓縮。例如。每片有兆字節或幾兆字節,以便不會顯着降低壓縮率,並且保持壓縮時構建的那些片段的索引,並與壓縮數據文件一起傳輸或存儲。

gzip流的連接本身就是一個有效的gzip流,它解壓縮爲各個流的解壓縮級聯。 bzip2格式也是如此。對於bzip2,應該是900K的倍數,以便不具有壓縮比效率較低的部分塊。

然後,您可以構建這樣一個gzip或bzip2文件,並保存每個gzip或bzip2流的起始文件偏移列表。然後,您可以映射出這些片段,其中縮減步驟將以正確的順序簡單地連接未壓縮的結果。

+0

嗨馬克,編輯的問題。在我的情況下,該文件已被壓縮。所以如果我理解正確,我需要在將這些文件添加到hdfs之前分割這些文件,以確保我可以同時運行儘可能多的地圖。 – rguillemette 2013-03-28 11:47:46

+0

已編輯的問題。我希望我更清楚 – rguillemette 2013-03-28 19:16:46