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

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.local.dir=/data/spark/temp
    
    确保该目录仅由Spark使用,无外部清理策略覆盖。

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的临时文件。

验证步骤

  1. 修改spark.local.dir到独立目录后重新运行作业,观察是否仍触发文件找不到错误。
  2. 调整Shuffle保留时间参数后,监控Shuffle文件的生命周期,确认不会在作业运行中被删除。
  3. 检查Executor内存使用和GC日志,排除Executor重启问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:27:07