【问题标题】:AM Container is running beyond virtual memory limitsAM Container 的运行超出了虚拟内存限制
【发布时间】:2012-12-16 03:13:11
【问题描述】:

我在玩分布式 shell 应用程序 (hadoop-2.0.0-cdh4.1.2)。 这是我目前收到的错误。

13/01/01 17:09:09 INFO distributedshell.Client: Got application report from ASM for, appId=5, clientToken=null, appDiagnostics=Application application_1357039792045_0005 failed 1 times due to AM Container for appattempt_1357039792045_0005_000001 exited with  exitCode: 143 due to: Container [pid=24845,containerID=container_1357039792045_0005_01_000001] is running beyond virtual memory limits. Current usage: 77.8mb of 512.0mb physical memory used; 1.1gb of 1.0gb virtual memory used. Killing container.
Dump of the process-tree for container_1357039792045_0005_01_000001 :
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
|- 24849 24845 24845 24845 (java) 165 12 1048494080 19590 /usr/java/bin/java -Xmx512m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 128 --num_containers 1 --priority 0 --shell_command ping --shell_args localhost --debug
|- 24845 23394 24845 24845 (bash) 0 0 108654592 315 /bin/bash -c /usr/java/bin/java -Xmx512m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 128 --num_containers 1 --priority 0 --shell_command ping --shell_args localhost --debug 1>/tmp/logs/application_1357039792045_0005/container_1357039792045_0005_01_000001/AppMaster.stdout 2>/tmp/logs/application_1357039792045_0005/container_1357039792045_0005_01_000001/AppMaster.stderr 

有趣的是,设置似乎没有问题,因为一个简单的lsuname 命令成功完成并且输出在container2 标准输出中可用。

关于设置,yarn.nodenamager.vmem-pmem-ratio3,可用的总物理内存为 2GB,我认为这对于运行来说已经绰绰有余了。

对于有问题的命令,“ping localhost”产生了两个回复,从containerlogs/container_1357039792045_0005_01_000002/721917/stdout/?start=-4096.可以看出

那么,问题出在哪里?

【问题讨论】:

    标签: hadoop cloudera hadoop-yarn


    【解决方案1】:

    好的,知道了。将主内存参数增加到 750MB 以上,您将成功运行 YARN 应用程序。

    【讨论】:

    • 提及您在哪里找到的参数和任何参考资料会很有帮助。
    【解决方案2】:

    从错误消息中,您可以看到您使用的虚拟内存超过了当前的 1.0gb 限制。这可以通过两种方式解决:

    禁用虚拟内存限制检查

    YARN 将简单地忽略限制;为此,请将其添加到您的yarn-site.xml

    <property>
      <name>yarn.nodemanager.vmem-check-enabled</name>
      <value>false</value>
      <description>Whether virtual memory limits will be enforced for containers.</description>
    </property>
    

    此设置的默认值为true

    提高虚拟内存与物理内存的比率

    在您的 yarn-site.xml 中将其更改为高于当前设置的值

    <property>
      <name>yarn.nodemanager.vmem-pmem-ratio</name>
      <value>5</value>
      <description>Ratio between virtual memory to physical memory when setting memory limits for containers. Container allocations are expressed in terms of physical memory, and virtual memory usage is allowed to exceed this allocation by this ratio.</description>
    </property>
    

    默认为2.1

    您还可以增加分配给容器的物理内存量。

    确保在更改配置后不要忘记重新启动 yarn。

    【讨论】:

    • 这个解决方案完全符合 tmlye 的定义。万分感谢!节省了我很多时间。注意 - 您必须重新启动 yarn stop-yarn.sh/start-yarn.sh
    【解决方案3】:

    无需更改集群配置。我发现只提供额外的参数

    -Dmapreduce.map.memory.mb=4096
    

    到 distcp 对我有帮助。

    【讨论】:

    • 谢谢,你救了我的命 :) 我认为我必须更改配置并重新启动整个集群,但增加内存也适用于我的情况。也在运行distcp
    • 很高兴它有帮助!我意识到最初的问题不是关于distcp,但我认为它基本上是相同的问题,应该有相同的解决方案。
    • 也帮助了我。谢谢!
    【解决方案4】:

    如果你运行的是 Tez 框架,必须在 Tez-site.xml 中设置以下参数

    tez.am.resource.memory.mb
    tez.task.resource.memory.mb
    tez.am.java.opts
    

    在 Yarn-site.xml 中

    yarn.nodemanager.resource.memory-mb
    yarn.scheduler.minimum-allocation-mb
    yarn.scheduler.maximum-allocation-mb
    yarn.nodemanager.vmem-check-enabled
    yarn.nodemanager.vmem-pmem-ratio
    

    所有这些参数都是必须设置的

    【讨论】:

      【解决方案5】:

      您可以在您的 yarn-site.xml 中将其更改为高于默认 1 GB 的值

      yarn.app.mapreduce.am.resource.mb

      【讨论】:

        【解决方案6】:

        在实践中,我发现在对大表或包含大量文件/小文件或未分桶表的表运行查询或查询大量分区时会出现此问题。

        当 Tez 尝试计算需要生成多少个映射器时会出现问题,并且在进行此计算时,由于默认 (1gb) 太少,它往往会出现 OOM。

        解决此问题的方法是不要将tez.am.resource.memory.mb 设置为 2gb 或 4gb。 此外,另一件非常重要的事情是,不能从 hive 查询中设置此设置,因为到那时为时已晚。 AM 是第一个由 yarn 生成的容器,因此在 hive 查询中设置它没有用。

        该设置需要在 *-site.xml 中设置,或者在生成 hive shell 时设置,如下所示:

        hive --hiveconf tez.am.resource.memory.mb=2048 my-large-query.hql

        在上面的示例中,am 向 yarn 发出信号以生成 2gb 的 AM,而不是默认值。

        参考:http://moi.vonos.net/bigdata/hive-cli-memory/

        【讨论】:

          猜你喜欢
          • 2017-09-12
          • 2018-10-13
          • 2017-08-20
          • 1970-01-01
          • 1970-01-01
          • 2015-06-17
          • 1970-01-01
          • 2018-11-01
          • 2018-03-30
          相关资源
          最近更新 更多