向S3存储桶写入数据时遭遇FileNotFoundException异常求助
解决Spark向S3写入Parquet时的FileNotFoundException错误
问题场景
向S3存储桶写入分区Parquet数据时触发如下错误:
java.io.FileNotFoundException: 文件 s3n://data/_temporary/0/_temporary/attempt_20230704174844_0087_m_000005_0 不存在。
执行代码:
df.write.format("parquet").partitionBy("year") .mode(SaveMode.Append) .save("s3n://data/")
常见修复方案
- 替换S3协议:放弃使用
s3n://,改用s3a://协议。s3a是Hadoop针对S3优化的文件系统实现,能更好处理S3最终一致性问题,避免临时文件同步延迟导致的找不到文件错误。修改代码路径为s3a://data/。 - 补全S3配置项:确保Spark配置了正确的S3访问凭证及文件系统实现类,示例配置:
spark.hadoop.fs.s3a.access.key=你的访问密钥 spark.hadoop.fs.s3a.secret.key=你的秘密密钥 spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem - 检查存储桶权限与生命周期规则:确认Spark任务拥有S3存储桶的读写权限,同时排查是否有生命周期规则提前删除了
_temporary目录下的临时文件。 - 升级Spark版本:旧版本Spark与S3协议存在兼容缺陷,升级到3.x及以上版本,配合对应版本的Hadoop S3客户端,可解决部分底层适配问题。
内容的提问来源于stack exchange,提问作者RMK
相关产品推荐
相关产品推荐

