gpt4 book ai didi

amazon-web-services - S3AFileSystem - 当前缀是文件并且是目录树的一部分时出现 FileAlreadyExistsException

转载 作者:行者123 更新时间:2023-12-02 19:56:12 26 4
gpt4 key购买 nike

我们正在使用 aws-java-sdk-1.7.4.jar hadoop-aws-2.7.5.jar 运行 Apache Spark 作业,以将 parquet 文件写入 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://mybucket/d1/d2/d3/d4/d5/d6/d7/d8/d9/part_dt=20180616/b.parquet' 在 s3 中创建)我们得到以下错误

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)

最佳答案

HADOOP-15542 中所述.您不能在“正常” FS 的目录下拥有文件;您不会将它们放入 S3A 连接器中,至少在它进行了足够的尽职调查的情况下。

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

我们尝试在 The Hadoop Filesystem Specification 中定义 FS 应该做什么。 ,包括定义“如此明显”以至于没有人费心写下来或编写测试的事情,例如

  • 只有目录可以有子目录
  • 所有 child 都必须有 parent
  • 只有文件可以有数据(异常(exception):ReiserFS)
  • 文件和他们说的一样长(这就是为什么 S3A 不支持客户端加密,顺便说一句)。

  • 每隔一段时间,我们就会发现一些我们忘记考虑的新事物,即哪些“真正的”文件系统强制执行,而哪些对象存储没有。然后我们添加测试,尽量保持隐喻,除非性能影响使其无法使用。然后我们选择不解决问题并希望没有人注意到。通常,由于在 hadoop/hive/spark 空间中处理数据的人对文件系统的功能有着相同的先入之见,因此这些歧义实际上不会在生产中引起问题。

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

    关于amazon-web-services - S3AFileSystem - 当前缀是文件并且是目录树的一部分时出现 FileAlreadyExistsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50868123/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com