java - hadoop - map reduce 任务和静态变量

标签 java hadoop cloudera

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

比方说,我们有一个带有 main 和静态变量的 java 类。该类定义了对应于 Mapper 和 Reducer 任务的内部类。 在启 Action 业之前,主要初始化静态变量。该变量在 Mapper 类中读取。然后在集群上使用“hadoop jar”启动该类。

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

最佳答案

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

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

// 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");
    }
}

关于java - hadoop - map reduce 任务和静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24280415/

相关文章:

java - 为什么方法在异步嵌套异常堆栈跟踪中不会出现两次?

java - 通过 Maven 集成测试 Flex/Java Web 应用程序的最佳方法?

java - 设计问题 - 带有枚举实现接口(interface)的模板模式

eclipse - 为 mapreduce 程序选择哪个 eclipse?

hadoop - 调用getSplit hadoop 2.0.0-cdh4.0.0时出现IncompatibleClassChangeError

java - 在斯坦福解析器的树中提取引理

hadoop - 从 udf 访问 hdfs 文件

hadoop - 从命令行获取 oozie sqoop 操作的日志

hadoop - 无法连接到 oozie 服务器(错误代码 : 500)

hadoop - 使用Flume将推文写入HDFS不起作用