2010-12-13 53 views
6

我正在使用Flume向HDFS收集日誌。對於測試用例,我有小文件(〜300kB),因爲日誌收集過程根據實際使用進行了縮放。哪個是組合小HDFS塊最簡單的方法?

是否有任何簡單的方法將這些小文件合併爲更接近HDFS塊大小(64MB)的大文件?

+0

是否要合併文件以進行存儲或進行mapreduce作業輸入? – wlk 2010-12-13 15:51:16

+0

有沒有一種方法可以將他們從mappers的角度結合起來? – 2010-12-13 15:53:45

+0

我想結合他們的存儲 – 2010-12-13 17:48:25

回答

5

GNU coreutils 分割可以做的工作。

如果源數據是線 - 在我情況下,它們是 - 和一個線是圍繞84 bytes,那麼HDFS方框64MB可以包含周圍800000行:

hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 

--line-bytes選項:

hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 
+0

btw我可以想象一個hadoop命令做同樣的事情,所以如果任何人有興趣,問題仍然是開放的。 – 2010-12-13 15:09:54

3

我現在的解決方案是編寫一個MapReduce作業,該作業什麼都不做,而只有有限數量的減速器。每個reducer輸出一個文件,所以這把它們放在一起。您可以在每行中添加原始文件的名稱以幫助顯示其來源。

我仍然有興趣聽到,如果有一個標準或經過驗證的最好的方式做到這一點,我不知道。

+1

+1。這也是我過去使用自己的解決方案。 – 2010-12-24 10:46:48

+0

我也是,那是最好的工作人員 – 2011-01-15 18:51:55

+0

這就是我所做的。我在SequenceFileInputFormat類中使用addInputPath來添加所有希望「粉碎」的文件,然後運行該作業。 – PhillipAMann 2016-01-11 19:05:13

3

你應該看看由media6degrees開源的File Crusher。它可能有點過時,但您可以下載源代碼並進行更改和/或貢獻。 JAR和源文件位於:http://www.jointhegrid.com/hadoop_filecrush/index.jsp

這實質上是一種用於合併小文件的map-reduce技術。