12

在 Hadoop MapReduce 中是否可以使用多个不同的映射器进行多个输入?每个映射器类都在一组不同的输入上工作,但它们都会发出由同一个 reducer 消耗的键值对。请注意,我在这里不是在谈论链接映射器,而是在讨论并行运行不同的映射器,而不是按顺序运行。

4

2 回答 2

13

这称为联接。

您想使用 mapred.* 包(较旧,但仍受支持)中的映射器和缩减器。较新的包 (mapreduce.*) 只允许一个映射器输入。使用 mapred 包,您可以使用 MultipleInputs 类来定义连接:

MultipleInputs.addInputPath(jobConf, 
                     new Path(countsSource),       
                     SequenceFileInputFormat.class, 
                     CountMapper.class);
MultipleInputs.addInputPath(jobConf, 
                     new Path(dictionarySource), 
                     SomeOtherInputFormat.class, 
                     TranslateMapper.class);

jobConf.setJarByClass(ReportJob.class);
jobConf.setReducerClass(WriteTextReducer.class);

jobConf.setMapOutputKeyClass(Text.class);
jobConf.setMapOutputValueClass(WordInfo.class);

jobConf.setOutputKeyClass(Text.class);
jobConf.setOutputValueClass(Text.class);
于 2012-06-16T01:31:57.073 回答
2

我将用一个问题、2 个答案和一个反推荐来回答你的问题。

问题是:您看到并行运行异构地图作业有什么好处,而不是串行运行它们,输出可以正确打乱的同质结果?是否避免两次传递相同的记录,一次使用身份映射?

第一个答案是同时安排两个仅 mapper 的作业,每个作业在您的舰队的一半上(或任何与输入数据大小最匹配的比率),输出同质结果,然后是执行 join 的仅 reducer 作业。

第二个答案是创建一个能够识别和转换两种类型的异构输入的自定义 InputFormat。这非常难看,但它可以让你避免第一个建议的不必要的身份映射。

反对建议是不要使用 Chris 回答中已弃用的 Hadoop API。Hadoop 非常年轻,但 API 正在围绕“新”风格稳定下来。你最终会到达版本锁定。

于 2012-06-16T02:55:27.643 回答