Hadoop:如何将 reducer 输出合并到单个文件中? [复制]
Posted
技术标签:
【中文标题】Hadoop:如何将 reducer 输出合并到单个文件中? [复制]【英文标题】:Hadoop: How can i merge reducer outputs to a single file? [duplicate] 【发布时间】:2012-10-06 09:09:38 【问题描述】:我知道 shell 中的“getmerge”命令可以完成这项工作。
但是如果我想在作业后通过 HDFS API for java 合并这些输出怎么办?
我真正想要的是 HDFS 上的单个合并文件。
我唯一能想到的就是在那之后开始一份额外的工作。
谢谢!
【问题讨论】:
【参考方案1】:但是如果我想在作业后通过 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"; Configuration conf = new Configuration(); try FileSystem hdfs = FileSystem.get(conf); FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath), false, conf, null); catch (IOException e)
。成功地将输出文件合并为 hdfs 上的单个文件,并且顺序与我的预期一样。但我现在有另一个问题。该函数如何知道文件的顺序?
这里是 copyMerge 的实现:grepcode.com/file/repository.cloudera.com/content/repositories/… 看起来这完全取决于 FileSystem 的 listStatus 方法返回的项目的顺序。我猜你的输出文件只是串联在一起。
@Thomas, Ben:我正在尝试使用 FileUtil.copyMerge 合并减速器输出中的文件。但是我在这里有一个问题,源目标包含 _SUCCESS 和 _log 文件,除了 part-r-00000。部分-r-00001。 copyMerge 是否只接受减速器输出文件,还是我应该明确过滤哪些文件必须合并?如果是,我该怎么做?谢谢。【参考方案2】:
您可以通过在代码中设置单个 Reducer 来获得单个输出文件。
Job.setNumberOfReducer(1);
将满足您的要求,但成本高
或
Static method to execute a shell command.
Covers most of the simple cases without requiring the user to implement the Shell interface.
Parameters:
env the map of environment key=value
cmd shell command to execute.
Returns:
the output of the executed command.
org.apache.hadoop.util.Shell.execCommand(String[])
【讨论】:
感谢您的回答。这确实有效,但正如你所说的那样昂贵。有没有办法通过 hdfs API 合并它们? 我什至会为你选择另一个工作。或者我已经编辑了答案。 是的,也许换个工作比较好。在做出选择之前,我也会尝试 execCommand。非常感谢! 很好的答案。如果您想为某些外部系统准备压缩的 Avro 文件,这将很有帮助。例如,我处理 5 个 JSON 文件,每个文件 1Gb,并将输出减少到 1 个用 XZ 压缩到 100Mb 的 Avro 文件。在其他情况下,我会得到 5 个 Avro 文件,每个文件 50Mb ~ 总共 250Mb。以上是关于Hadoop:如何将 reducer 输出合并到单个文件中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章