0

私のmapreduce仕事は現在、次の構造でmultipleoutputsここで説明されているように)を使用して出力を生成します。

2013
    01
    02
    ..

2012
    01
    02
    ..

出力の基本パスは次のとおりですが/dev/project/job1/output 、別のジョブ (job2) が同様のデータを生成し、このジョブ (job1) の出力を他のジョブ (job2) の出力とマージしたいと考えています。

(/dev/project/combinedoutput)生成された出力を、上記の構造を含む共通の出力ディレクトリにマージし、両方のジョブの出力を結合しようとしています。シェルコマンドを手動で実行せずに、ジョブ自体でそれを行う方法はありますか?

洞察に感謝します。

4

1 に答える 1

0

仕事自体の中で?そうではありませんが、ジョブの完了後にメイン関数で実行できます

//prior code above

job.waitForCompletion(true);

FileSystem fs = FileSystem.get(conf);

String job1Dir = "/dev/project/job1/output";
String combinedDir = "(/dev/project/combinedoutput";

Path job1Path = new Path(job1Dir+*/);


FileStatus[] job1Files = fs.globStatus(job1Path);

for(file: job1Files){
    if(file.isFile()){
        String fullFileName = file.getPath().toString();
        String belowMainDir = fullFileName.subString(job1Dir.length());
        String newFileName = combinedDir+belowMainDir+"job1";
        fs.mkdirs(new Path(newFileName.subString(0,lastIndexOf("/")));
        fs.rename(file.getPath(),new Path(combinedDir+belowMainDir+"job1");
    }
}

これにより、ファイルが移動されます。job2 についても同じことを行うと、設定する必要があります。必要に応じて、名前を変更する代わりにコピーするようにコードを変更したり、終了後に元の job1/job2 ディレクトリを削除したりすることができます。

于 2013-11-07T16:38:24.637 に答える