シェルの「getmerge」コマンドでこの作業を実行できることは知っています。
しかし、Java用のHDFS APIによるジョブの後にこれらの出力をマージしたい場合は、どうすればよいですか?
私が実際に欲しいのは、HDFS上の単一のマージされたファイルです。
私が考えることができる唯一のことは、その後、追加の仕事を始めることです。
ありがとう!
しかし、これらの出力を HDFS API for Java でジョブの後にマージしたい場合はどうすればよいですか?
私はこれを自分で試したことがないので推測していますが、探しているメソッドはFileUtil.copyMerge-getmerge
であると思います。これは、コマンド を実行したときに FsShell が呼び出すメソッドです。FileUtil.copyMerge
2 つの FileSystem オブジェクトを引数として取ります。FsShell は FileSystem.getLocal を使用して宛先 FileSystem を取得しますが、代わりに宛先で Path.getFileSystem を使用して OutputStream を取得できない理由は見当たりません。
とは言っても、それがあなたに大きな利益をもたらすとは思いません。マージはまだローカル JVM で行われています。そのため、実際にはあまり節約-getmerge
されていません-put
。
コードで単一の Reducer を設定することにより、単一の出力ファイルを取得します。
Job.setNumberOfReducer(1);
あなたの要件に対応しますが、費用がかかります
また
Static method to execute a shell command.
Covers most of the simple cases without requiring the user to implement the Shell interface.
Parameters:
env the map of environment key=value
cmd shell command to execute.
Returns:
the output of the executed command.
org.apache.hadoop.util.Shell.execCommand(String[])