Spark StorageLevel в локальном режиме не работает? - PullRequest
0 голосов
/ 01 февраля 2019
  • Работа в локальном режиме
  • Память компьютера: 16 ГБ
  • Доступное дисковое пространство компьютера: 500 ГБ
  • Размер входного файла: 50 ГБ
  • Сообщение об ошибке: java.lang.OutOfMemoryError: Пространство кучи Java
  • Код: , введенный в команду windowsзапрос после использования. \ pyspark в командном окне

Код

from pyspark import SparkConf, SparkContext
import pyspark

rdd = sc.textFile('file:///myBigFile.xml')
rdd.persist(pyspark.StorageLevel.DISK_ONLY)

rdd.take(60).show() ****Blows up here****

Чтение документации по StorageLevel

Флаги для управления хранением СДР.Каждый StorageLevel записывает, использовать ли память, переносить ли RDD на диск, если он выпадает из памяти

Если это действительно так, то почему этот код нарушает прокладку?

Другие сталкивались с чем-то похожим и, по-видимому, являются открытым дефектом.

Как указано ниже: SPARK-24961 - операция сортировки вызывает нехватку памяти https://issues.apache.org/jira/browse/SPARK-24961

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я думаю, что это, вероятно, неправильное использование персистентной операции.Persist используется для хранения всего rdd-содержимого в заданном месте, по умолчанию в памяти.Ваш rdd - это файл размером 50 ГБ, и он не помещается в память.StorageLevel.DISK_ONLY скопирует ваш файл во временную папку искры.Таким образом, ваш файл существует в двух экземплярах на диске без дополнительного значения.

1: rdd = sc.textFile('file:///myBigFile.xml')
2: small_rdd = heavy_computation(rdd).persist()
3: rdd1 = more_heavy_computation(small_rdd)
4: rdd2 = more_heavy_computation(small_rdd)

В этом примере промежуточный результат (2 :) сохраняется функцией persist () в памяти.Я предполагаю, что промежуточный результат был очень дорогим для вычисления (тяжелым при использовании процессора в течение большого количества времени) и помещается в память.Вам нужен результат дважды (3: / 4 :).Без использования постоянных строк 3 и 4 будет произведен перерасчет heavy_computation.Использование persist () heavy_computation выполняется один раз, а промежуточный результат используется для 3 + 4.

ПРИМЕЧАНИЕ. Если вычисление промежуточного результата было очень дорогим, но не умещалось в памяти, альтернативой является DISK_ONLY.Например, для вычисления промежуточного результата потребовался целый день, было бы лучше сохранить его на диск, чем вычислять его во второй раз.

Обратите внимание, что spark работает лениво.Приведенный выше пример не заметит, что процессор будет работать при добавлении этого:

6: rdd1.show()
7: rdd2.show()

Операции, такие как show / save / write / ... позволяет свече начать вычисление.

rdd = sc.textFile('file:///myBigFile.xml')
rdd.take(60).show()

Это будетбегите быстро и не должны исчерпывать память.

0 голосов
/ 01 февраля 2019

К сожалению, по моему опыту, это общая проблема;даже если вы укажете DISK_ONLY или MEMORY_AND_DISK, постоянство, по-видимому, потребляет некоторую память и может легко вызвать ошибки OutOfMemoryErrors.

Обратите внимание, что persist() стоит использовать только в том случае, если вы многократно используете один и тот же RDD и вам не нужно восстанавливать его изисходный набор данных.Если вы используете его только один или два раза, часто быстрее оставить его без присмотра, и с гораздо меньшей вероятностью произойдет сбой из-за ошибок памяти.

Вы также можете попытаться увеличить объем выделенной памятивашим исполнителям;этого может быть достаточно, чтобы избежать ошибки.

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