运行mapreduce 物理内存不够问题:

sqoop is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used; 1.6 GB of 2.1 GB virtual memory used. Killing container

运行一次任务,运行了很长时间,出现了 ***Container is running beyond physical memory limits***的错误。
Container [pid=27842,containerID=container_XXXXX] is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used; 1.6 GB of 2.1 GB virtual memory used. Killing container.

分别代表着:
1.0G——>任务所占的物理内存 (内存条)
1G——>mapreduce.map.memory.mb 参数默认设置大小
1.6G——>任务占用的虚拟内存
2.1G——>mapreduce.map.memory.mb 乘以 yarn.nodemanager.vmem-pmem-ratio  1G * 2.1=2.1G;
yarn.nodemanager.vmem-pmem-ratio 是 虚拟内存和物理内存比例,在yarn-site.xml中设置,默认是2.1
注意:


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


这种错误在可能出现在物理内存也可能是因为虚拟内存不足造成的。

解决办法
如果集群数量多,增加map或者reduce的个数,均衡一下。

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

在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的大小,为物理内存增大对应的虚拟内存, 但是这个参数也不能太离谱
除了这些之外,还需要检查一下自己的代码是否可以在优化一下,尽量少创建新对象。
. 如果任务所占用的内存太过离谱,更多考虑的应该是程序是否有内存泄漏,是否存在数据倾斜等,优先程序解决此类问题