【Hadoop】运行MR任务,出现Container is running beyond physical memory limits错误

运行一次任务,运行了很长时间,出现了 ***Container is running beyond physical memory limits***的错误。
Container [pid=27842,containerID=container_XXXXX] is running beyond physical memory limits. Current usage: 8.3 GB of 8 GB physical memory used; 5.1 GB of 16.8 GB virtual memory used. Killing container.
这里只给比较重要的错误日志。很明显的提示内存溢出了。
这里注意这几个数字:8.3G,8G,5.1G,16.8G
分别代表着:
8.3G——>任务所占的物理内存 (内存条)
8G——>mapreduce.map.memory.mb 参数默认设置大小
5.1G——>任务占用的虚拟内存
16.8G——>mapreduce.map.memory.mb 乘以 yarn.nodemanager.vmem-pmem-ratio
yarn.nodemanager.vmem-pmem-ratio 是 虚拟内存和物理内存比例,在yarn-site.xml中设置,默认是2.1
注意:

物理内存:内存条
虚拟内存:利用磁盘空间虚拟划出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(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>
  1. 增大mapreduce.map.memory.mb
  2. 适当增大 yarn.nodemanager.vmem-pmem-ratio的大小,为物理内存增大对应的虚拟内存, 但是这个参数也不能太离谱

除了这些之外,还需要检查一下自己的代码是否可以在优化一下,尽量少创建新对象。

参考文章:
原文链接:https://blog.csdn.net/abysscarry/article/details/80331311

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值