将mapreduce的输出合并到另一个目录结构中

kq4fsx7k  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(306)

我的 mapreduce 作业当前使用生成输出 multipleoutputs (如本文所述)结构如下:

2013
    01
    02
    ..

2012
    01
    02
    ..

输出的基本路径是 /dev/project/job1/output 但是,另一个作业(job2)生成类似的数据,我希望此作业(job1)的输出与另一个作业(job2)的输出合并。
我正在尝试将生成的输出合并到公共输出目录 (/dev/project/combinedoutput) 包含上述结构以及两个作业的组合输出。有没有一种方法可以在不手动运行shell命令的情况下在作业本身中实现这一点?
感谢你的真知灼见。

kknvjkwl

kknvjkwl1#

工作本身?不是真的,但是你可以在工作完成后在主功能中这样做

//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目录。

相关问题