0

我的工作目前使用以下结构mapreduce生成输出multipleoutputs如此处所述):

2013
    01
    02
    ..

2012
    01
    02
    ..

输出的基本路径是/dev/project/job1/output 但是,另一个作业(job2)生成类似的数据,我希望这个作业(job1)的输出与另一个作​​业(job2)的输出合并。

我正在尝试将生成的输出合并到(/dev/project/combinedoutput)包含上述结构的公共输出目录以及两个作业的组合输出。有没有办法在作业本身中做到这一点而无需手动运行 shell 命令?

欣赏任何见解。

4

1 回答 1

0

在工作本身?不是真的,但是您可以在作业完成后在 main 函数中执行此操作

//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 回答