【问题标题】:Problem Could not find any valid local directory for s3ablock-0001-问题找不到 s3ablock-0001- 的任何有效本地目录
【发布时间】:2023-03-20 01:35:02
【问题描述】:

当我尝试在 S3 上写入数据时,我在 Amazon EMR 上运行作业时遇到问题。

这是堆栈跟踪:

org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for s3ablock-0001-
    at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:463)
    at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.createTmpFileForWrite(LocalDirAllocator.java:477)
    at org.apache.hadoop.fs.LocalDirAllocator.createTmpFileForWrite(LocalDirAllocator.java:213)
    at org.apache.hadoop.fs.s3a.S3AFileSystem.createTmpFileForWrite(S3AFileSystem.java:589)
    at org.apache.hadoop.fs.s3a.S3ADataBlocks$DiskBlockFactory.create(S3ADataBlocks.java:811)
    at org.apache.hadoop.fs.s3a.S3ABlockOutputStream.createBlockIfNeeded(S3ABlockOutputStream.java:190)
    at org.apache.hadoop.fs.s3a.S3ABlockOutputStream.(S3ABlockOutputStream.java:168)
    at org.apache.hadoop.fs.s3a.S3AFileSystem.create(S3AFileSystem.java:822)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:1125)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:1105)
    at org.apache.parquet.hadoop.util.HadoopOutputFile.create(HadoopOutputFile.java:74)
    at org.apache.parquet.hadoop.ParquetFileWriter.(ParquetFileWriter.java:248)
    at org.apache.parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:390)
    at org.apache.parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:349)
    at org.apache.spark.sql.execution.datasources.parquet.ParquetOutputWriter.(ParquetOutputWriter.scala:37)
    at org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat$$anon$1.newInstance(ParquetFileFormat.scala:158)
    at org.apache.spark.sql.execution.datasources.SingleDirectoryDataWriter.newOutputWriter(FileFormatDataWriter.scala:126)
    at org.apache.spark.sql.execution.datasources.SingleDirectoryDataWriter.(FileFormatDataWriter.scala:111)
    at org.apache.spark.sql.execution.datasources.FileFormatWriter$.executeTask(FileFormatWriter.scala:264)
    at org.apache.spark.sql.execution.datasources.FileFormatWriter$.$anonfun$write$15(FileFormatWriter.scala:205)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
    at org.apache.spark.scheduler.Task.run(Task.scala:127)
    at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:444)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1377)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:447)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我使用 Amazon ECS for EMR 和 Apache Spark 3.0.1 和 Hadoop 3.2.1 构建了一个映像,我已经尝试使用 Apache Spark 2.4.5 和 Hadoop 2.7.1,但没有成功.

当我们在没有 ECS 映像的情况下手动构建 EMR 时,该作业成功完成,并将所需的所有内容写入 S3。

我恳求你们,我需要做些什么才能让这些东西正常运行?非常感谢。

【问题讨论】:

    标签: apache-spark hadoop pyspark amazon-emr


    【解决方案1】:

    你需要给应用一个目录来存储数据

    spark.hadoop.fs.s3a.buffer.dir /tmp,/drive1/tmp
    

    通常它会选择 hadoop.tmp.dir 设置的内容。也许您只是没有足够的磁盘空间,或者该选项设置在一个小根驱动器上的某个位置。

    更好:为您拥有的每个磁盘添加一个条目,它会尝试使用任何有足够空间的磁盘。

    延伸阅读How S3A writes data to S3

    在 Hadoop 3.2.1 上,您可以告诉 S3A 在堆或字节缓冲区中进行缓冲,因此根本不使用本地磁盘。

    spark.hadoop.fs.s3a.fast.upload.buffer bytebuffer
    

    我们在某些部署中执行此操作,其中进程没有本地 FS 的写入权限和/或没有容量。但是您随后需要努力调整一些其他相关参数以避免缓冲过多数据 - 从 EC2 到 S3 的有限带宽可能会导致大量积压

    实际上,这也可能是磁盘缓冲的问题 - 也许您只是创建数据的速度比上传数据的速度快。尝试限制单个输出流(此处为 spark 工作线程)在流写入块之前可以排队等待上传的块数:

    spark.hadoop.fs.s3a.fast.upload.active.blocks 1
    

    该和/或更少数量的工作线程。

    请更新这篇有用的帖子,以便其他人可以利用您的发现

    【讨论】:

    • 感谢@stevel,您的解释很好,帮助我找到了解决方案,但解决方案与我使用的 s3 协议有关,如您发送的文档中所述
    • @BrunoBernardes 请问最终的解决方案是什么?我在工作中也遇到了同样的错误。谢谢!
    • 我遇到了这个问题,当 impala 尝试插入覆盖位置设置为 s3 的表时,有什么线索吗?谢谢
    【解决方案2】:

    尝试使用堆外或字节缓冲区而不是磁盘进行 S3A 上传。 很可能另一个进程在上传期间驱逐了 s3ablock 文件。

    我在启用 delta io 缓存时写入 delta 表时遇到了这个问题(读取另一个 delta 表)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-03
      • 2014-05-31
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多