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