Azure Synapse Workspace中Spark读取Parquet文件报错求助
在Azure Synapse Workspace通过Pipeline运行PySpark任务时出现失败,报错堆栈如下:
Stacktrace: An error occurred while calling o1394.execute.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 94.0 failed 4 times, most recent failure: Lost task 0.3 in stage 94.0 (TID 2313) (vm-1d164027 executor 3): java.io.EOFException
at org.apache.parquet.bytes.BytesUtils.readIntLittleEndian(BytesUtils.java:85)
at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:520)
at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:505)
at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:499)
at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:476)
报错原因分析
该错误是Spark读取Parquet文件时触发的EOFException(文件结束异常),核心原因是目标Parquet文件损坏或不完整,导致Parquet阅读器无法正常解析文件页脚信息。常见诱因包括:
- 上游数据写入任务中途中断(如网络故障、资源耗尽),未完成Parquet文件的完整写入
- 存储介质(如ADLS Gen2)中的文件本身损坏
- 文件传输过程中出现丢包、中断,导致文件不完整
排查与修复步骤
1. 定位损坏的Parquet文件
- 从任务日志中提取关联的数据源路径,逐个校验该路径下的Parquet文件:
- 对比文件大小,筛选出与同批次正常文件差异较大的文件(过小的文件大概率未完整写入)
- 用临时Spark脚本读取单个文件,验证是否触发相同报错:
df = spark.read.parquet("/path/to/specific/file.parquet") df.show()
2. 修复或替换损坏文件
- 确认文件损坏后,直接删除该文件,重新运行上游写入任务生成完整文件
- 若文件来自外部系统,检查数据传输流程的可靠性,确保后续文件写入过程无中断
3. 配置Spark容错参数(临时缓解)
若无法立即修复文件,可临时添加以下配置增强Parquet读取的容错性:
# 关闭向量化读取,兼容部分损坏场景 spark.conf.set("spark.sql.parquet.enableVectorizedReader", "false") # 调整列读取批次大小 spark.conf.set("spark.sql.parquet.columnarReaderBatchSize", "1024")
4. 检查Pipeline依赖链路
- 确认Pipeline中上游任务是否成功完成,查看是否有写入失败的日志记录
- 为上游写入任务添加校验步骤,确保文件生成后大小、完整性符合预期,再触发下游PySpark任务
内容的提问来源于stack exchange,提问作者Deepak Garg

