2014-01-07 49 views
1

我需要將大量文件從一個hdfs目錄移動到另一個hdfs目錄中(而不是複製)到另一個hdfs目錄。將大量文件從hdfs移動到hdfs

我可以使用distcp,但它似乎是一個矯枉過正,因爲它是複製文件(複製它)我只想移動它。兩個問題:

A)是那裏有什麼:

我想用MapReduce的做到這一點,因爲有成千上萬的文件需要被移動(或重命名爲新的路徑)。我也想將它與oozie集成。我自己可以寫一個mapreduce工作,但我想知道是否有什麼可以完成這項工作。

B)我真的需要這樣做mapred?

不幸的是,我對hdfs rename的性能特徵不夠了解;你認爲我可以通過單線程方法來重命名文件嗎?

回答

1

移動本身是高效的,因爲它只處於元數據(即inode)級別,而不是數據級別。換句話說,發佈一個移動(它在Hadoop的代碼中名爲rename,而不是move)比複製數據要快得多。你可以看看source code,以防你對細節感興趣。

由於這個原因,您的不應該執行distcp,因爲這將是數據的實際副本。如果要對其進行並行化(因爲你說的數百萬個文件),應該不會太難使用Hadoop流:包含的文件列表進行重命名(SRC +目的地)

  1. 寫幾個文件,一個每行。
  2. 編寫一個shell腳本,爲它在stdin上讀取的每一行發出重命名(hdfs命令mv)。
  3. 使用流式處理:您的文件與文件是輸入,您的shell腳本是映射器。

那裏有什麼嗎?

我不知道,但也有可能。

我真的需要這樣做,因爲mapred?

如果您有數百萬個文件,即使HDFS重命名本身有效,聯繫namenode的延遲也會加起來。 但是,如果它是一次性的,我寧願發出單線程的方法並等待,因爲寫入和調試(即使是簡單的代碼)也需要一段時間。如果你打算經常這樣做(爲什麼?),那麼我會考慮實施我上面描述的方法。