Hadoop MapReduce中是否可以有多个不同映射器的多个输入?每个映射器类都处理不同的输入集,但它们都会发出同一个reducer所消耗的键值对。请注意,我不是在谈论链接映射器,我说的是并行运行不同的映射器,而不是顺序运行。
答案 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正在稳定“新”味道。您最终将获得版本锁定。