2016-04-15 18 views
6
のHadoop getmergeの説明では

Hadoop -getmergeの仕組みは?

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

自体をHDFSない理由getmergeはローカルの宛先に連結されている理由私の質問はありますか?この問題は次のような問題があるため質問されました

  1. マージするファイルがローカルのサイズを超えている場合はどうなりますか?
  2. hadoop-getmergeコマンドをローカル宛先にのみ連結するように制限する理由はありますか?
+0

私はこれがあなたの質問ではないことを知っていますが、おそらくあなたはこの投稿が役に立ちます。http://stackoverflow.com/questions/21776339/hadoop-getmerge-to-another-machine – vefthym

答えて

6

getmergeコマンドは、HDFSのファイルをローカルファイルシステム上の1つのファイルにマージするために作成されています。

このコマンドはMapReduceジョブの出力をダウンロードするのに非常に便利です。これは、複数のpart- *ファイルを生成し、それらをローカルに単一のファイルに結合する可能性があります。プレゼンテーション用のExcelシート)。ご質問

回答:

  1. 先のファイルシステムに十分なスペースがない場合は、その後、IOExceptionがスローされます。 getmergeは内部でIOUtils.copyBytes()IOUtils.copyBytes()参照)機能を使用して、HDFSからローカルファイルに一度に1つのファイルをコピーします。この関数は、コピー操作でエラーが発生するたびにIOExceptionをスローします。

  2. このコマンドは、HDFSからローカルファイルシステムにファイルを取得するコマンドhdfs fs -getと同様の行です。相違点のみhdfs fs -getmergeは、HDFSからローカルファイルシステムに複数のファイルをマージします。あなたはHDFSで複数のファイルをマージしたい場合は、FileUtilクラス(FileUtil.copyMerge()を参照)からcopyMerge()メソッドを使用して、それを達成することができます

このAPIは、ディレクトリ内のすべてのファイルを1つのファイルにコピーします(すべてのソースファイルをマージします)。

+0

答えをありがとう、 – monic

+1

hdfsからhdfsに直接ファイルをマージすることができる-getmergeの代替手段はありますか? – monic

+1

そのためのコマンドライン機能はありません。答えで述べたように、 "FileUtil.copyMerge()"をプログラムで使用するか、ここで述べるようなLinuxシェルスクリプトのトリックを使用する必要があります:http://stackoverflow.com/questions/3548259/merging-multiple-files-into- 1つの中にhadoop。例えば、 hadoop fs -cat [dir]/* | hadoop fs -put - [出力先ファイル] –