0

我无法找出配置我的 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 设置是有问题的,因为它似乎实际上并没有将单个任务限制在较低数量的堆中(如果有更多),而是允许任务使用过多内存,然后在使用时终止进程。

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

4

1 回答 1

2

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

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

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

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

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

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

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

于 2013-09-14T04:19:47.750 回答