【问题标题】:How to output a separate output file for each key in the reducer?如何为 reducer 中的每个键输出单独的输出文件?
【发布时间】:2013-10-01 11:06:33
【问题描述】:

我有一个 map-reduce 程序,其中映射器生成多个键。根据 map-reduce 框架,所有具有相同 key 的对都被传输到同一个 reducer。假设我有 10 个键(总共)和 3 个减速器。 reducer 最后输出的是 3 个输出文件。是否有任何技术可以为每个键生成单独的输出文件并在最后输出 10 个输出文件?可以有 10 个 reducer,但是当键的数量增加时,这种解决方案可能无法实现。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    这听起来不是一个好主意。一旦您开始将 Hadoop 用于真正的东西,您将面临严重的问题。

    但是,如果您仍然需要它,为什么不跳过 Reduce 阶段。只需直接从 Mappers 发出输出,然后是 Combiner。

    【讨论】:

    • 跳过 Reduce 阶段的想法很棒。但是如何将映射器的输出写入文件?
    • 您无需执行任何操作。它的工作原理类似于使用 Reducer 的情况。只需将减速器的数量设置为零即可。
    • 我实际上将reducer的数量设置为零,但最后我只得到了一个输出文件。有什么想法吗?
    • 因为你的数据太小,生成多个映射器来处理它会是一个矫枉过正。
    • 您能解释一下为什么如果每个文件的大小为 64MB(假设 hadoop 块大小也是 64MB)可能效率不高吗?
    【解决方案2】:

    如果您可以使用旧的 mapred API,那么还有一种替代方法:

    您可以使用 MultipleTextOutputFormat 的覆盖扩展名,然后将记录的所有内容作为“值”的一部分,同时将文件名或路径作为键。

    oddjob 库中已经提供了一个实现:MultipleLeafValueOutputFormat,你也可以自己实现。

    阅读更多关于它的信息here。另请阅读我的类似答案here

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2015-01-24
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多