Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 问题:找不到s3ablock-0001的任何有效本地目录-_Apache Spark_Hadoop_Pyspark_Amazon Emr - Fatal编程技术网

Apache spark 问题:找不到s3ablock-0001的任何有效本地目录-

Apache spark 问题:找不到s3ablock-0001的任何有效本地目录-,apache-spark,hadoop,pyspark,amazon-emr,Apache Spark,Hadoop,Pyspark,Amazon Emr,当我试图在S3上写入数据时,我在AmazonEMR上运行作业时遇到了一个问题 这是stacktrace: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for s3ablock-0001- at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForW

当我试图在S3上写入数据时,我在AmazonEMR上运行作业时遇到了一个问题

这是stacktrace:

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上写入所需的所有内容


我恳求你们,我需要做什么才能让这一切顺利进行?非常感谢。

您需要为应用程序提供一个用于存储数据的目录

spark.hadoop.fs.s3a.buffer.dir /tmp,/drive1/tmp
通常,它会选择hadoop.tmp.dir设置为的内容。可能您只是没有足够的磁盘空间,或者该选项设置在一个小的根驱动器上的某个位置

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

进一步阅读

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

spark.hadoop.fs.s3a.fast.upload.buffer bytebuffer
我们在某些部署中这样做,在这些部署中,进程没有对本地FS的写访问权限和/或没有容量。但是,您需要努力调整一些其他相关参数,以避免缓冲过多的数据——从EC2到S3的有限带宽可能会造成大量积压

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

spark.hadoop.fs.s3a.fast.upload.active.blocks 1
该和/或更少数量的工作线程


请更新这篇文章,无论什么有用,其他人都可以利用你的发现

谢谢@stevel,你的解释很好,帮助我找到了我的解决方案,但解决方案与我使用的s3协议有关,正如你在文档中描述的那样send@BrunoBernardes请问最后的解决办法是什么?我在工作中也犯了同样的错误。谢谢我遇到了这个问题,当impala试图插入或覆盖一个位置设置为s3的表时,是否有任何线索?谢谢