Apache spark 如何禁用洗牌文件的磁盘写入?

Apache spark 如何禁用洗牌文件的磁盘写入?,apache-spark,rdd,Apache Spark,Rdd,大家好,我们有spark cluster,在spark作业执行期间,我在将中间数据写入spark.local.dir位置时获得sparkoutofmemory,但当我看到它们的内存是执行器未使用内存的两倍以上时,我们可以将数据存储到内存本身而不是写入该目录吗 下面是异常详细信息 Job aborted due to stage failure: Task 134555 in stage 32.0 failed 4 times, most recent failure: Lost task 134

大家好,我们有spark cluster,在spark作业执行期间,我在将中间数据写入
spark.local.dir
位置时获得sparkoutofmemory,但当我看到它们的内存是执行器未使用内存的两倍以上时,我们可以将数据存储到内存本身而不是写入该目录吗

下面是异常详细信息

Job aborted due to stage failure: Task 134555 in stage 32.0 failed 4 times, most recent failure: Lost task 134555.3 in stage 32.0 (TID 151065, <<some worker node IP>>, executor 318): java.io.FileNotFoundException: /opt/spark/tmp/spark-98331af4-b923-4342-ae3e-93e764b02d4a/executor-a5874092-943d-4b57-b1d0-eab05a3d36c5/blockmgr-17e989d8-4657-4a4e-bc93-ea075cb45f61/0f/temp_shuffle_1f574b0e-617b-46db-a558-9937a911c90a (No space left on device)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at org.apache.spark.storage.DiskBlockObjectWriter.initialize(DiskBlockObjectWriter.scala:103)
    at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:116)
    at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:249)
    at org.apache.spark.shuffle.sort.ShuffleExternalSorter.writeSortedFile(ShuffleExternalSorter.java:211)
    at org.apache.spark.shuffle.sort.ShuffleExternalSorter.closeAndGetSpills(ShuffleExternalSorter.java:419)
    at org.apache.spark.shuffle.sort.UnsafeShuffleWriter.closeAndWriteOutput(UnsafeShuffleWriter.java:230)
    at org.apache.spark.shuffle.sort.UnsafeShuffleWriter.write(UnsafeShuffleWriter.java:190)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:55)
    at org.apache.spark.scheduler.Task.run(Task.scala:121)
    at org.apache.spark.executor.Executor$TaskRunner$$anonfun$10.apply(Executor.scala:402)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:408)
    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)

Driver stacktrace:
作业因阶段失败而中止:阶段32.0中的任务134555失败4次,最近的失败:阶段32.0中的任务134555.3丢失(TID 151065,执行器318):java.io.FileNotFoundException:/opt/spark/tmp/spark-98331af4-b923-4342-ae3e-93e764b02d4a/executor-a5874092-943d-4b57-b1d0-eab05a3d36c5/blockmgr-17e989d8-4657-4a4e-bc93-ea075cb45f61/0f/temp\U shuffle\U 1f574b0e-617b-46db-a558-9937a911c90a(设备上没有剩余空间)
位于java.io.FileOutputStream.open0(本机方法)
在java.io.FileOutputStream.open(FileOutputStream.java:270)
位于java.io.FileOutputStream。(FileOutputStream.java:213)
在org.apache.spark.storage.DiskBlockObjectWriter.initialize(DiskBlockObjectWriter.scala:103)上
位于org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:116)
位于org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:249)
位于org.apache.spark.shuffle.sort.ShuffleExternalSorter.writeSortedFile(ShuffleExternalSorter.java:211)
位于org.apache.spark.shuffle.sort.ShuffleExternalSorter.closeandgetspips(ShuffleExternalSorter.java:419)
在org.apache.spark.shuffle.sort.unsafeshufflewwriter.closeAndWriteOutput(unsafeshufflewwriter.java:230)上
位于org.apache.spark.shuffle.sort.unsafeshufflewwriter.write(unsafeshufflewwriter.java:190)
在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99)上
在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:55)上
位于org.apache.spark.scheduler.Task.run(Task.scala:121)
位于org.apache.spark.executor.executor$TaskRunner$$anonfun$10.apply(executor.scala:402)
位于org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
位于org.apache.spark.executor.executor$TaskRunner.run(executor.scala:408)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
驱动程序堆栈跟踪:
下面是失败阶段的屏幕截图


我的理解是,没有办法禁用磁盘写入

ShuffleMapTask
s必须将中间混洗映射输出文件(混洗块)写入
spark.local.dir
目录,以便(此混洗阶段的)还原程序可以完成其工作(无双关语)


您可以尝试使用外部洗牌服务来减少磁盘使用量(这样,不是每个执行者都可以管理自己的洗牌相关目录,而是可以卸载它)。您可以在中稍微了解一下。

我的理解是,没有办法禁用磁盘写入

ShuffleMapTask
s必须将中间混洗映射输出文件(混洗块)写入
spark.local.dir
目录,以便(此混洗阶段的)还原程序可以完成其工作(无双关语)


您可以尝试使用外部洗牌服务来减少磁盘使用量(这样,不是每个执行者都可以管理自己的洗牌相关目录,而是可以卸载它)。您可以在中了解一下。

我有独立的spark cluster,这是由公司内部提供的,公司内部不提供此外部洗牌服务?在spark standalone cluster中,外部洗牌服务与工人的执行者一起运行。只需在启动独立工作程序时启用
spark.shuffle.service.enabled
。这意味着它将存储在同一个群集工作程序节点中,并且我们在该群集中面临磁盘空间问题,因此对我来说,这项服务没有use@Bravo想不出任何其他降低磁盘使用率的方法(除了使用代码以减少混乱和分区外)。您可能还需要查看
合并
重新分区
(带列和分区数)。但他们再次只是为了尽量减少磁盘使用,而不是完全消除磁盘使用。我有独立的spark cluster,这是由公司内部提供的,内部他们不提供此外部洗牌服务?在spark standalone cluster中,外部洗牌服务与工作人员上的执行者一起运行。只需打开
spark.Shuffle.Service.enabled
在启动独立工作程序时。这意味着它将存储在相同的群集工作程序节点中,并且我们在该群集中面临磁盘空间问题,因此对我来说,此服务没有use@Bravo想不出任何其他降低磁盘使用率的方法(除了使用代码以减少混乱和分区)。您可能还希望查看
合并
重新分区
(具有列和分区数)。但它们同样只是为了最大限度地减少磁盘使用,而不是完全消除磁盘使用。