我使用以下方式链接mapreduce作业: map1 - > reduce1 - > map2 - > reduce2 在map1作为副作用的步骤中,我计算仅在reduce2期间需要的数据一步,所以我不想通过链条一路通过它。传递这些数据的最好方法是什么,以便在reduce2步骤中我可以从map2和map1获取数据?Hadoop:在连续的mapreduce任务之间传递数据
感谢
我使用以下方式链接mapreduce作业: map1 - > reduce1 - > map2 - > reduce2 在map1作为副作用的步骤中,我计算仅在reduce2期间需要的数据一步,所以我不想通过链条一路通过它。传递这些数据的最好方法是什么,以便在reduce2步骤中我可以从map2和map1获取数据?Hadoop:在连续的mapreduce任务之间传递数据
感谢
根据您的意见,您从映射器1.然后输出一个和乙,你想一个去减速机1和乙去机2,沿与映射器2. 我可以看到最好的选择的输出如下:
作业1:
为了区分A从B,在第一份工作中使用MultipleOutputs
...使用共同前缀(例如,在值中)为B映射器1的中间输出,它将区分它们与A输出的类型。在缩减器1中,当看到前缀时,将其删除并在输出路径中写入B s。
作业2:
使用MultipleInputs
在你的第二份工作。使用映射器2处理它所处理的输入,并使用IdentityMapper作为B。这将简单地前进乙到减速机2,在这里也将处理映射器2.
的输出的简单的代码片断:
MultipleInputs.addInputPath(conf, new Path("/input/path/of/job/2"), SequenceFileInputFormat.class, Mapper2.class);
MultipleInputs.addInputPath(conf, new Path("/path/of/B"), SequenceFileInputFormat.class, IdentityMapper.class);
conf.setReducerClass(Reducer2.class);
其中MultipleInputs
是import org.apache.hadoop.mapred.lib.MultipleInputs;
。
您不能在reducer 2中获取数据,并以与处理mapper 2输出相同的方式处理它们,除非您也使用mapper。一般来说,你不能在没有映射器的情况下使用reducer。最接近的就是使用IdentityMapper。
如果你要处理乙以另一种方式,那么,你可以让他们通过分布式缓存,或者如果它是一个单一的NUMER或两个,只设置一个变量,这个值,使用conf.set("variableName", variableValue);
。然后,您可以使用conf.get("variableName", defaultValue);
在减速器2的setup()
方法中获得此值。
非常感谢这么全面的回复!我想过使用MultipleOutputs,但从来没有考虑MultipleInputs。 – 2014-10-20 10:20:28
我很高兴它帮助:) – vefthym 2014-10-20 10:30:30
你根本不想减少1?还是在少数情况下,您将需要数据通过reduce1和reduce2? – 2014-10-17 11:15:15
不,我需要reduce1的输出 - 它会传递给map2。我的观点是,reduce1不需要map1输出的一部分,但需要reduce2,所以我不希望这部分数据通过整个链。 – 2014-10-17 11:20:01
基本上,在map1过程中,我计算A和B,其中A将传递给reduce1并在那里处理,而B将传递给reduce2,它将与map2的输出一起处理它。 – 2014-10-17 11:22:03