AWS Glue PySpark任务成功但Spark完成日志无法生成问题排查
问题描述
在AWS Glue运行PySpark任务,任务已成功完成(DataFrame写入S3的文件已确认生成),但无法在Spark UI查看已完成的日志。已指定S3作为Spark UI日志路径,路径下仅生成带.inprogress后缀的spark-application-<nnnnnnnnn>.inprogress文件,任务结束后未生成无后缀的最终日志。尝试过在任务末尾添加time.sleep(2*60)延长时长、调用os._exit(0),均未解决。CloudWatch日志末尾有如下内容:
2023-10-11 16:25:20,274 INFO [Executor task launch worker for task 3.0 in stage 1.0 (TID 4)] mapred.SparkHadoopMapRedUtil (Logging.scala:logInfo(61)): attempt_202310111625128823931779720627407_0001_m_000003_4: Committed. Elapsed time: 75 ms.
2023-10-11 16:25:20,276 INFO [Executor task launch worker for task 3.0 in stage 1.0 (TID 4)] executor.Executor (Logging.scala:logInfo(61)): Finished task 3.0 in stage 1.0 (TID 4). 2062 bytes result sent to driver
2023-10-11 16:25:20,885 ERROR [dispatcher-Executor] executor.CoarseGrainedExecutorBackend (Logging.scala:logError(77)): Executor self-exiting due to : Driver 172.16.47.104:34325 disassociated! Shutting down.
2023-10-11 16:25:20,887 INFO [dispatcher-Executor] executor.CoarseGrainedExecutorBackend (Logging.scala:logInfo(61)): Driver from 172.16.47.104:34325 disconnected during shutdown
2023-10-11 16:25:20,889 INFO [CoarseGrainedExecutorBackend-stop-executor] sink.GlueCloudwatchSink (GlueCloudwatchSink.scala:logInfo(22)): CloudwatchSink: SparkContext stopped - not reporting metrics now.
问题解答
1. 驱动断开关联报错是否是日志未生成的原因?
是。Spark UI日志的最终生成依赖Driver端完成日志汇总和收尾操作,将.inprogress文件重命名为无后缀的最终文件。当Driver提前与Executor断联并退出时,Driver来不及完成日志收尾步骤,导致S3中仅残留.inprogress文件,无法生成可用于Spark UI查看的完整日志。
2. 驱动断开关联报错的诱因
- Glue任务强制终止机制:Glue检测到核心计算逻辑完成后,可能提前回收Driver资源,此时Driver尚未完成日志收尾等后续操作,导致与Executor的连接被强制断开。
- SparkContext提前关闭:任务中若存在隐式或显式的
SparkContext.stop()调用(比如部分数据写入操作完成后自动触发),会导致Driver主动终止,进而与Executor断联。 - 资源限制或超时:Driver所在节点出现内存不足、CPU使用率过高,或者Glue任务默认超时设置触发,可能导致Driver进程被强制杀死,引发断联报错。
3. 额外解决方案建议
- 显式等待Spark任务完全结束:在任务末尾添加
spark.streams.awaitAnyTermination()(若使用结构化流)或等待所有Spark Job完成的逻辑,确保Driver在包括日志收尾在内的所有操作完成后再退出。 - 调整Glue任务超时配置:在Glue任务参数中延长任务超时时间,给Driver足够的时间完成日志汇总。
- 优化任务资源配置:适当增加Driver的内存和CPU配额,避免因资源不足导致Driver被提前终止。
内容的提问来源于stack exchange,提问作者teejay

