Spark Streaming任务在YARN集群模式下卡ACCEPTED后超时失败求助
排查YARN Cluster模式下Spark Streaming应用注册超时问题
我之前运维Spark Streaming应用时也碰到过几乎一模一样的情况——Standalone各种模式、YARN Client都跑的好好的,一到YARN Cluster就卡在ACCEPTED状态,最后超时失败,但Driver(也就是ApplicationMaster)明明已经启动甚至处理了部分消息。结合我的排查经验,给你几个具体的方向:
1. 优先排查AM与RM的网络连通性
这是最常见的原因:AM容器启动后,必须向ResourceManager完成注册才能进入RUNNING状态,如果两者之间网络不通(防火墙拦截、主机名解析失败),AM发不出注册请求,RM就会一直等,直到超时。
排查步骤:
- 登录AM所在的节点,找到YARN生成的AM日志(通常在
/var/log/hadoop-yarn/application_<appId>目录下,或者直接从YARN UI的应用详情页下载),搜索有没有Connection refused、UnknownHostException这类网络相关的报错。 - 在AM节点上手动测试连通性:比如ping RM的主机名,或者用
telnet <RM_HOST> <RM_REG_PORT>测试端口(RM的注册端口对应配置yarn.resourcemanager.address,默认是8032)。 - 检查所有节点的
/etc/hosts文件,确保RM的主机名和IP的映射是正确的,避免DNS解析失败。
- 登录AM所在的节点,找到YARN生成的AM日志(通常在
解决方法:
- 如果是防火墙问题,开放RM相关端口给所有NodeManager节点;
- 修正
/etc/hosts的主机名映射,或者在YARN配置里直接用IP代替主机名。
2. 检查AM的资源配额是否足够
AM容器本身需要足够的内存和CPU来完成初始化和注册,如果分配的资源太少,AM启动慢,就会赶不上超时时间。哪怕你的Spark Context已经起来了,AM的主线程可能还在挣扎着完成注册流程。
排查步骤:
- 查看YARN的默认配置:
yarn.applicationmaster.resource.memory-mb和yarn.applicationmaster.resource.vcores,默认值可能只有1G内存、1核CPU,对Streaming应用来说可能不够。 - 提交应用时,手动指定AM的资源参数试试:
spark-submit --deploy-mode cluster \ --conf spark.yarn.am.memory=2g \ --conf spark.yarn.am.cores=2 \ # 其他你的应用参数
- 查看YARN的默认配置:
解决方法:
- 永久调整YARN的AM默认资源配置,或者在每次提交时手动指定更大的资源配额。
3. 调大YARN和Spark的超时配置
集群的默认超时时间可能太短,尤其是在网络延迟高、资源紧张的环境下,AM需要更多时间完成注册。
需要检查的配置:
- YARN侧:
yarn.resourcemanager.am.registration.timeout——控制AM向RM注册的超时时间,默认通常是5分钟左右(刚好匹配你遇到的4-5分钟超时),可以调大到10分钟。 - Spark侧:
spark.yarn.am.registerMaster.timeout——Spark Driver(AM)等待向RM注册的超时时间,默认是100秒,建议调到300秒以上。
- YARN侧:
解决方法:
在提交应用时添加这些配置:spark-submit --deploy-mode cluster \ --conf yarn.resourcemanager.am.registration.timeout=600000 \ --conf spark.yarn.am.registerMaster.timeout=300000 \ # 其他参数
4. 排查集群资源是否紧张
如果集群里有大量任务在跑,AM容器虽然被分配了,但可能因为NodeManager资源不足,导致AM的初始化被延迟。
排查步骤:
- 打开YARN RM UI(默认端口8088),查看集群的
Nodes页面,看有没有节点处于UNHEALTHY状态; - 查看
Applications页面的资源使用情况,确认剩余的内存、CPU是否足够启动AM容器。
- 打开YARN RM UI(默认端口8088),查看集群的
解决方法:
- 清理集群上的闲置任务,释放资源;
- 如果是长期资源不足,考虑扩容集群节点。
5. 检查Spark Streaming的启动逻辑是否阻塞AM注册
因为YARN Cluster模式下,Spark Driver就是AM,你的Streaming应用如果在Driver启动后立刻开始处理大量消息,可能会占用AM的主线程资源,导致注册流程被延迟。
排查步骤:
- 查看AM的日志,看是不是在
StreamingContext.start()之后,注册相关的日志才出现; - 尝试在代码里延迟启动StreamingContext,比如先让Driver idle几秒再启动流处理,看是否能正常注册。
- 查看AM的日志,看是不是在
解决方法:
- 开启流控:设置
spark.streaming.backpressure.enabled=true,让Streaming一开始不要处理过多消息,减轻Driver压力; - 调整初始化顺序,确保AM完成注册后再启动流处理逻辑。
- 开启流控:设置
通用排查技巧
- 先提交一个简单的Spark应用(比如SparkPi)到YARN Cluster模式,如果同样出现超时,说明是集群YARN配置的问题,不是你的应用代码问题;
- 重点查看AM的
stderr日志,大部分底层报错都会在这里; - 检查NodeManager的日志,看有没有和AM容器启动、通信相关的异常。
内容的提问来源于stack exchange,提问作者salvob




