Amazon web services S3AFileSystem-当前缀是文件和目录树的一部分时,FileReadyExistsException

Amazon web services S3AFileSystem-当前缀是文件和目录树的一部分时,FileReadyExistsException,amazon-web-services,apache-spark,hadoop,amazon-s3,hdfs,Amazon Web Services,Apache Spark,Hadoop,Amazon S3,Hdfs,我们正在使用aws-java-sdk-1.7.4.jar和hadoop-aws-2.7.5.jar运行apachespark作业,以将拼花文件写入S3存储桶 我们在s3中有键“s3://mybucket/d1/d2/d3/d4/d5/d6/d7”(d7是一个文本文件)。我们还有键“s3://mybucket/d1/d2/d3/d4/d5/d6/d7/d8/d9/part_dt=20180615/a.parquet”(a.parquet是一个文件) 当我们运行spark作业在“s3://mybuc

我们正在使用aws-java-sdk-1.7.4.jar和hadoop-aws-2.7.5.jar运行apachespark作业,以将拼花文件写入S3存储桶

我们在s3中有键“s3://mybucket/d1/d2/d3/d4/d5/d6/d7”(d7是一个文本文件)。我们还有键“s3://mybucket/d1/d2/d3/d4/d5/d6/d7/d8/d9/part_dt=20180615/a.parquet”(a.parquet是一个文件)

当我们运行spark作业在“s3://mybucket/d1/d2/d3/d4/d5/d6/d7/d8/d9/part_dt=20180616/”下编写b.parquet文件时(即希望在s3中创建“s3://mybucket/d1/d2/d3/d4/d5/d6/d8/d9/part_dt=20180616/b.parquet”),我们得到以下错误

org.apache.hadoop.fs.FileAlreadyExistsException: Can't make directory for path 's3a://mybucket/d1/d2/d3/d4/d5/d6/d7' since it is a file.
at org.apache.hadoop.fs.s3a.S3AFileSystem.mkdirs(S3AFileSystem.java:861)
at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1881)
如中所述。在“普通”FS中,目录下不能有文件;在S3A连接器中,您无法获取这些数据,至少在S3A连接器中进行了足够的尽职调查

它只是混淆了每一个树行走算法,重命名,删除,任何扫描文件的东西。这将包括spark分区逻辑。您试图创建的新目录树可能对调用方不可见。(您可以通过创建它来测试这一点,将该文本文件放置到位,看看会发生什么)

我们试图定义一个FS应该在中做什么,包括定义一些“非常明显”的事情,以至于没有人愿意写下来或为其编写测试,例如

  • 只有目录才能有子目录
  • 所有孩子都必须有父母
  • 只有文件才能有数据(例外:ReiserFS)
  • 文件和他们说的一样长(这就是为什么S3A不支持客户端加密,顺便说一句)
我们经常发现一些我们忘记考虑的新事物,哪些“真实”的文件系统执行这个盒子,但是哪个对象存储不执行。然后我们添加测试,尽力维护隐喻,除非性能影响会使其无法使用。然后我们选择不去解决问题,希望没人注意到。一般来说,因为在hadoop/hive/spark空间中处理数据的人对文件系统的功能有着相同的先入之见,所以这些模糊性实际上不会在生产中造成问题

当然,除了最终的一致性,这就是为什么在没有一致性服务(S3Guard,consistency EMRFS)或为这个世界设计的提交协议(S3A Committer,databricks DBIO)的情况下,您不应该直接从spark将数据写入S3的原因