hadoop - map reduce任务和静态变量

时间:2014-06-18 08:17:16

标签: java hadoop cloudera

我刚刚开始研究一些hadoop / hbase MapReduce作业(使用cloudera),我有以下问题:

假设我们有一个带有main和static viariable的java类。该类定义了与Mapper和Reducer任务相对应的内部类。 在lauching the job之前,main初始化静态变量。在Mapper类中读取此变量。然后使用群集上的“hadoop jar”启动该类。

我的问题:我没有看到其他节点上的Map和Reduce任务如何看到该静态变量。是否有任何“hadoop magic”允许节点共享jvm或静态变量?这怎么可能工作? 我必须在这样做的一个类上工作,我无法弄清楚在非单一节点集群中这是如何可行的。 谢谢

1 个答案:

答案 0 :(得分:3)

在分布式Hadoop集群中,每个Map / Reduce任务都在其自己独立的JVM中运行。因此,无法在不同JVM(甚至不同节点)上运行的不同类实例之间共享静态变量。

但是如果你想在任务之间共享一些不可变数据,你可以使用Configuration class:

// driver code
Configuration config = Configuration.create();
config.setLong("foo.bar.somelong",1337);
...

// mapper code
public class SomeMapper ... {
    private long someLong = 0;
    public void setup(Context context) {
        Configuration config = context.getConfiguration();
        someLong = config.getLong("foo.bar.somelong");
    }
}
相关问题