有什么方法可以在作业配置中设置参数,Mapper
并且可以从Reducer
.
我尝试了下面的代码
在映射器 中map(..)
::context.getConfiguration().set("Sum","100");
在减速器中reduce(..)
::context.getConfiguration().get("Sum");
但在 reducer 中,值返回为null
.
有什么方法可以实现这一点或我遗漏的任何事情吗?
据我所知,这是不可能的。作业配置在运行时由作业跟踪器序列化为 XML,并复制到所有任务节点。对 Configuration 对象的任何更改只会影响该对象,该对象是特定任务 JVM 的本地对象;它不会更改每个节点的 XML。
一般来说,您应该尽量避免任何“全局”状态。它违反 MapReduce 范式,通常会阻止并行性。如果您绝对必须在 Map 和 Reduce 阶段之间传递信息,并且您无法通过通常的 Shuffle/Sort 步骤来完成,那么您可以尝试写入分布式缓存或直接写入 HDFS。
如果您使用新的 API,您的代码应该可以正常工作。您是否在创建工作开始时创建了这个“总和”属性?例如像这样
Configuration conf = new Configuration();
conf.set("Sum", "0");
Job job = new Job(conf);
如果不是你最好使用
context.getConfiguration().setIfUnset("Sum","100");
在您的映射器类中解决问题。这是我唯一能看到的。