2015-05-06 84 views
4

如何將HDFS上的一個目錄中的所有文件(我知道都是壓縮的)合併到單個壓縮文件中,沒有通過本地機器複製數據?例如,但不一定,使用豬?例如,我有一個文件夾/ data/input,它包含文件part-m-00000.gz和part-m-00001.gz。現在我想合併成一個文件/data/output/foo.gz在HDFS上合併壓縮文件

回答

0

我知道有一個選項可以使用「hdfs dfs -getMerge」命令合併到本地文件系統。也許你可以使用它來合併到本地文件系統,然後使用'hdfs dfs -copyFromLocal'命令將其複製回hdfs。

+0

但我想避免必須將數據傳送回本地文件系統。 – matthiash

1

如果將Parallel設置爲1,那麼您將擁有單個輸出文件 This可以通過兩種方式來完成:

    在你的豬
  1. 添加set default_parallel 20;但要注意,這種影響一切都在你的豬
  2. 更改並行對於單個操作 - 像DISTINCT ID PARALLEL 1;

可以閱讀更多關於Parallel Features

4

我會建議看FileCrush(https://github.com/edwardcapriolo/filecrush),這是一個使用MapReduce在HDFS上合併文件的工具。它完全符合您所描述的內容,並提供了若干選項來處理壓縮和控制輸出文件的數量。

Crush --max-file-blocks XXX /data/input /data/output 

max-file-blocks表示每個輸出文件的最大dfs塊數。例如,根據文檔:

使用默認值8,80個小文件,每個都是DFS 塊將被分組爲以自8 * 1/10單個輸出文件的1/10 = 8 dfs塊。如果有81個小文件,每個文件都是塊的1/10,則會創建兩個輸出文件。一個輸出文件包含41個文件的 組合內容,第二個將包含另一個40的組合 內容。許多小文件的目錄將被 轉換爲更少數量的較大文件,其中每個輸出文件的大小相當於 尺寸。