Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

一、问题再现

由于项目需要,采购电信天翼云,由于是新搭建的集群,在yarn上跑Spark任务时,每个几个小时或者半天出现节点丢失(Lost Nodes),访问http://cloudera01:8088,如下图,可以看到2个节点和集群失去了联系

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

 

二、问题排查

1、登录cm管理界面

首先登录cm管理界面,去查看yarn的运行状况,看到2个NodeManager运行不良,点击不良链接

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

2、点击NodeManager查看

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

3、NodeManager与ResourceManager失联

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

这就去查看NodeManager的日志进一步查找问题,去查看cloudera03这台机日志

4、查看NodeManager日志

其日志默认路径在/var/log/hadoop-yarn下,less hadoop-cmf-yarn-NODEMANAGER-cloudera03.log.out

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

先看到container_1554798900283_0001_01_000008 与内存使用情况的日志

Memory usage of ProcessTree 11630 for container-id container_1554798900283_0001_01_000025: 695.6 MB of 2.5 GB physical memory used; 4.0 GB of 5.3 GB virtual memory used

之后该container_1554798900283_0001_01_000008 状态从RUNNING到KILLING

Container container_1554798900283_0001_01_000008 transitioned from RUNNING to KILLING

接着这个container_1554798900283_0001_01_000008 退出

Exit code from container container_1554798900283_0001_01_000008 is : 143

最终完成杀死,清理container相关信息,这大概就是一个container被杀死的过程

Container container_1554798900283_0001_01_000008 transitioned from KILLING to CONTAINER_CLEANEDUP_AFTER_KILL

根据以上情况,可以初步断定是由于NodeManager分配给container虚拟内存分配不足引起的自杀,从而缓解内存不足状况,保证其它container运行。

三、解决方案

1、问题分析

      相关属性说明

yarn.scheduler.minimum-allocation-mb 1024 分配给AM单个容器可申请的最小内存,默认1024M RM属性
yarn.scheduler.maximum-allocation-mb 8192

分配给AM单个容器可申请的最大内存,默认8192M,

不能超过NM节点最大可用内存

RM属性
yarn.nodemanager.resource.memory-mb  8192 NM节点最大可用内存,默认8192M NM属性
yarn.nodemanager.vmem-check-enabled true 是否检查虚拟内存,默认true检查 NM属性
yarn.nodemanager.vmem-pmem-ratio 2.1 虚拟内存率,默认值是2.1 NM属性

分析:Memory usage of ProcessTree 11630 for container-id container_1554798900283_0001_01_000025: 695.6 MB of 2.5 GB physical memory used; 4.0 GB of 5.3 GB virtual memory use

默认物理内存是1GB,动态申请到了2.5GB,其中使用了695.6 MB。物理内存╳2.1=虚拟内存,2.5GB╳2.1≈5.3GB ,5.3GB虚拟内存中使用了4.0GB,当虚拟内存不够时候,NM的container就会自杀,这里虽然没耗尽,但也自杀了。所以有两个解决方案,或调整yarn.nodemanager.vmem-pmem-ratio值大点,或yarn.nodemanager.vmem-check-enabled=false,关闭虚拟内存检查

 2、在cloudera-manager控制台界面调整

登录cloudera-manager管理系统http://192.xxx.xxx.71:7180,进入YARN (MR2 Included)配置界面,完成后保存

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

因为调整需要重启服务,这里为了防止以后不够用,顺便把RM的yarn.scheduler.maximum-allocation-mb和NM的yarn.scheduler.maximum-allocation-mb调大点,避免频繁修改参数重启服务影响生产。

NM的yarn.scheduler.maximum-allocation-mb,默认约8.05G,我改为以G为单位,设为12G,保存修改

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

yarn.scheduler.maximum-allocation-mb调大点,也改为以G为单位,这里设置为12G,保存修改。

Yarn-NodeManager分给Container虚拟内存不足导致Container自杀

完成之后重新启动YARN (MR2 Included)服务,再提交我们的spark任务,观察几天,之后没有出现NodeManager分配给container虚拟内存不足而导致container自杀的情况