Apache spark 在写入S3时,为什么会出现FileNotFoundException
在我的项目中,我正在使用Spark-SQL-2.3.1、Kafka、Java8,并且希望使用AWS-S3作为savage存储 我正在将Kafka topic中消耗的数据写入/存储到S3 bucket中,如下所示:Apache spark 在写入S3时,为什么会出现FileNotFoundException,apache-spark,amazon-s3,apache-spark-sql,spark-structured-streaming,Apache Spark,Amazon S3,Apache Spark Sql,Spark Structured Streaming,在我的项目中,我正在使用Spark-SQL-2.3.1、Kafka、Java8,并且希望使用AWS-S3作为savage存储 我正在将Kafka topic中消耗的数据写入/存储到S3 bucket中,如下所示: ds.writeStream() .format("parquet") .option("path", parquetFileName) .option("mergeSchema", true) .outputMode("append")
ds.writeStream()
.format("parquet")
.option("path", parquetFileName)
.option("mergeSchema", true)
.outputMode("append")
.partitionBy("company_id")
.option("checkpointLocation", checkPtLocation)
.trigger(Trigger.ProcessingTime("25 seconds"))
.start();
但在编写时,我得到了一个FileNotFoundException
Caused by: java.io.FileNotFoundException: No such file or directory: s3a://company_id=216231245/part-00055-f4f87dc9-a620-41bd-9380-de4ba7e70efb.c000.snappy.parquet
at org.apache.hadoop.fs.s3a.S3AFileSystem.s3GetFileStatus(S3AFileSystem.java:1931)
at org.apache.hadoop.fs.s3a.S3AFileSystem.innerGetFileStatus(S3AFileSystem.java:1822)
at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:1763)
我想知道为什么在编写时会出现FileNotFoundException
?我不是在读S3,对吗?
那么这里发生了什么以及如何修复呢?这是因为S3不是一个文件系统,而是一个对象存储。它不支持类似HDFS的重命名所需的语义。Spark首先将输出文件写入临时文件夹,然后重命名它们。在S3中没有实现这一点的原子方法。这就是为什么有时您会看到这些错误 现在,为了解决这个问题,如果您的环境允许,您可以使用HDFS作为中间存储,并将文件移动到S3以便稍后处理 如果您使用的是Hadoop3.1,那么可以使用它附带的s3a提交程序。可以找到有关如何配置此功能的更多详细信息
如果您使用的是较旧版本的hadoop,那么可以为Spark使用S3输出提交器,它基本上使用S3的多部分上传来模拟这种重命名。我所知道的一个这样的提交者是。不过,这似乎不是最近更新的。可能还有其他选择。现在的情况是,存在检查点和多部分上传。IDK为什么您会得到它,但是您使用的是每个on lib的哪个版本?这不是一个完整的stacktrace,是吗?另外,如果您不尝试合并拼花地板模式(模式合并会引发阅读),会发生什么情况?这实际上是404缓存引起的意外;在创建文件之前对文件发出的HEAD请求可以缓存在负载平衡器中,负载平衡器随后很快就会中断重命名。尚未发布的Hadoop版本(稍微)更好,但为了安全提交工作,您必须使用jegan讨论过的那种s3a提交程序。您所指的S3提交程序实际上是拉入ApacheHadoop 3.1中的;如果您的spark bundle具有hadoop 3.1 JAR,请搜索“S3A提交者”并切换到它。EMR有自己的“spark optimized committer”,它也有同样的功能thing@SteveLoughran你是对的。我已经更新了答案。@b工程师我不确定我是否理解你的问题。您应该调查s3提交者。正如Steve所评论的,它是hadoop 3.1的一部分。