Apache Hadoop 0.20.203中的MultipleOutputs

时间:2011-06-14 14:51:03

标签: hadoop

  

可能重复:
  MultipleOutputFormat in hadoop

Apache Hadoop 0.20.203的用户如何处理缺少对MultipleOutputs的支持(reducers写入多个输出文件)?

较早版本的Apache Hadoop支持MultipleOutputs,但要使用它们,似乎必须使用已弃用的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.21 Apache版本中。

干杯!

1 个答案:

答案 0 :(得分:1)

首先,您是否考虑过尝试将MultipleOutputs后退到您正在运行的Hadoop版本?我不知道这会有多难,但是我已经成功地将类似错误修复的东西推回到了CombineFileInputFormat中。

如果没有MultipleOutputs,可以通过编写自定义分区程序来将密钥放入预定的存储区集中,并强制减少任务的数量等于存储区的数量,从而实现类似的功能。

我将尝试使用类似于您为MultipleOutputs链接的JavaDocs中的示例来使其更具体。在该示例中,reducer写入2个预定的命名输出:“text”和“seq”。在作业提交时知道正好有2个输出,我们提交作业,其中reduce任务的数量设置为2.对于映射器接收的每个键值对,它必须写入2个输出键值对:一个带有“text” “作为密钥的一部分,以及”seq“作为密钥的一部分。然后,在自定义分区程序中,我们可以执行以下操作:

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

然后,假设一个无操作的IdentityReducer,我们知道part-r-00000的内容将包含所有“文本”记录,而part-r-00001将具有所有“seq”记录。使用2个减速器任务运行作业至关重要。 (如果只有一个reducer任务,那么它只会将“text”和“seq”记录组合到part-r-00000中。)

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

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