Spark java.lang.OutOfMemoryError: пространство кучи Java - PullRequest
0 голосов
/ 28 июня 2018

Я получаю вышеуказанную ошибку при запуске модельного учебного конвейера с искрой

`val inputData = spark.read
  .option("header", true)
  .option("mode","DROPMALFORMED")
  .csv(input)
  .repartition(500)
  .toDF("b", "c")
  .withColumn("b", lower(col("b")))
  .withColumn("c", lower(col("c")))
  .toDF("b", "c")
  .na.drop()`

inputData имеет около 25 миллионов строк и имеет размер около 2 ГБ. фаза построения модели происходит примерно так

val tokenizer = new Tokenizer()
  .setInputCol("c")
  .setOutputCol("tokens")

val cvSpec = new CountVectorizer()
  .setInputCol("tokens")
  .setOutputCol("features")
  .setMinDF(minDF)
  .setVocabSize(vocabSize)

val nb = new NaiveBayes()
  .setLabelCol("bi")
  .setFeaturesCol("features")
  .setPredictionCol("prediction")
  .setSmoothing(smoothing)

new Pipeline().setStages(Array(tokenizer, cvSpec, nb)).fit(inputData)

Я запускаю вышеуказанные искровые задания локально на машине с 16 ГБ ОЗУ, используя следующую команду

spark-submit --class holmes.model.building.ModelBuilder ./holmes-model-building/target/scala-2.11/holmes-model-building_2.11-1.0.0-SNAPSHOT-7d6978.jar --master local[*] --conf spark.serializer=org.apache.spark.serializer.KryoSerializer --conf spark.kryoserializer.buffer.max=2000m --conf spark.driver.maxResultSize=2g --conf spark.rpc.message.maxSize=1024 --conf spark.memory.offHeap.enabled=true --conf spark.memory.offHeap.size=50g --driver-memory=12g

Ошибка oom вызывается (в нижней части трассировки стека) от org.apache.spark.util.collection.ExternalSorter.writePartitionedFile (ExternalSorter.scala: 706)

Журналы:

Caused by: java.lang.OutOfMemoryError: Java heap space at java.lang.reflect.Array.newInstance(Array.java:75) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1897) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) org.apache.spark.util.collection.ExternalSorter.writePartitionedFile(ExternalSorter.scala:706) 

Любые предложения будут отличными:)

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Обычно эта ошибка выдается, когда недостаточно места для размещения объекта в куче Java. В этом случае сборщик мусора не может освободить место для размещения нового объекта, и куча не может быть расширена дальше. Кроме того, эта ошибка может возникать, когда недостаточно встроенной памяти для поддержки загрузки класса Java. В редких случаях может возникать ошибка java.lang.OutOfMemoryError, когда на сборку мусора уходит слишком много времени и освобождается мало памяти.

Как исправить ошибку:

Как настроить память Apache Spark Executor

Spark java.lang.OutOfMemoryError: Java heap space

0 голосов
/ 28 июня 2018

Вещи, которые я бы попробовал:

1) Извлечение spark.memory.offHeap.enabled=true и увеличение объема памяти драйвера примерно до 90% доступной памяти на коробке. Вы, вероятно, знаете об этом, поскольку вы не установили память исполнителя, но в локальном режиме драйвер и исполнитель работают в одном и том же процессе, который управляется памятью драйвера. Я не пробовал, но функция offHeap звучит так, как будто она имеет ограниченную ценность. Ссылка

2) Фактический кластер вместо локального режима. Чем больше узлов, тем больше оперативной памяти.

3a) Если вы хотите придерживаться локального режима, попробуйте использовать меньше ядер. Вы можете сделать это, указав количество ядер для использования в мастер-настройке, например --master local[4] вместо local[*], который использует все из них. Запуск с меньшим количеством потоков одновременно, обработка данных приведет к уменьшению объема данных в ОЗУ в любой момент времени.

3b) Если вы переместитесь в кластер, вы также можете настроить количество ядер исполнителей по той же причине, что и упомянутая выше. Вы можете сделать это с флагом --executor-cores.

4) Попробуйте использовать больше разделов. В вашем примере кода вы перераспределили 500 разделов, может быть, попробуйте 1000 или 2000? Чем больше разделов, тем меньше размер каждого раздела и меньше нагрузки на память.

...