我想在 Hadoop 中为我的地图任务共享大量内存静态数据(RAM lucene 索引)?有没有办法让几个 map/reduce 任务共享同一个 JVM?
4 回答
作业可以通过指定作业配置 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