Hadoop:如何将reducer输出合并到一个文件?

tho*_*lee 16 java merge hadoop mapreduce hdfs

我知道shell中的"getmerge"命令可以完成这项工作.

但是,如果我想在作业之后通过HDFS API for java合并这些输出,我该怎么办?

我真正想要的是HDFS上的单个合并文件.

我唯一能想到的就是在那之后再开始一份工作.

谢谢!

Voi*_*son 10

但是,如果我想在作业之后通过HDFS API for java合并这些输出,我该怎么办?

猜测,因为我没有这个我试过,但我认为你正在寻找的方法是FileUtil.copyMerge,这是当你运行的是FsShell调用方法-getmerge命令. FileUtil.copyMerge将两个FileSystem对象作为参数--FsShell使用FileSystem.getLocal来检索目标FileSystem,但我没有看到任何理由您不能在目标上使用Path.getFileSystem来获取OutputStream

也就是说,我认为它不会让你获胜 - 合并仍在本地JVM中进行; 所以你并没有真正节省-getmerge下来-put.

  • 感谢您的回答.我刚试过这样的事:`String srcPath ="/ user/hadoop/output"; String dstPath ="/ user/hadoop/merged_file"; 配置conf = new Configuration(); 尝试{FileSystem hdfs = FileSystem.get(conf); FileUtil.copyMerge(hdfs,new Path(srcPath),hdfs,new Path(dstPath),false,conf,null); } catch(IOException e){}`.这成功地将输出文件合并为hdfs上的单个文件,顺序就像我的预期一样.但我现在有另一个问题.该函数如何知道文件的顺序? (5认同)
  • @ Thomas,Ben:我正在尝试使用FileUtil.copyMerge合并reducer输出中的文件.但是我在这里有一个问题,源目标包含_SUCCESS和_log文件,与part-r-00000相比也是如此.部分-R-00001.copyMerge只接受reducer输出文件,还是应该显式过滤哪些文件合并到我?如果是的话,我该怎么做?谢谢. (3认同)