spark "java.io.IOException: на устройстве не осталось места" - PullRequest
0 голосов
/ 05 июля 2018

Я выполняю задание pyspark на кластере ec2 с 4 работниками. я получаю эту ошибку:

2018-07-05 08:20:44 WARN  TaskSetManager:66 - Lost task 1923.0 in stage 18.0 (TID 21385, 10.0.5.97, executor 3): java.io.IOException: No space left on device
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at org.apache.spark.storage.TimeTrackingOutputStream.write(TimeTrackingOutputStream.java:58)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at net.jpountz.lz4.LZ4BlockOutputStream.finish(LZ4BlockOutputStream.java:260)
at net.jpountz.lz4.LZ4BlockOutputStream.close(LZ4BlockOutputStream.java:190)
at org.apache.spark.serializer.DummySerializerInstance$1.close(DummySerializerInstance.java:65)
at org.apache.spark.storage.DiskBlockObjectWriter.commitAndGet(DiskBlockObjectWriter.scala:173)
at org.apache.spark.shuffle.sort.ShuffleExternalSorter.writeSortedFile(ShuffleExternalSorter.java:194)
at org.apache.spark.shuffle.sort.ShuffleExternalSorter.closeAndGetSpills(ShuffleExternalSorter.java:416)
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:96)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
at org.apache.spark.scheduler.Task.run(Task.scala:109)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)

я посмотрел на https://forums.databricks.com/questions/277/how-do-i-avoid-the-no-space-left-on-device-error.html

попытался увеличить разделение в случайном порядке - та же проблема. мои данные выглядят довольно равномерно распределенными по исполнителям. Я хочу попробовать обходной путь назначения Null или None для фреймов данных, вопрос в том, действительно ли он удалит промежуточные файлы тасования и не будет сохранен лингейдж.

например, если мой код выглядит так:

df1 = sqlContext.read.parquet(...)
df2= df1.filter()
df3 = df2.groupBy(*groupList).agg(....)

и я поставлю

df1 = Null

после как 1 - сэкономит ли это место в случайном порядке, не нужно ли это, и будет ли он пересчитан для df2, df3?

второй вопрос - Поможет ли контрольная точка df1 или df2 сломать линию?

что является возможным решением при работе с данными, превышающими мое хранилище (обработано около 400 ГБ необработанных данных)

UPDATE удаление кэша данных между двумя фазами, которые нуждаются в этом, помогли, и я не получил никаких ошибок. Интересно, как это поможет с промежуточными файлами перемешивания.

1 Ответ

0 голосов
/ 05 июля 2018

Я сталкивался с подобной ситуацией. Причина в том, что при использовании group by операций и joins данные будут перетасовываться. Поскольку эти данные shuffle являются временными данными при выполнении в приложениях spark, они будут храниться в каталоге, на который указывает spark.local.dir в файле spark-defaults.conf, который обычно является каталогом tmp с меньшим пространством.

Как правило, чтобы избежать этой ошибки в файле spark-defaults.conf, обновите spark.local.dir до места, в котором больше памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...