Flink Session在带标签YARN集群中资源请求不可用问题排查
从你的配置和日志来看,Flink YARN Session一直卡在ACCEPTED状态无法获取资源,我梳理了几个最可能的原因和对应的解决方向:
1. 节点标签未被Flink正确传递
虽然你给streamQ队列配置了default-node-label-expression: stream,但Flink的YARN客户端可能没有自动继承这个标签规则,导致Application Master(AM)或TaskManager的资源请求没有绑定stream标签,YARN无法将容器调度到对应的专属节点上。
解决方法:
启动Flink YARN Session时显式指定节点标签,确保资源请求精准匹配目标节点:
yarn-session.sh -n 2 -jm 768 -tm 768 -nm flink -z flink_zoo -s 3 -qu streamQ -yD yarn.application.node-label-expression=stream
2. YARN资源计算器未考虑CPU资源
你的capacity-scheduler.xml中使用的是DefaultResourceCalculator,这个计算器只评估内存资源,完全忽略CPU的占用情况。而你启动的Flink TaskManager每个需要3个slot(-s 3),每个slot默认占用1核CPU,意味着单个TaskManager需要3核CPU。如果YARN不检查CPU资源,可能会出现"内存够但CPU不足"的调度矛盾,导致容器无法正常启动。
解决方法:
修改资源计算器为DominantResourceCalculator,让YARN同时考量CPU和内存资源:
<property> <name>yarn.scheduler.capacity.resource-calculator</name> <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value> </property>
修改后重启YARN ResourceManager和NodeManager生效。
3. 节点可用内存不足(YARN预留配置问题)
你的stream节点是2GB内存,若YARN的yarn.nodemanager.resource.memory-mb配置值过小(比如预留了过多内存给系统进程),可能导致单个节点无法容纳AM+TaskManager的内存需求,或者无法满足TaskManager的申请量。
验证方法:
在YARN WebUI中查看stream节点的Available Memory值,如果可用内存小于768MB,说明内存预留过多。
解决方法:
调整yarn-site.xml中的内存配置,给系统预留合理空间后,最大化可用内存:
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1800</value> </property>
重启NodeManager后生效。
4. 查看Application Master日志定位核心问题
以上都是基于配置的推测,最直接的方式是查看Flink AM的日志,它会详细记录YARN分配资源时的错误细节(比如内存不足、CPU不匹配、标签校验失败等)。
获取日志方法:
- 在YARN WebUI中找到
application_1517118829753_0002应用 - 点击
ApplicationMaster链接进入AM页面 - 在页面底部找到
Logs链接,查看stdout和stderr日志,就能找到资源分配失败的具体原因
内容的提问来源于stack exchange,提问作者Soheil Pourbafrani

