Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在写入S3时,为什么会出现FileNotFoundException_Apache Spark_Amazon S3_Apache Spark Sql_Spark Structured Streaming - Fatal编程技术网

Apache spark 在写入S3时,为什么会出现FileNotFoundException

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")

在我的项目中,我正在使用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")
     .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的一部分。