java - 使用 hadoop 指定内存限制

标签 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 运行我的进程(作为控制台应用程序,作业将在这么多内存下运行得很好)我需要为我的映射器请求更多内存(作为一个子问题,这是为什么?)或者它被杀死了。

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 几乎不需要任何内存,因为我正在执行一个 identity 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 杀死 reducer 并声称它正在使用 3960 MB 内存! reducer 最终以失败告终。这怎么可能?

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

更新:即使我使用 cat 作为 mapper 和 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 for changing the configuration format for memory usage 特别提到 Java 用户最感兴趣的是物理内存以防止抖动。我认为这正是我想要的:如果可用物理内存不足,我不希望节点启动映射器。然而,这些选项似乎都是作为虚拟内存约束实现的,难以管理。

最佳答案

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

...if you set mapred.child.ulimit, it's important that it must be more than two times the heap size value set in mapred.child.java.opts. For example, if you set a 1G heap, set mapred.child.ulimit to 2.5GB. Child processes are now guaranteed to fork at least once, and the fork momentarily requires twice the overhead in virtual memory.

也有可能以编程方式设置 mapred.child.java.opts 是“太晚了”;您可能想验证它是否真的会生效,如果没有,则将其放入您的 mapred-site.xml 中。

关于java - 使用 hadoop 指定内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017500/

相关文章:

java - 访问 DefaultListModel 的索引时出现空指针异常

hadoop - Hbase 0.92.1 : how to fix . 元数据。 table ,因为它丢失了一些 regioninfo

Apache Hbase 安装

Hadoop 流式处理使用 shell 脚本 : reducer fails with error : No such file or directory

java - 如何减轻连接 com.mysql.jdbc.JDBC4Connection@11d08960 触发的连接泄漏,

java - 我可以使用运行时参数来修复 Java 中的错误 API 调用吗?

java - STOMP Websocket同步通信使用Spring

hadoop - Spark saveAsTextFile 创建目录

hadoop - 配置Flume从Twitter收集数据到HDFS

java - 两个客户端在java中向服务器发送消息