Я выполняю задание 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
удаление кэша данных между двумя фазами, которые нуждаются в этом, помогли, и я не получил никаких ошибок.
Интересно, как это поможет с промежуточными файлами перемешивания.