2014-10-17 68 views
1

我使用以下方式链接mapreduce作业: map1 - > reduce1 - > map2 - > reduce2 在map1作为副作用的步骤中,我计算仅在reduce2期间需要的数据一步,所以我不想通过链条一路通过它。传递这些数据的最好方法是什么,以便在reduce2步骤中我可以从map2和map1获取数据?Hadoop:在连续的mapreduce任务之间传递数据

感谢

+0

你根本不想减少1?还是在少数情况下,您将需要数据通过reduce1和reduce2? – 2014-10-17 11:15:15

+0

不,我需要reduce1的输出 - 它会传递给map2。我的观点是,reduce1不需要map1输出的一部分,但需要reduce2,所以我不希望这部分数据通过整个链。 – 2014-10-17 11:20:01

+0

基本上,在map1过程中,我计算A和B,其中A将传递给reduce1并在那里处理,而B将传递给reduce2,它将与map2的输出一起处理它。 – 2014-10-17 11:22:03

回答

1

根据您的意见,您从映射器1.然后输出一个,你想一个去减速机1和去机2,沿与映射器2. 我可以看到最好的选择的输出如下:

作业1:
为了区分AB,在第一份工作中使用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); 

其中MultipleInputsimport org.apache.hadoop.mapred.lib.MultipleInputs;

您不能在reducer 2中获取数据,并以与处理mapper 2输出相同的方式处理它们,除非您也使用mapper。一般来说,你不能在没有映射器的情况下使用reducer。最接近的就是使用IdentityMapper。

如果你要处理以另一种方式,那么,你可以让他们通过分布式缓存,或者如果它是一个单一的NUMER或两个,只设置一个变量,这个值,使用conf.set("variableName", variableValue);。然后,您可以使用conf.get("variableName", defaultValue);在减速器2的setup()方法中获得此值。

+0

非常感谢这么全面的回复!我想过使用MultipleOutputs,但从来没有考虑MultipleInputs。 – 2014-10-20 10:20:28

+0

我很高兴它帮助:) – vefthym 2014-10-20 10:30:30