Yarn-NodeManager分给Container虚拟内存不足导致Container自杀
一、问题再现
由于项目需要,采购电信天翼云,由于是新搭建的集群,在yarn上跑Spark任务时,每个几个小时或者半天出现节点丢失(Lost Nodes),访问http://cloudera01:8088,如下图,可以看到2个节点和集群失去了联系
二、问题排查
1、登录cm管理界面
首先登录cm管理界面,去查看yarn的运行状况,看到2个NodeManager运行不良,点击不良链接
2、点击NodeManager查看
3、NodeManager与ResourceManager失联
这就去查看NodeManager的日志进一步查找问题,去查看cloudera03这台机日志
4、查看NodeManager日志
其日志默认路径在/var/log/hadoop-yarn下,less hadoop-cmf-yarn-NODEMANAGER-cloudera03.log.out
先看到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)配置界面,完成后保存
因为调整需要重启服务,这里为了防止以后不够用,顺便把RM的yarn.scheduler.maximum-allocation-mb和NM的yarn.scheduler.maximum-allocation-mb调大点,避免频繁修改参数重启服务影响生产。
NM的yarn.scheduler.maximum-allocation-mb,默认约8.05G,我改为以G为单位,设为12G,保存修改
yarn.scheduler.maximum-allocation-mb调大点,也改为以G为单位,这里设置为12G,保存修改。
完成之后重新启动YARN (MR2 Included)服务,再提交我们的spark任务,观察几天,之后没有出现NodeManager分配给container虚拟内存不足而导致container自杀的情况