3

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

4

4 回答 4

9

作业可以通过指定作业配置 mapred.job.reuse.jvm.num.tasks 来启用任务 JVM 的重用。如果值为 1(默认值),则不重用 JVM(即每个 JVM 1 个任务)。如果为 -1,则 JVM 可以运行(同一个作业)的任务数没有限制。也可以使用 api 指定大于 1 的值。

于 2011-02-02T18:09:13.750 回答
4

$HADOOP_HOME/conf/mapred-site.xml添加以下属性

<property>
    <name>mapred.job.reuse.jvm.num.tasks</name>
    <value>#</value>
</property>

#可以设置为一个数字来指定 JVM 被重用的次数(默认为)1,或者设置为-1对重用量没有限制。

于 2011-02-02T18:10:49.690 回答
0

无耻的插头

我使用带有 JVM 重用的静态对象来完成您在此处描述的内容:http: //chasebradford.wordpress.com/2011/02/05/distributed-cache-static-objects-and-fast-setup/

另一种选择,虽然更复杂,是使用带有只读内存映射文件的分布式缓存。这样,您也可以跨 JVM 进程共享资源。

于 2011-07-21T17:04:47.137 回答
0

据我所知,多个地图任务(Hadoop)没有简单的方法来共享静态数据结构。

这实际上是当前 Map Reduce 模型的一个已知问题。当前实现不跨地图任务共享静态数据的原因是因为 Hadoop 被设计为高度可靠的。因此,如果一个任务失败了,它只会让自己的 JVM 崩溃。它不会影响其他 JVM 的执行。

我目前正在开发一个原型,它可以将单个 JVM 的工作分布在多个内核上(本质上你只需要一个 JVM 来利用多内核)。这样,您可以减少内存中数据结构的重复,而不会消耗 CPU 利用率。对我来说,下一步是开发一个 Hadoop 版本,它可以在一个 JVM 中运行多个 Map 任务,这正是您所要求的。

这里有一篇有趣的帖子 https://issues.apache.org/jira/browse/MAPREDUCE-2123

于 2013-09-27T02:30:56.110 回答