解决yarn上的MapReduce作业失败问题container XXXX is running beyond physical memory limits

解决yarn上的MapReduce作业失败问题container XXXX is running beyond physical memory limits

一、现象

[2022-11-14 09:16:00.366]Container [pid=25361,containerID=container_1663236319426_53633_01_000003] is running 1286144B beyond the 'PHYSICAL' memory limit. Current usage: 1.0 GB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used. Killing container. Dump of the process-tree for container_1663236319426_53633_01_000003 : |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE |- 25361 25359 25361 25361 (bash) 0 0 9797632 288 /bin/bash -c /usr/java/jdk1.8.0_181-cloudera/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Djava.net.preferIPv4Stack=true -Xmx820m -Djava.io.tmpdir=/dfs/dn/yarn/nm/usercache/airflow/appcache/application_1663236319426_53633/container_1663236319426_53633_01_000003/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/dfs/dn/yarn/container-logs/application_1663236319426_53633/container_1663236319426_53633_01_000003 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 172.16.24.84 45614 attempt_1663236319426_53633_m_000000_1 3 1>/dfs/dn/yarn/container-logs/application_1663236319426_53633/container_1663236319426_53633_01_000003/stdout 2>/dfs/dn/yarn/container-logs/application_1663236319426_53633/container_1663236319426_53633_01_000003/stderr |- 25372 25361 25361 25361 (java) 11240 96 2624450560 262170 /usr/java/jdk1.8.0_181-cloudera/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Djava.net.preferIPv4Stack=true -Xmx820m -Djava.io.tmpdir=/dfs/dn/yarn/nm/usercache/airflow/appcache/application_1663236319426_53633/container_1663236319426_53633_01_000003/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/dfs/dn/yarn/container-logs/application_1663236319426_53633/container_1663236319426_53633_01_000003 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 172.16.24.84 45614 attempt_1663236319426_53633_m_000000_1 3 [2022-11-14 09:16:00.392]Container killed on request. Exit code is 143 [2022-11-14 09:16:00.394]Container exited with a non-zero exit code 143.

在这里插入图片描述
是hive在 yarn 上运行时报的虚拟内存错误,或者是物理内存不够错误。

二、错误原因

container_1663236319426_53633_01_000003] is running 1286144B beyond the 'PHYSICAL' memory limit.
Current usage: 1.0 GB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used

三、异常分析

  • 1.0 GB: 任务所占的物理内存
  • 1GB 是mapreduce.map.memory.mb 设置的
  • 2.5 GB 是程序占用的虚拟内存: 什么是虚拟内存以及和物理内存的关系
  • 2.1GB 是mapreduce.map.memory.db 乘以 yarn.nodemanager.vmem-pmem-ratio 得到的
    其中yarn.nodemanager.vmem-pmem-ratio 是 虚拟内存和物理内存比例,在yarn-site.xml中设置,默认是2.1, , 所以 1*2.1 = 2.1GB

很明显,container占用了2.5 GB的虚拟内存,但是分配给container的却只有2.1GB。所以kill掉了这个container

上面只是map中产生的报错,当然也有可能在reduce中报错,如果是reduce中,那么就是mapreduce.reduce.memory.db * yarn.nodemanager.vmem-pmem-ratio

物理内存:内存条
虚拟内存:利用磁盘空间虚拟划出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。(为了满足物理内存的不足而提出的策略) 
linux会在物理内存不足时,使用交换分区的虚拟内存。内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

四、解决办法

  • 1.如果集群数量多,增加map或者reduce的个数,均衡一下。

  • 2.取消内存的检查(不建议)
    在yarn-site.xml或者程序中中设置yarn.nodemanager.vmem-check- enabled为false

# 物理内存检查
<property>
  <name>yarn.nodemanager.pmem-check-enabled </name>
  <value>false</value>
  <description>Whether physical memory limits will be enforced for containers.</description>
</property>
# 虚拟内存检查
<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
  <description>Whether virtual memory limits will be enforced for containers.</description>
</property>

除了虚拟内存超了,也有可能是物理内存超了,同样也可以设置物理内存的检查为false: yarn.nodemanager.pmem-check-enabled
个人认为这种办法并不太好,如果程序有内存泄漏等问题,取消这个检查,可能会导致集群崩溃。

  • 3.增大mapreduce.map.memory.mb 或者 mapreduce.reduce.memory.mb
    应该优先考虑这种办法,这种办法不仅仅可以解决虚拟内存,或许大多时候都是物理内存不够了,这个办法正好适用.

  • 4.适当增大 yarn.nodemanager.vmem-pmem-ratio的大小,为物理内存增大对应的虚拟内存, 但是这个参数也不能太离谱

  • 5.编辑etc/hadoop/mapred-site.xml(强烈建议)
    配置mapreduce-site.xml

<property>
    <name>mapreduce.map.memory.mb</name>
    <value>2048</value>
    <description>对maps更大的资源限制的</description>
  </property>
 
  <property>
      <name>mapreduce.reduce.memory.mb</name>
    <value>2048</value>
    <description>设置 reduces对于较大的资源限制</description>
  </property>
 
  <property>
    <name>mapreduce.map.java.opts</name>
    <value>-Xmx2560m</value>
    <description>maps中对jvm child设置更大的堆大小</description>
  </property>
 
  <property>
    <name>mapreduce.reduce.java.opts</name>
    <value>-Xmx4608m</value>
    <description>reduces对 jvm child设置更大的堆大小</description>
  </property>

配置完成分发到从节点,重新启动各个节点,查看一下我们的设置内存的情况,由此可见,配置成功。

hive> set mapreduce.map.memory.mb;
mapreduce.map.memory.mb=2048
hive> set mapreduce.reduce.memory.mb;
mapreduce.reduce.memory.mb=2048

再使用hive跑任务,问题解决

  • 6、如果任务所占用的内存太过离谱,更多考虑的应该是程序是否有内存泄漏,是否存在数据倾斜等,优先程序解决此类问题。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值