2013-04-20 44 views
2

如何让我的所有映射器都可以访问一个变量,例如TreeMap对象,而无需每个映射器每次都重新构造TreeMap?构建完成后,该对象将永远不会再被修改。mapreduce如何共享全局常量变量

回答

5

考虑将TreeMap对象的内容放在Distributed Cache中。如果数据量小,你可以将对象的内容在您的配置对象:

conf.set("key", "value"); 

然后使用JobConf对象来访问它在你的映射。

+0

感谢您的回答。但是,对于分布式缓存,我确实有一个问题,每个映射器要请求资源的开销是多少?理论上,我希望每个物理节点都有一份资源的副本,以便所有映射器都可以访问它,或者由于MapReduce可以跨越数千个节点,因此这是不可能的? – Jin 2013-04-20 21:29:39

+0

我正在共享的资源是数组中所有可能的单词的索引,以计算矢量相似性,因此它可能会高达几万条条目。 – Jin 2013-04-20 21:30:43

+1

@Jin将分布式缓存在启动之前复制到每个任务,因此访问分布式缓存是本地文件访问。 – 2013-04-21 07:33:46