hadoop map reduce引用静态对象

pzfprimi  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(314)

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

static MyObject obj;

在我开始工作之前,我的主要职责是:

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

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

obj.execute();

但是由于某些原因,当我尝试这个方法时,我得到了一个空指针异常(它说obj是空的)。如果我在main函数中初始化它,Map程序不应该将其视为已初始化吗?Map器是否看到静态变量?

tjvv9vkg

tjvv9vkg1#

因为我的对象实际上是在加载一个库,所以我最终使用了分布式缓存,只是在m/r方法中示例化了对象。

flvlnr44

flvlnr442#

静态对象驻留在内存中。现在,您的系统是分布式的,所以您创建的对象位于运行jobtracker的节点的内存中,而不是在其他系统上。
现在您不能将对象从job传递到mapper,因为config是用xml编写的,但是有一个解决方法,将对象序列化为json,然后在配置中将其作为字符串,并在mappers中反序列化这个json对象
为了工作

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

对于mapper

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

bfhwhh0e3#

main()并不是在每个节点上都被调用,它只在启动作业的地方运行。为了访问静态对象,需要在Map器示例化时对其进行初始化。这样,初始化将在运行map任务的每个节点上进行。
但是可能还有另一种方法来完成你想要完成的任务,所以问题是,这个静态对象做什么?

相关问题