PySpark配置与Yarn Top内存显示不一致问题排查
在EMR集群主节点执行yarn top后得到如下输出:
ARN top - 13:27:57, up 0d, 1:34, 1 active users, queue(s): root
NodeManager(s): 6 total, 6 active, 0 unhealthy, 2 decommissioned, 0 lost, 0 rebooted
Queue(s) Applications: 3 running, 8 submitted, 0 pending, 5 completed, 0 killed, 0 failed
Queue(s) Mem(GB): 18 available, 189 allocated, 1555 pending, 0 reserved
Queue(s) VCores: 44 available, 20 allocated, 132 pending, 0 reserved
Queue(s) Containers: 20 allocated, 132 pending, 0 reserved
APPLICATIONID USER TYPE QUEUE PRIOR #CONT #RCONT VCORES RVCORES MEM RMEM VCORESECS MEMSECS %PROGR TIME NAME application_1663674823778_0002 hadoop spark default 0 10 0 10 0 99G 0G 18754 187254 10.00 00:00:33 PyS application_1663674823778_0003 hadoop spark default 0 9 0 9 0 88G 0G 9446 84580 10.00 00:00:32 PyS application_1663674823778_0008 hadoop spark default 0 1 0 1 0 0G 0G 382 334 10.00 00:00:06 PyS
其中,application_1663674823778_0002和application_1663674823778_0003通过直接执行pyspark命令启动,未修改任何配置,Yarn内存显示正常;而application_1663674823778_0008通过命令pyspark --conf spark.executor.memory=11g --conf spark.driver.memory=12g启动,自定义了内存配置,但在Yarn Top中该应用的MEM和RMEM均显示为0,请问这是什么原因?
出现这种情况主要有以下几个可能的原因:
应用启动时间过短,资源未完成分配
从输出看该应用仅运行了6秒,处于启动初期。Spark在YARN模式下启动时,需先申请Driver容器,再调度Executor容器。如果容器还在初始化或资源调度阶段,YARN尚未完成资源分配的统计同步,就会出现MEM和RMEM显示为0的情况。等待10-20秒后重新执行yarn top,大概率能看到正常数值。自定义内存配置超出YARN资源限制
设置的spark.executor.memory=11g和spark.driver.memory=12g可能超过了YARN单容器内存上限(比如yarn.scheduler.maximum-allocation-mb参数限制),或集群剩余资源无法满足该申请。此时YARN无法分配对应内存,容器处于pending状态,yarn top就会显示MEM为0。可以执行yarn application -status application_1663674823778_0008查看应用详细状态,确认资源申请是否被拒绝或处于pending。YARN Top统计存在延迟
YARN Top的指标是定期从ResourceManager拉取的,存在统计延迟。刚启动的应用资源分配信息可能还未同步到统计模块,导致显示异常,稍等片刻重新执行命令即可。未配置YARN内存Overhead
Spark内存配置需要考虑YARN的内存Overhead(通过spark.yarn.executor.memoryOverhead和spark.yarn.driver.memoryOverhead控制),默认是executor内存的10%(最小384MB)。如果只设置了业务内存而未预留Overhead,YARN可能无法正确识别应用的总内存需求,进而导致统计异常。
内容的提问来源于stack exchange,提问作者nate

