灵活的堆空间分配到Hadoop MapReduce Mapper任务

时间:2013-09-11 22:47:51

标签: hadoop mapreduce cloudera

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

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

1 个答案:

答案 0 :(得分:2)

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

您在群集中配置的值仅是默认值。它可以在每个工作的基础上被覆盖。您应保留CDH的默认值,或将其配置为正常映射器的合理值。

仅针对您的高内存作业,在您的客户端代码中,在mapreduce.map.java.opts Configuration对象中为Job设置mapreduce.map.memory.mb

如果您运行MR2 / YARN,答案会变得更复杂,因为它不再按“插槽”计划,而是按容器内存计划。因此,记忆以新的,不同的方式进入图片,具有新的不同属性。 (这让我感到困惑,我甚至在Cloudera。)

在某种程度上它会更好,因为你用内存来表达你的资源需求,这在这里很好。您还可以将mapreduce.tasktracker.map.tasks.maximum设置为比JVM堆大小大约30%的大小,因为这是整个过程允许的内存。您可以通过相同的方式为高内存作业设置更高的值。然后,Hadoop可以决定运行多少个映射器,并决定将工作者放在哪里,并根据您的配置尽可能多地使用集群。不要因为你自己想象的资源池而烦恼。

在MR1中,这很难做到。从概念上讲,您希望通过{{1}}将每个工作器的最大映射器数设置为1,以及堆设置,但仅适用于高内存作业。我不知道客户端是否可以按工作请求或设置此项。我怀疑它,因为它没有多大意义。你不能真正通过控制映射器的数量来解决这个问题,因为你必须深入研究甚至控制它将运行的映射器的数量。

我不认为操作系统级设置会有所帮助。在某种程度上,这些更类似于MR2 / YARN对资源调度的看法。你最好的选择可能是(转移到MR2并使用MR2的资源控制,让它计算出其余部分。