Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Hadoop MapReduce中是否可以使用多个不同的映射器进行多个输入?_Hadoop_Mapreduce - Fatal编程技术网

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

在Hadoop MapReduce中是否可以使用多个不同的映射器进行多个输入?,hadoop,mapreduce,Hadoop,Mapreduce,在Hadoop MapReduce中是否可以使用多个不同的映射器进行多个输入?每个映射器类处理一组不同的输入,但它们都会发出由同一个reducer使用的键值对。请注意,这里我不是说链接映射程序,而是说并行运行不同的映射程序,而不是按顺序运行。这称为连接 您希望使用mapred.*包中的映射器和还原器(较旧,但仍受支持)。较新的包(mapreduce.*)只允许一个映射器输入。使用mapred软件包,可以使用MultipleInputs类定义联接: MultipleInputs.addInputP

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

这称为连接

您希望使用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);

我将用一个问题、两个答案和一个反建议来回答你的问题

问题是:与串联运行异构映射作业相比,并行运行异构映射作业有什么好处,可以输出可以适当混洗的同质结果?是不是要避免两次传递相同的记录,一次使用身份图

第一个答案是同时调度两个仅映射器作业,每个作业在一半的震源组上(或任何与输入数据大小最匹配的比率),输出同质结果,然后是执行联接的仅缩减器作业

第二个答案是创建一个自定义InputFormat,它能够识别和转换异构输入的两种风格。这是非常丑陋的,但它将允许您避免第一个建议中不必要的身份映射


反对的建议是不要使用Chris回答中不推荐使用的Hadoop API。Hadoop还很年轻,但API正在围绕“新”风格稳定下来。您最终将实现版本锁定。

较新的API(
mapreduce
而不是
mapred
)确实有
多个输入。
:@DonaldMiner有些版本有,但看起来至少0.20.x没有,例如,请注意此处缺少多个输入:运行多个映射器的原因是您可以实现FlumeJava论文中给出的展平操作。来自不同映射器的输出可以参与相同的洗牌操作。