Spark ignoreMissingFiles配置在ADLS读取JSON时失效问题
解决Spark 3.3.x(DBR12.2)读取ADLS文件时的FileNotFoundException问题
1. 确认并正确配置Spark参数
Spark 3.3.x对文件读取的校验逻辑比3.2.x更严格,仅设置spark.sql.files.ignoreMissingFiles=true可能不足以覆盖所有场景,需要补充以下配置:
- 启用损坏文件忽略:
spark.sql.files.ignoreCorruptFiles=true,与缺失文件配置配合,避免文件状态异常触发报错 - 禁用ADLS文件缓存(针对ADLS Gen2):
spark.databricks.adls.cache.enabled=false,防止读取到过时的文件列表 - 建议用会话级配置方式确保生效,替代
spark.sql("SET ..."):spark.conf.set("spark.sql.files.ignoreMissingFiles", "true") spark.conf.set("spark.sql.files.ignoreCorruptFiles", "true") spark.conf.set("spark.databricks.adls.cache.enabled", "false")
2. 主动获取存在的文件列表再读取
绕过Spark自动枚举文件的逻辑,先筛选出当前目录下真实存在的JSON文件,再读取这些文件,从根源避免访问已被移动的文件:
# 遍历目标目录,收集可访问的JSON文件路径 valid_file_paths = [] for item in dbutils.fs.ls(adlspath_input): if item.isFile and item.path.endswith(".json"): # 额外校验文件可访问性(可选,进一步降低异常概率) try: dbutils.fs.head(item.path, 1) valid_file_paths.append(item.path) except Exception: pass # 仅读取确认存在的文件 df = spark.read.format("json").schema(jsonSchema).load(valid_file_paths)
3. 调整文件扫描并行度(可选)
如果上述方案仍有问题,可尝试降低文件扫描的并行度,减少单任务处理的文件数量,缓解并发读取时的文件状态不一致问题:
spark.conf.set("spark.sql.fileScan.parallelism", "100")
内容的提问来源于stack exchange,提问作者Saurabh Gupta
相关产品推荐
相关产品推荐

