【问题标题】:Is it possible to run several map task in one JVM?是否可以在一个 JVM 中运行多个地图任务?
【发布时间】:2011-06-20 03:30:32
【问题描述】:

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

【问题讨论】:

    标签: lucene jvm hadoop hadoop-plugins


    【解决方案1】:

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

    【讨论】:

    • 谢谢,还有一个问题。这些任务是否也共享一些类加载器,所以所有静态资源只会加载一次? (或者它可能像tomcat一样工作,那样几乎没有理由共享JVM......)
    • 任务完成后会清空JVM。此参数仅为非“长时间运行”的作业提供更好的运行时间,因为 jvm 实例化非常昂贵。您不能通过任务实例共享任何资源。
    【解决方案2】:

    $HADOOP_HOME/conf/mapred-site.xml 中添加关注属性

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

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

    【讨论】:

      【解决方案3】:

      无耻的塞

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

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

      【讨论】:

        【解决方案4】:

        据我所知,多个地图任务 (Hadoop) 共享静态数据结构并不容易。

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-11-26
          • 2013-03-01
          • 2018-05-18
          • 1970-01-01
          • 2020-08-16
          • 1970-01-01
          • 1970-01-01
          • 2012-05-28
          • 2021-10-29
          相关资源
          最近更新 更多