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

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

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

  1. 2013
  2. 01
  3. 02
  4. ..
  5. 2012
  6. 01
  7. 02
  8. ..

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

kknvjkwl

kknvjkwl1#

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

  1. //prior code above
  2. job.waitForCompletion(true);
  3. FileSystem fs = FileSystem.get(conf);
  4. String job1Dir = "/dev/project/job1/output";
  5. String combinedDir = "(/dev/project/combinedoutput";
  6. Path job1Path = new Path(job1Dir+*/);
  7. FileStatus[] job1Files = fs.globStatus(job1Path);
  8. for(file: job1Files){
  9. if(file.isFile()){
  10. String fullFileName = file.getPath().toString();
  11. String belowMainDir = fullFileName.subString(job1Dir.length());
  12. String newFileName = combinedDir+belowMainDir+"job1";
  13. fs.mkdirs(new Path(newFileName.subString(0,lastIndexOf("/")));
  14. fs.rename(file.getPath(),new Path(combinedDir+belowMainDir+"job1");
  15. }
  16. }

这会把你的文件移过去的。对job2执行同样的操作,您应该被设置为。或者,您可以更改代码,使其复制而不是重命名,和/或在完成后删除原始job1/job2目录。

展开查看全部

相关问题