如何在保持Reducer数量不变时减少MultipleOutputs单个目录输出文件数
问题解答
MapReduce 没有原生对标 Spark coalesce 的运行时动态重分区能力,Reducer 数量在作业启动前就固定,运行过程中无法调整;MultipleOutputs 本身也不内置指定目录的输出合并功能,默认每个 Reducer 会为每个配置的输出目录生成1个文件,你可以通过以下两种主流方案实现需求,完全无需修改400个 Reducer 的配置:
方案1:后置轻量合并(零侵入原有逻辑,推荐)
原有作业的计算逻辑完全不用改,在作业执行完成后做一步合并操作即可:
- 数据量极小的场景直接用 HDFS 内置命令合并:
hadoop fs -getmerge /你的/第三个输出/目录路径 /你的/第三个输出/目录路径/merged_result # 合并完成后删除原有的400个小文件 hadoop fs -rm /你的/第三个输出/目录路径/part-r-* - 如果担心
getmerge会拉取数据到本地节点再上传,可以额外跑一个只有1~2个 Reducer 的微型 MR 作业专门合并该目录文件,资源消耗极低,执行速度快。
方案2:作业内逻辑改造,运行时直接生成合并文件
针对第三个输出的写入逻辑做小幅度修改即可:
- 写入第三个目录时统一指定固定分区键,配合自定义 OutputFormat 让所有 Reducer 的对应输出都落到同1~2个文件中,注意HDFS不支持多客户端并发写入同一个文件,你需要在写入时加分布式锁,或者在 Reducer 的
cleanup阶段串行写入目标文件,仅适合第三个目录数据体量极小的场景。
内容的提问来源于stack exchange,提问作者Neethu Lalitha
相关产品推荐
相关产品推荐

