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