运行一次任务,运行了很长时间,出现了 ***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会在物理内存不足时,使用交换分区的虚拟内存。内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。
这种错误在可能出现在物理内存也可能是因为虚拟内存不足造成的。
解决办法
- 如果集群数量多,增加map或者reduce的个数,均衡一下。
- 取消内存的检查(不建议)
在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>
- 增大mapreduce.map.memory.mb
- 适当增大 yarn.nodemanager.vmem-pmem-ratio的大小,为物理内存增大对应的虚拟内存, 但是这个参数也不能太离谱
除了这些之外,还需要检查一下自己的代码是否可以在优化一下,尽量少创建新对象。
参考文章:
原文链接:https://blog.csdn.net/abysscarry/article/details/80331311