You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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 refusedUnknownHostException这类网络相关的报错。
    • 在AM节点上手动测试连通性:比如ping RM的主机名,或者用telnet <RM_HOST> <RM_REG_PORT>测试端口(RM的注册端口对应配置yarn.resourcemanager.address,默认是8032)。
    • 检查所有节点的/etc/hosts文件,确保RM的主机名和IP的映射是正确的,避免DNS解析失败。
  • 解决方法

    • 如果是防火墙问题,开放RM相关端口给所有NodeManager节点;
    • 修正/etc/hosts的主机名映射,或者在YARN配置里直接用IP代替主机名。

2. 检查AM的资源配额是否足够

AM容器本身需要足够的内存和CPU来完成初始化和注册,如果分配的资源太少,AM启动慢,就会赶不上超时时间。哪怕你的Spark Context已经起来了,AM的主线程可能还在挣扎着完成注册流程。

  • 排查步骤

    • 查看YARN的默认配置:yarn.applicationmaster.resource.memory-mbyarn.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的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秒以上。
  • 解决方法
    在提交应用时添加这些配置:

    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容器。
  • 解决方法

    • 清理集群上的闲置任务,释放资源;
    • 如果是长期资源不足,考虑扩容集群节点。

5. 检查Spark Streaming的启动逻辑是否阻塞AM注册

因为YARN Cluster模式下,Spark Driver就是AM,你的Streaming应用如果在Driver启动后立刻开始处理大量消息,可能会占用AM的主线程资源,导致注册流程被延迟。

  • 排查步骤

    • 查看AM的日志,看是不是在StreamingContext.start()之后,注册相关的日志才出现;
    • 尝试在代码里延迟启动StreamingContext,比如先让Driver idle几秒再启动流处理,看是否能正常注册。
  • 解决方法

    • 开启流控:设置spark.streaming.backpressure.enabled=true,让Streaming一开始不要处理过多消息,减轻Driver压力;
    • 调整初始化顺序,确保AM完成注册后再启动流处理逻辑。

通用排查技巧

  • 先提交一个简单的Spark应用(比如SparkPi)到YARN Cluster模式,如果同样出现超时,说明是集群YARN配置的问题,不是你的应用代码问题;
  • 重点查看AM的stderr日志,大部分底层报错都会在这里;
  • 检查NodeManager的日志,看有没有和AM容器启动、通信相关的异常。

内容的提问来源于stack exchange,提问作者salvob

火山引擎 最新活动