【问题标题】:Flexible heap space allocation to Hadoop MapReduce Mapper tasks为 Hadoop MapReduce Mapper 任务灵活分配堆空间
【发布时间】:2013-09-11 22:47:50
【问题描述】:

我无法找出配置我的 Hadoop 集群 (CDH4) 并运行 MapReduce1 的最佳方式。我的情况是,我需要运行需要大量 Java 堆空间的两个映射器,以至于每个节点无法运行超过 1 个映射器 - 但同时我希望能够运行作业这可以从每个节点的许多映射器中受益。

我正在通过 Cloudera 管理 UI 配置集群,Max Map Tasks 和 mapred.map.child.java.opts 似乎是相当静态的设置。

我想要的是一个可用 X GB 的堆空间池之类的东西,它可以容纳两种类型的作业,而无需每次都重新配置 MapReduce 服务。如果我运行 1 个映射器,它应该分配 X GB 堆 - 如果我运行 8 个映射器,它应该分配 X/8 GB 堆。

我已经考虑了最大虚拟内存和 Cgroup 内存软/硬限制,但两者都无法得到我想要的。最大虚拟内存无效,因为它仍然是每个任务的设置。 Cgroup 设置是有问题的,因为它似乎实际上并没有将单个任务限制在较低数量的堆中,如果它们有更多,而是会允许任务使用过多的内存,然后在它使用时杀死进程。

可以配置我想要实现的行为吗?

【问题讨论】:

    标签: hadoop mapreduce cloudera


    【解决方案1】:

    (PS 您应该在 Hadoop 2 / CDH4 中使用此属性的新名称:mapreduce.map.java.opts。但两者仍应被识别。)

    您在集群中配置的值只是一个默认值。它可以在每个作业的基础上被覆盖。您应该保留 CDH 的默认值,或者将其配置为对法线映射器合理的值。

    仅对于您的高内存作业,在您的客户端代码中,在您提交之前为Job 设置Configuration 对象中的mapreduce.map.java.opts

    如果您正在运行 MR2/YARN,答案会变得更加复杂,因为它不再按“插槽”进行调度,而是按容器内存进行调度。因此,记忆以一种新的、不同的方式以新的、不同的属性进入画面。 (这让我很困惑,我什至在 Cloudera。)

    在某种程度上它会更好,因为你用内存来表达你的资源需求,这在这里很好。您还可以将 mapreduce.map.memory.mb 设置为比 JVM 堆大小大 30% 左右的大小,因为这是整个进程允许的内存。对于高内存作业,您会以同样的方式将其设置得更高。然后 Hadoop 可以决定运行多少个映射器,并决定在哪里为您放置工作器,并根据您的配置尽可能多地使用集群。不用对自己想象的资源池大惊小怪。

    在 MR1 中,这很难做到。从概念上讲,您希望通过mapreduce.tasktracker.map.tasks.maximum 将每个工作人员的最大映射器数设置为 1,以及您的堆设置,但仅适用于高内存作业。我不知道客户是否可以根据每个作业请求或设置它。我对此表示怀疑,因为它不太合理。您无法真正通过控制映射器的数量来解决这个问题,因为您必须四处寻找,更不用说控制它将运行的映射器的数量了。

    我认为操作系统级别的设置不会有帮助。在某种程度上,这些更像是 MR2 / YARN 对资源调度的看法。您最好的选择可能是(转移到 MR2 并)使用 MR2 的资源控制,然后让它解决剩下的问题。

    【讨论】:

    • 谢谢!我没有意识到这可以在每个作业配置级别进行设置。那应该这样做。在我看来,既然这是可能的,那么设置 Cgroup 设置是一个好主意,因为任何普通的集群用户都可能不小心请求一个太大的堆大小并开始关闭节点。我也会考虑迁移到 MR2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多