MultipleOutputs in Apache Hadoop 0.20.203



可能重复:
hadoop 中的MultipleOutputFormat

Apache Hadoop 0.20.203的用户如何应对缺乏对MultipleOutput(reducers写入多个输出文件)的支持?

Apache Hadoop的旧版本支持MultipleOutput,但要使用它们,似乎必须使用不推荐使用的API。

我还听说某些Hadoop的Cloudera发行版支持更新的MultipleOutputs API,如http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html,它应该出现在Hadoop的0.21Apache版本中。

干杯!

首先,您是否考虑过将MultipleOutput备份到您正在运行的Hadoop版本?我不知道这会有多难,但我已经成功地移植了一些东西,比如CombineFileInputFormat中的错误修复。

如果没有MultipleOutputs,可以通过编写一个自定义分区器将键放入一组预先确定的存储桶中,并强制减少任务的数量等于存储桶的数量来实现类似的效果。

我将尝试通过一个类似于您为MultipleOutput链接的JavaDocs中的示例来使其更加具体。在该示例中,reducer写入两个预先确定的命名输出:"text"one_answers"seq"。在作业提交时,我们知道正好有2个输出,所以我们提交的作业的减少任务数设置为2。对于映射器接收到的每个键值对,它必须写入2个输出键值对:一个是将"text"作为键的一部分,另一个是"seq"作为键。然后,在自定义分区器中,我们可以执行以下操作:

if (key.toString().equals("text"))
    return 0;
else if (key.toString().equals("seq"))
    return 1;

然后,假设没有操作IdentityReducer,我们知道part-r-000000的内容将具有所有"text"记录,part-r-00001将具有所有的"seq"记录。至关重要的是,该作业要运行两个减速器任务。(如果只有一个reducer任务,那么它只会将"text"one_answers"seq"记录组合到part-r-000000中。)

请注意,我已经跳过了MultipleOutputs示例中的第三个命名输出。这很难解决,因为名称必须在运行时确定。只有当您在作业提交时知道一组预先确定的名称时,此解决方案才有效。

公平的警告:整个解决方案非常脆弱。如果名称的数量发生变化,则必须更改reducer任务的数量以与之匹配。根据问题的性质,可以在作业提交前动态检测所有可能的关键字,并相应地动态调整reduce任务的数量。将解决方案扩展到多个reduce任务也需要付出更多的努力。综合考虑,这个解决方案可能很难维护,但这是我知道如何在没有MultipleOutput的情况下解决它的唯一方法。

最新更新