Hadoop Map减少引用静态对象

时间:2012-10-17 13:44:53

标签: hadoop mapreduce

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

static MyObject obj;

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

obj = new MyObject();
obj.init();

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

obj.execute();

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

3 个答案:

答案 0 :(得分:7)

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

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

为工作

job.getConfiguration().set("some key", "json string")

for mapper

Configuration conf = context.getConfiguration();
conf.get("some key");

答案 1 :(得分:3)

您的main()不会在每个节点上调用,它只会在您启动作业的地方运行。为了能够访问您的静态对象,需要在映射器的实例化时初始化它。这样,初始化将在运行map任务的每个节点上发生。

但是可能还有另一种方法可以完成你想要完成的任务,所以问题是,这个静态对象做了什么?

答案 2 :(得分:0)

由于我的对象实际上是在加载库,所以我最终使用了分布式缓存,只是在M / R方法中实例化对象。