gpt4 book ai didi

java - Hadoop:在连续的 mapreduce 任务之间传递数据

转载 作者:可可西里 更新时间:2023-11-01 15:35:15 25 4
gpt4 key购买 nike

我通过以下方式链接了 mapreduce 作业:map1 -> reduce1 -> map2 -> reduce2作为副作用,在 map1 步骤期间,我计算了仅在 reduce2 步骤期间需要的数据,因此我不想将它一直传递到链中。传递此数据的最佳方式是什么,以便在 reduce2 步骤中我可以从 map2 和 map1 获取数据?

谢谢

最佳答案

根据您的评论,您从映射器 1 输出 AB。然后,您希望 A 转到 reducer 1 和 < em>B 与 mapper 2 的输出一起转到 reducer 2。我能看到的最佳选择如下:

作业 1:
要区分 AB,请在第一个作业中使用 MultipleOutputs...为类型使用通用前缀(例如在值中)< em>B 映射器 1 的中间输出,将它们与类型 A 输出区分开来。在 reducer 1 中,当您看到前缀时,将其删除并在 B 输出路径中写入 B

作业 2:
在您的第二份工作中使用 MultipleInputs。将映射器 2 用于它处理的输入,将 IdentityMapper 用于 B。这将简单地将 B 转发到 reducer 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 中获取数据并以与处理映射器 2 输出相同的方式处理它们,除非您也为它们使用映射器。通常,您不能在没有映射器的情况下使用 reducer 。最接近的是使用 IdentityMapper。

如果你想以另一种方式处理B,那么,你可以通过分布式缓存获取它们,或者如果它是一个或两个数字,只需将这个值设置一个变量,使用conf.set("variableName", variableValue);。然后,您可以在 reducer 2 的 setup() 方法中使用 conf.get("variableName", defaultValue); 获取此值。

关于java - Hadoop:在连续的 mapreduce 任务之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26423361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com