在Hadoop MapReduce中是否可以使用多个不同的映射器进行多个输入?

时间:2012-06-16 00:23:36

标签: hadoop mapreduce

Hadoop MapReduce中是否可以有多个不同映射器的多个输入?每个映射器类都处理不同的输入集,但它们都会发出同一个reducer所消耗的键值对。请注意,我不是在谈论链接映射器,我说的是并行运行不同的映射器,而不是顺序运行。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

我会用一个问题,2个答案和一个反建议来回答你的问题。

问题是:在并行运行异构映射作业时,您会看到哪些好处,而不是串行运行它们,输出可以适当洗牌的同类结果?想法是避免两次传递相同的记录,一次使用身份地图吗?

第一个答案是同时安排两个仅限映射器的作业,每个作业都在你的队列的一半(或者与输入数据大小最匹配的任何比率),输出同类结果,然后是执行连接的仅限reducer的作业。 / p>

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

反建议是使用Chris回答的弃用的Hadoop API。 Hadoop非常年轻,但API正在稳定“新”味道。您最终将获得版本锁定。