4

有什么方法可以在作业配置中设置参数,Mapper并且可以从Reducer.

我尝试了下面的代码

在映射器 中map(..) ::context.getConfiguration().set("Sum","100"); 在减速器中reduce(..)::context.getConfiguration().get("Sum");

但在 reducer 中,值返回为null.

有什么方法可以实现这一点或我遗漏的任何事情吗?

4

2 回答 2

3

据我所知,这是不可能的。作业配置在运行时由作业跟踪器序列化为 XML,并复制到所有任务节点。对 Configuration 对象的任何更改只会影响该对象,该对象是特定任务 JVM 的本地对象;它不会更改每个节点的 XML。

一般来说,您应该尽量避免任何“全局”状态。它违反 MapReduce 范式,通常会阻止并行性。如果您绝对必须在 Map 和 Reduce 阶段之间传递信息,并且您无法通过通常的 Shuffle/Sort 步骤来完成,那么您可以尝试写入分布式缓存或直接写入 HDFS。

于 2012-11-05T22:12:47.730 回答
0

如果您使用新的 API,您的代码应该可以正常工作。您是否在创建工作开始时创建了这个“总和”属性?例如像这样

Configuration conf = new Configuration();
conf.set("Sum", "0");
Job job = new Job(conf);

如果不是你最好使用

context.getConfiguration().setIfUnset("Sum","100");

在您的映射器类中解决问题。这是我唯一能看到的。

于 2012-11-05T10:11:28.220 回答