2016-04-15 206 views
6

在Hadoop中getmerge描述Hadoop -getmerge如何工作?

用法:HDFS DFS -getmerge SRC localdst [addnl]

我的問題是,爲什麼getmerge被串聯到本地目標,爲什麼不HDFS本身?這個問題被問到,因爲我有以下問題

  1. 如果要合併的文件大於本地的大小?
  2. 是否有限制hadoop -getmerge命令僅用於連接到本地目標的任何具體原因?
+0

我知道這不是你的問題,但也許你會發現這個帖子很有用:http://stackoverflow.com/questions/21776339/hadoop-getmerge-to-another-machine – vefthym

回答

6

getmerge命令專門用於將文件從HDFS合併到本地文件系統中的單個文件。

該命令對於下載MapReduce作業的輸出非常有用,該作業可能會生成多個part- *文件,並將它們合併到本地的單個文件中,您可以將其用於其他操作(例如,將其放入Excel表單)。

問題的答案:

  1. 如果目標文件系統沒有足夠的空間,則拋出IOException。 getmerge內部使用IOUtils.copyBytes()(請參閱IOUtils.copyBytes())函數一次將一個文件從HDFS複製到本地文件。只要複製操作出現錯誤,此函數就會拋出IOException

  2. 該命令與hdfs fs -get命令類似,用於從HDFS獲取文件到本地文件系統。唯一不同的是hdfs fs -getmerge將HDFS中的多個文件合併到本地文件系統。

如果你想在HDFS合併多個文件,可以使用copyMerge()方法從FileUtil類(見FileUtil.copyMerge())實現它。

此API將目錄中的所有文件複製到單個文件(合併所有源文件)。

+0

謝謝你的回答, – monic

+1

是否有替代-getmerge我可以直接從hdfs合併到hdfs的文件? – monic

+1

這沒有命令行功能。正如我在答案中提到的那樣,您需要以編程方式使用「FileUtil.copyMerge()」,或者使用一些Linux shell腳本技巧,如下所述:http://stackoverflow.com/questions/3548259/merging-multiple-files-into-一中,Hadoop的。對於例如hadoop fs -cat [dir]/* | hadoop fs -put - [目標文件] –