在MapReduce作业配置中设置参数

时间:2012-11-05 09:07:18

标签: hadoop mapreduce

是否可以通过Mapper在作业配置中设置参数,并且可以从Reducer访问。

我尝试了以下代码

在Mapper中:map(..)context.getConfiguration().set("Sum","100"); 在reducer中:reduce(..)context.getConfiguration().get("Sum");

但是在reducer值中返回null

有没有办法实现这个或任何遗漏在我身边的事情?

2 个答案:

答案 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类中修复问题。这是我唯一能看到的东西。