Spark执行期间Shuffle File被自动删除致ETL作业报错求助
Spark Shuffle块被自动删除导致ETL作业异常的排查方案
问题概述
执行Spark ETL作业时触发Shuffle块被自动删除的异常,导致作业失败。涉及Spark版本3.5.3、3.4.3,已尝试关闭spark.worker.cleanup.enabled,且通过df -h/df -i确认节点磁盘空间充足、Block Manager目录存在,但问题未解决。
报错日志:
[2024-10-22T13:45:14.512+0000] {spark_submit.py:634} INFO - 24/10/22 13:45:14 WARN DiskBlockObjectWriter: Error deleting /opt/airflow/logs/temp/blockmgr-956c6232-7f9c-49dd-ab05-edbfcd9a9644/09/temp_shuffle_c82a7379-8206-4c93-a75c-60cc7f889bd1 [2024-10-22T13:45:14.515+0000] {spark_submit.py:634} INFO - 24/10/22 13:45:14 ERROR Executor: Exception in task 0.0 in stage 2598.0 (TID 4663) [2024-10-22T13:45:14.515+0000] {spark_submit.py:634} INFO - java.io.FileNotFoundException: /opt/airflow/logs/temp/blockmgr-956c6232-7f9c-49dd-ab05-edbfcd9a9644/09/temp_shuffle_c82a7379-8206-4c93-a75c-60cc7f889bd1 (No such file or directory) [2024-10-22T13:45:14.515+0000] {spark_submit.py:634} INFO - at java.base/java.io.FileOutputStream.open0(Native Method) [2024-10-22T13:45:14.515+0000] {spark_submit.py:634} INFO - at java.base/java.io.FileOutputStream.open(FileOutputStream.java:293)
排查与解决方法
1. 隔离外部清理进程的影响
你的Shuffle临时目录位于/opt/airflow/logs/temp/,Airflow自身或系统定时任务(如logrotate)可能会自动清理该目录下的旧文件,误删Spark的Shuffle临时文件。
- 解决:修改Spark临时目录到Airflow清理范围外的独立路径,设置参数:
确保该目录仅由Spark使用,无外部清理策略覆盖。spark.local.dir=/data/spark/temp
2. 调整Shuffle文件保留时间参数
Spark针对Shuffle块有独立的清理机制,不受spark.worker.cleanup.enabled控制:
- 若开启了外部Shuffle服务(
spark.shuffle.service.enabled=true),调整以下参数延长文件保留时间:spark.shuffle.service.cleanup.interval=3600 # 清理间隔改为1小时 spark.shuffle.service.retainShuffleFilesFor=7200 # 保留时间改为2小时 - 未开启外部Shuffle服务时,调整Block Manager清理间隔:
spark.diskStore.cleanupInterval=3600
3. 排查Executor异常重启
Executor意外重启会导致Block Manager终止,其管理的临时Shuffle文件可能被标记为失效并删除:
- 查看Executor日志,检查是否存在OOM(内存不足)、GC超时等导致重启的情况。
- 解决:调大Executor内存配置,如:
spark.executor.memory=8g spark.executor.memoryOverhead=2g
4. 验证目录权限稳定性
确认Spark运行用户对Block Manager目录拥有持续的读写权限,避免外部操作修改目录权限导致文件无法访问:
- 执行
ls -ld /opt/airflow/logs/temp/blockmgr-*检查目录权限,确保Spark用户(如spark或airflow)具备读写权限。 - 避免其他用户进程修改该目录的权限配置。
5. 检查Spark临时文件TTL配置
若spark.cleaner.ttl设置过小,会导致临时文件被过早清理:
- 确保该参数值大于作业的最长运行时间,例如:
spark.cleaner.ttl=86400 # 保留1天 - 同时确认
spark.cleaner.referenceTracking.cleanCheckpoints=false,避免误删非checkpoint的临时文件。
验证步骤
- 修改
spark.local.dir到独立目录后重新运行作业,观察是否仍触发文件找不到错误。 - 调整Shuffle保留时间参数后,监控Shuffle文件的生命周期,确认不会在作业运行中被删除。
- 检查Executor内存使用和GC日志,排除Executor重启问题。
内容的提问来源于stack exchange,提问作者MarthaX
相关产品推荐
相关产品推荐

