PySpark本地集群大任务失败:调度器日志定位与问题排查求助
Spark本地集群大数据集运行报错问题解答
一、定位调度器进程日志
你使用的是local[72]本地伪集群模式,CoarseGrainedSchedulerEndpoint作为Driver进程的核心组件,其日志默认与Driver日志合并存储。当前看不到调度器详细日志的原因是日志级别设为WARN,过滤了调度相关的INFO/DEBUG级输出,可通过以下方式获取:
- 临时调整日志级别:提交任务时添加参数,指定自定义log4j配置文件:
在log4j.properties中添加调度器日志级别配置:spark-submit --conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:/path/to/your/log4j.properties" your_script.pylog4j.logger.org.apache.spark.scheduler=INFO - 永久调整日志级别:复制Spark安装目录下
conf/log4j.properties.template为conf/log4j.properties,添加上述配置后重启任务。 - 查看HDFS存储的日志:你已开启
spark.driver.log.persistToDfs.enabled=true,可直接前往配置的<my/logs/dir>路径下,获取完整的Driver日志(包含调度器输出)。
注:若为真正的standalone集群(非local模式),Master/Worker日志会存储在SPARK_WORKER_LOG_DIR下,但你的场景无需考虑。
二、问题可能成因与通用调试方法
可能成因
- Driver资源耗尽与GC停顿:尽管机器总内存充足,但你给Driver分配了72核+50G内存,大数据集下Driver需处理大量调度元数据、Shuffle管理、广播变量等任务,易引发Full GC频繁或停顿过长,导致Rpc请求超时,出现日志中的
RpcTimeoutException和RpcEndpointNotFoundException。 - Shuffle过程异常:错误日志提到
Error trying to remove shuffle 25,大数据集下Shuffle数据量暴增,可能出现:- 磁盘IOPS不足(剩余空间充足但读写速度跟不上)
- Shuffle元数据过大,超出Driver内存承载能力(
maxResultSize仅限制结果集,不控制Shuffle元数据)
- Local模式资源竞争:
local[72]让Driver同时运行72个Executor线程,加上自身调度线程,96核机器会出现严重CPU竞争,导致调度线程无法及时响应Rpc请求。
通用调试方法
1. 资源调优
- 降低Driver核心数:将
spark.driver.cores从72调整至48左右,预留CPU资源给系统和调度线程,避免线程饿死。 - 排查GC问题:添加
spark.driver.extraJavaOptions="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps",打印GC日志,若存在频繁Full GC,可:- 调大Driver内存至64G
- 切换GC收集器为G1GC:
-XX:+UseG1GC
- 优化Shuffle参数:
- 增大
spark.shuffle.file.buffer至64k/128k,减少磁盘IO次数 - 确保
spark.shuffle.spill.compress和spark.shuffle.compress处于开启状态(默认开启) - 调整
spark.sql.shuffle.partitions:根据数据量设置为1000-2000(默认200),平衡分区大小与元数据压力
- 增大
2. 日志与监控
- 开启Spark UI:任务运行时访问
http://<driver-host>:4040,重点查看:- Jobs/Stages页面:定位失败Stage,检查Shuffle读写数据量是否异常
- Storage页面:监控广播变量、RDD缓存的内存占用
- Executors页面:查看Driver/Executor的内存、CPU使用率,排查OOM或GC过高问题
- 提升日志级别:将日志级别调至INFO,重点关注
CoarseGrainedScheduler、BlockManager相关日志,获取调度器异常细节
3. 分步调试
- 逐步放大数据集:从中等规模开始测试,定位触发报错的数据量阈值
- 简化任务逻辑:暂时移除非核心转换操作,先测试读取+Shuffle流程,逐步排查问题模块
内容的提问来源于stack exchange,提问作者Leo Selker
相关产品推荐
相关产品推荐

