【问题标题】:Partitioner or MultipleOutputs分区器或多个输出
【发布时间】:2013-12-16 07:28:14
【问题描述】:

我想听听您对 Partitioner 与 MultipleOutputs 的看法。
假设我有一个包含键的文件

0:aaa  
1:bbb  
0:ccc  
0:ddd  
...  
1:zzz  

我想要 2 个文件:一个文件包含以 0: 开头的密钥,另一个包含以 1: 开头的密钥。我应该使用哪种方法:
1) 使用自定义分区器,它将解析键并为 getPartition() 返回 0 或 1。
2)在reduce阶段使用MultipleOutputs.write,通过解析key并为MultipleOutputs.write的namedOutput参数提供zeroone

哪个更好?对我来说,1) 更好,因为 reducer 处理单个文件。

【问题讨论】:

    标签: hadoop mapreduce hadoop-partitioning reducers partitioner


    【解决方案1】:

    当您说第一个选项更好时,这意味着您受 2 个值的约束。假设如果您获得其他键值,您可能需要更改分区器或配置以设置 3 个减速器,所以更好的主意是使用多个输出

    【讨论】:

      【解决方案2】:

      如果您的工作只是将输入文件分成两部分,那么 MultipleOutputs 是一个更好的选择,因为您可以节省 shuffle / sort 阶段(通过运行仅映射作业)。

      现在,如果您有很多输入文件并且不希望输出文件数量是输入的 2 倍,那么使用基于分区器的方法将允许您将输入文件合并为 2 个输出(它们不会然而,命名很好,MultipleOutputs 的另一个好处,但是您可以通过在 reducer 中使用 MultipleOutputs 和 LaxyOutputFormat 轻松解决此问题,以确保不会将空的 part-r 文件写入输出)。

      所以回答 - 这取决于你有多少输入文件,以及你想要多少输出文件。

      【讨论】:

      • 嗨,克里斯,感谢您分享您的想法。实际上我试图简化问题。如果我必须使用减速器阶段。对我来说,reducer 中的自定义分区器和 MultipleOutputs 完成了同样的事情,但是哪个提供了更好的性能。谢谢。
      • 如果你必须使用减速器,那么我会说性能上的差异可能可以忽略不计
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 2021-10-03
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多