我想在Hadoop中为我的地图任务共享大内存静态数据(RAM lucene索引)?有几种map / reduce任务可以共享同一个JVM吗?
答案 0 :(得分:9)
作业可以通过指定作业配置mapred.job.reuse.jvm.num.tasks来重用任务JVM。如果值为1(缺省值),则不重用JVM(即每个JVM 1个任务)。如果为-1,则JVM可以运行的任务数量(同一作业)没有限制。也可以使用api指定大于1的某个值。
答案 1 :(得分:4)
在$HADOOP_HOME/conf/mapred-site.xml
中添加以下属性
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>#</value>
</property>
可以将#
设置为一个数字,以指定JVM的重用次数(默认为1
),或设置为-1
,以便不再重复使用量。
答案 2 :(得分:0)
无耻插头
我使用JVM重用的静态对象来完成你在这里描述的内容: http://chasebradford.wordpress.com/2011/02/05/distributed-cache-static-objects-and-fast-setup/
另一个选项,虽然更复杂,但是使用带有只读内存映射文件的分布式缓存。这样,您也可以跨JVM进程共享资源。
答案 3 :(得分:0)
据我所知,多个地图任务(Hadoop)没有简单的方法来共享静态数据结构。
这实际上是当前Map Reduce模型的已知问题。当前实现不跨地图任务共享静态数据的原因是因为Hadoop被设计为高度可靠。因此,如果任务失败,它将只会崩溃自己的JVM。它不会影响其他JVM的执行。
我目前正在开发一种原型,可以将单个JVM的工作分配到多个核心(实际上,您只需要一个JVM来利用多核)。这样,您可以减少内存数据结构的重复,而不会降低CPU利用率。对我来说,下一步是开发一个可以在一个JVM中运行多个Map任务的Hadoop版本,这正是您所要求的。
这里有一篇有趣的帖子 https://issues.apache.org/jira/browse/MAPREDUCE-2123