是否可以在一个JVM中运行多个map任务?

时间:2011-02-02 17:29:44

标签: lucene jvm hadoop hadoop-plugins

我想在Hadoop中为我的地图任务共享大内存静态数据(RAM lucene索引)?有几种map / reduce任务可以共享同一个JVM吗?

4 个答案:

答案 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