Hadoop Map减少引用静态对象

use*_*350 2 hadoop mapreduce

我在我的地图reduce作业类中有一个静态对象,我想初始化一次(在main方法中),然后在每个映射中调用一个函数.所以我有这个对象,MyObject,我声明为一个变量:

static MyObject obj;
Run Code Online (Sandbox Code Playgroud)

在我的主要功能中,在我开始工作之前,我打电话给:

obj = new MyObject();
obj.init();
Run Code Online (Sandbox Code Playgroud)

然后在我的地图函数中我想调用:

obj.execute();
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,当我尝试这个时,我得到一个空指针异常(它表示obj为null).如果我在main函数中初始化它,映射器是否应该将其视为已初始化?映射器是否看到静态变量?

ban*_*ara 7

静态对象驻留在内存中.现在,您的系统是分布式的,因此您创建的对象位于您的jobtracker不在其他系统上运行的节点的内存中.

现在你不能将对象从job传递给mapper,因为config被写成xml,但是有一个解决方法,将你的对象序列化为JSON然后把它作为字符串放在你的配置中并在mappers中反序列化这个json对象

为了工作

job.getConfiguration().set("some key", "json string")
Run Code Online (Sandbox Code Playgroud)

对于mapper

Configuration conf = context.getConfiguration();
conf.get("some key");
Run Code Online (Sandbox Code Playgroud)