Spark YARN Cluster模式下WordCount任务持续ACCEPTED状态原因排查
你遇到的这个情况我之前帮很多开发者解决过——Spark任务提交到YARN后一直卡在INFO Client: Application report for application_xxx (state: ACCEPTED),本质上是YARN的ResourceManager还没为你的任务分配到足够的运行资源,或者集群配置存在冲突。咱们从几个最常见的方向排查:
1. YARN集群可用资源耗尽
这是最普遍的原因。YARN会先把任务标记为ACCEPTED,进入等待队列,直到有NodeManager能提供它需要的CPU、内存资源。
- 你可以打开YARN的WebUI(默认地址是
http://你的Master节点IP:8088),在Nodes页面查看每个Worker节点的可用内存、vCore占比; - 再到Applications页面看等待队列里的任务数量,如果队列积压严重,你的任务就得排队等资源释放。
- 解决办法:暂停一些非核心任务腾出资源,或者调整YARN的节点资源配置(修改
yarn-site.xml里的yarn.nodemanager.resource.memory-mb、yarn.nodemanager.resource.cpu-vcores参数,改完记得重启NodeManager服务)。
2. Spark任务的资源请求超出YARN限制
如果你提交任务时没指定资源参数,Spark会用默认配置,但如果默认请求的内存/CPU超过了YARN允许的单容器上限,ResourceManager会一直卡着不分配。
你可以在提交命令里显式指定合理的资源参数试试,比如:
spark-submit --class com.exsparkbasic.ExSparkBasic --master yarn-cluster --executor-memory 2G --executor-cores 1 --num-executors 2 ~/Wordcount.jar 10
注意这些参数不能超过YARN的单容器资源上限(可以在YARN WebUI的Cluster页面查看Maximum Container Memory和Maximum Container vCores的值)。
3. NodeManager服务状态异常
虽然你通过Spark和HDFS的WebUI确认了Worker节点存在,但有可能NodeManager服务出现假死或通信故障。
在Master节点执行以下命令检查节点状态:
yarn node -list
如果输出里有节点状态是UNHEALTHY或者未显示,就到对应的Worker节点重启NodeManager:
yarn-daemon.sh stop nodemanager yarn-daemon.sh start nodemanager
4. 重点查看diagnostics日志内容
你提到日志里有diagnostics: ...的部分,这是YARN给出的直接报错原因,比如“Insufficient resource request”(资源请求不足)、“NodeManager not responding”等。一定要把这部分完整内容提取出来,它能帮你直接定位问题根源——比如如果是资源不够,diagnostics里会明确说明任务需要多少资源,当前集群剩余多少可用。
内容的提问来源于stack exchange,提问作者김태수

