【发布时间】:2011-06-20 03:30:32
【问题描述】:
我想在 Hadoop 中为我的地图任务共享大量内存静态数据(RAM lucene 索引)?有没有办法让多个 map/reduce 任务共享同一个 JVM?
【问题讨论】:
标签: lucene jvm hadoop hadoop-plugins
我想在 Hadoop 中为我的地图任务共享大量内存静态数据(RAM lucene 索引)?有没有办法让多个 map/reduce 任务共享同一个 JVM?
【问题讨论】:
标签: lucene jvm hadoop hadoop-plugins
作业可以通过指定作业配置 mapred.job.reuse.jvm.num.tasks 来启用任务 JVM 的重用。如果值为 1(默认值),则不重用 JVM(即每个 JVM 1 个任务)。如果为 -1,则 JVM 可以运行(同一个作业)的任务数没有限制。也可以使用 api 指定大于 1 的值。
【讨论】:
在$HADOOP_HOME/conf/mapred-site.xml 中添加关注属性
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>#</value>
</property>
# 可以设置为一个数字来指定 JVM 被重用的次数(默认为 1),或者设置为 -1 以不限制重用量。
【讨论】:
无耻的塞
我回顾了使用带有 JVM 重用的静态对象来完成您在此处描述的内容: http://chasebradford.wordpress.com/2011/02/05/distributed-cache-static-objects-and-fast-setup/
另一种选择,虽然更复杂,是使用带有只读内存映射文件的分布式缓存。这样,您也可以在 JVM 进程之间共享资源。
【讨论】:
据我所知,多个地图任务 (Hadoop) 共享静态数据结构并不容易。
这实际上是当前 Map Reduce 模型的一个已知问题。当前实现不跨地图任务共享静态数据的原因是因为 Hadoop 被设计为高度可靠的。因此,如果一个任务失败了,它只会让自己的 JVM 崩溃。它不会影响其他 JVM 的执行。
我目前正在开发一个原型,该原型可以将单个 JVM 的工作分配给多个内核(本质上,您只需要一个 JVM 即可利用多核)。这样,您可以减少内存中数据结构的重复,而不会消耗 CPU 利用率。我的下一步是开发一个 Hadoop 版本,它可以在一个 JVM 中运行多个 Map 任务,这正是您所要求的。
这里有一个有趣的帖子 https://issues.apache.org/jira/browse/MAPREDUCE-2123
【讨论】: