使用hadoop指定内存限制

时间:2011-11-05 01:25:43

标签: java hadoop

我正在尝试在Hadoop集群上运行高内存作业(0.20.203)。我修改了mapred-site.xml以强制执行一些内存限制。

  <property>
    <name>mapred.cluster.max.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapred.cluster.max.reduce.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapred.cluster.map.memory.mb</name>
    <value>2048</value>
  </property>
  <property>
    <name>mapred.cluster.reduce.memory.mb</name>
    <value>2048</value>
  </property>

在我的工作中,我正在指定我需要多少内存。不幸的是,即使我使用-Xmx2g运行我的进程(作为控制台应用程序,这个工作将运行得很好)我需要为我的mapper请求更多的内存(作为一个子问题,为什么这个? )或者它被杀死了。

val conf = new Configuration()
conf.set("mapred.child.java.opts", "-Xms256m -Xmx2g -XX:+UseSerialGC");
conf.set("mapred.job.map.memory.mb", "4096");
conf.set("mapred.job.reduce.memory.mb", "1024");

因为我正在执行身份缩减器,所以reducer几乎不需要任何内存。

  class IdentityReducer[K, V] extends Reducer[K, V, K, V] {
    override def reduce(key: K,
        values: java.lang.Iterable[V],
        context:Reducer[K,V,K,V]#Context) {
      for (v <- values) {
        context write (key, v)
      }
    }
  }

但是,reducer仍然使用大量内存。是否有可能为reducer提供与mapper不同的JVM参数? Hadoop杀死了减速器并声称它正在使用3960 MB的内存!减速器最终失败了。这怎么可能?

TaskTree [pid=10282,tipID=attempt_201111041418_0005_r_000000_0] is running beyond memory-limits.
Current usage : 4152717312bytes.
Limit : 1073741824bytes.
Killing task.

更新:即使我指定一个流媒体作业cat作为映射器而uniq作为reducer,-Xms512M -Xmx1g -XX:+UseSerialGC我的任务也需要2g以上的虚拟内存!这似乎是最大堆大小的4倍。

TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits.
Current usage : 2186784768bytes.
Limit : 2147483648bytes.
Killing task.

更新:用于更改内存使用配置格式的original JIRA特别提到Java用户最感兴趣的是物理内存以防止颠簸。我认为这正是我想要的:如果物理内存不足,我不希望节点启动映射器。但是,这些选项似乎都是作为虚拟内存约束实现的,难以管理。

1 个答案:

答案 0 :(得分:6)

检查你的ulimit。来自Cloudera,版本0.20.2,但类似的问题可能适用于更高版本:

  

...如果你设置mapred.child.ulimit,重要的是它必须更多   mapred.child.java.opts中设置的堆大小值的两倍以上。对于   例如,如果设置1G堆,请将mapred.child.ulimit设置为2.5GB。儿童   现在保证进程至少分叉一次,并且fork   暂时需要两倍的虚拟内存开销。

以编程方式设置mapred.child.java.opts也可能“为时已晚”;您可能想验证它是否真的生效,如果没有,请将它放在mapred-site.xml中。