is running beyond virtual memory limits. Current usage: 53.7 MB of 1 GB physical memory used; 4.4 GB of 2.1 GB virtual memory used. Killing container.
容器使用超过了虚拟内存的限制大小,该容器被杀死,导致作业提交失败
physical memory used
由于使用了默认虚拟内存率(也就是2.1倍),所以对于Map Task和Reduce Task总的虚拟内存为都为1G*2.1=2.1G。而应用的虚拟内存4.4G超过了这个数值,故报错
解决方案:在启动Yarn是调节虚拟内存率或者应用运行时调节内存大小。
解决思路参考:
要解决这个异常,得熟悉yarn自身的虚拟内存管理规则,在Yarn平台中,CPU,内存,磁盘都被抽象成资源来自使用,管理资源的角色主要有Yarn Resource Manager (RM) 负责总的资源调度,然后每个节点上有Nodemanager 来监听守护资源,在具体到每一个应用上是通过Application Master (AM) container来给Map或Reduce任务来分配资源
具体的属性如下:
- yarn.nodemanager.resource.memory-mb
可分配的物理内存总量,默认是8*1024MB。 - yarn.nodemanager.vmem-pmem-ratio
每单位的物理内存总量对应的虚拟内存量,默认是2.1,表示每使用1MB的物理内存,最多可以使用2.1MB的虚拟内存总量。
第二个属性,比率的控制影响着虚拟内存的使用,当yarn计算出来的虚拟内存,比在mapred-site.xml里的mapreduce.map.memory.mb或mapreduce.reduce.memory.mb的2.1倍还要多时,就会发生上面截图中的异常,而默认的mapreduce.map.memory.mb或mapreduce.reduce.memory.mb得初始大小为1024M,然后根据异常中的yarn自身根据运行环境推算出来的虚拟内存来做比较,发现比1024*2.1</