You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark任务退出前如何收集Driver与Executor的堆栈信息?

Spark任务超时无有效日志时的堆栈收集与排查方案

一、实时抓取运行中进程堆栈

如果应用还在运行(或刚超时停止前),直接通过JVM工具抓取堆栈:

  • 找到Spark Driver或目标Executor的进程ID:
    ps aux | grep spark
    
  • 用jstack导出堆栈到文件:
    jstack <进程PID> > spark_stack_$(date +%Y%m%d_%H%M%S).log
    
  • 若要同时输出锁信息,方便排查死锁,加上-l参数:
    jstack -l <进程PID> > spark_stack_with_locks.log
    

二、配置Spark自动生成堆栈/堆转储

修改Spark提交命令,添加JVM参数让进程异常退出时自动留存堆栈和堆信息:

spark-submit \
  --class com.your.package.YourApp \
  --conf spark.driver.extraJavaOptions="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/spark/dumps -XX:+PrintConcurrentLocks -XX:+PrintStackTrace" \
  --conf spark.executor.extraJavaOptions="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/spark/dumps -XX:+PrintConcurrentLocks -XX:+PrintStackTrace" \
  your-app.jar
  • XX:+HeapDumpOnOutOfMemoryError:内存溢出时生成堆转储
  • XX:+PrintConcurrentLocks:打印当前持有和等待的锁
  • XX:+PrintStackTrace:异常时输出完整堆栈

三、集群环境下的堆栈获取方式

YARN集群

  • 通过YARN命令拉取应用日志(部分集群会在超时退出时记录堆栈):
    yarn logs -applicationId <你的应用ID> > yarn_spark_app.log
    
  • 若应用仍在运行,可通过YARN获取容器节点,登录后用jstack抓取:
    yarn application -status <应用ID> # 获取Executor所在节点
    

Kubernetes集群

  • 查看Driver/Executor Pod的日志:
    kubectl logs <pod-name>
    
  • 进入Pod内部执行jstack:
    kubectl exec -it <pod-name> -- /bin/bash
    jstack <进程PID> > stack.log
    

四、堆栈分析要点

  • 重点关注BLOCKED状态的线程,查看它们等待的锁对象,判断是否存在循环等待导致的死锁
  • 检查Driver端的调度线程(如SparkScheduler相关线程)是否长时间阻塞
  • 查看Executor端的任务执行线程(如Executor task launch worker)是否卡在第三方库或自定义代码的特定方法上
  • 结合堆转储文件(.hprof),用MAT等工具分析内存占用,排查是否因内存泄漏导致任务超时

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:34:55