Подтвердить что ты не робот

Spark 1.4 увеличивает память maxResultSize

Я использую Spark 1.4 для своих исследований и борюсь с настройками памяти. Моя машина имеет 16 ГБ памяти, поэтому проблем нет, так как размер моего файла составляет всего 300 МБ. Хотя, когда я пытаюсь преобразовать Spark RDD в panda с помощью функции toPandas(), я получаю следующую ошибку:

serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

Я попытался исправить это, изменив файл spark-config и по-прежнему получая ту же ошибку. Я слышал, что это проблема с искрой 1.4 и интересно, знаете ли вы, как это решить. Любая помощь очень ценится.

4b9b3361

Ответ 1

Вы можете установить параметр spark.driver.maxResultSize в объекте SparkConf:

from pyspark import SparkConf, SparkContext

# In Jupyter you have to stop the current context first
sc.stop()

# Create new config
conf = (SparkConf()
    .set("spark.driver.maxResultSize", "2g"))

# Create new context
sc = SparkContext(conf=conf)

Возможно, вы также должны создать новый SQLContext:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

Ответ 2

В командной строке, например с pyspark, --conf spark.driver.maxResultSize=3g также можно использовать для увеличения максимального размера результата.

Ответ 3

Настройка spark.driver.maxResultSize - это хорошая практика, учитывая текущую среду. Однако это не решение вашей проблемы, так как количество данных может время от времени меняться. Как сказал @Zia-Kayani, лучше собирать данные с умом. Поэтому, если у вас есть DataFrame df, вы можете вызвать df.rdd и выполнить все магические действия в кластере, а не в драйвере. Однако, если вам нужно собрать данные, я бы предложил:

  • Не включайте spark.sql.parquet.binaryAsString. Строковые объекты занимают больше места
  • Используйте spark.rdd.compress для сжатия RDD при их сборке
  • Попробуйте собрать его, используя разбивку на страницы. (код в Scala, из другого ответа Scala: как получить ряд строк в фрейме данных)

    long count = df.count() int limit = 50; while(count > 0){ df1 = df.limit(limit); df1.show(); //will print 50, next 50, etc rows df = df.except(df1); count = count - limit; }

Ответ 4

Похоже, вы собираете RDD, поэтому он обязательно соберет все данные в драйвер node, почему вы столкнулись с этой проблемой. Вы должны избегать сбора данных, если это не требуется для rdd, или если это необходимо, укажите spark.driver.maxResultSize. существует два способа определения этой переменной

1 - создайте Spark Config, установив эту переменную как conf.set("spark.driver.maxResultSize", "3g")
2 - или установите эту переменную в файле spark-defaults.conf, присутствующем в conf-каталоге искры. как spark.driver.maxResultSize 3g и перезапустите искру.

Ответ 5

Также есть ошибка Spark https://issues.apache.org/jira/browse/SPARK-12837 что дает ту же ошибку

 serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize

даже если вы не можете явно вытаскивать данные в драйвер.

SPARK-12837 адресует ошибку Spark, что аккумуляторы/широковещательные переменные до Spark 2 были вытащены на ненужный драйвер, вызывающий эту проблему.

Ответ 6

при запуске задания или терминала вы можете использовать

--conf spark.driver.maxResultSize="0"

чтобы удалить узкое место