Выпуск Spark Executor OOM - PullRequest
       19

Выпуск Spark Executor OOM

0 голосов
/ 25 января 2019

У меня есть типичное пакетное задание, которое читает CSV из облачного хранилища, затем выполняет объединение и агрегирование, весь файл не превышает 3G. Но я получаю исключение OOM при записи результата обратно в хранилище, у меня есть два исполнителя, каждый имеет 80 ГБ ОЗУ, это просто не имеет смысла, вот снимок экрана моего искрового интерфейса и исключения. И предложение приветствуется, если мой код является сверхоптимальным с точки зрения памяти, почему он не отображается в пользовательском интерфейсе spark? enter image description here

enter image description here

обновление: исходный код слишком сложен, чтобы показать его здесь, но я выяснил, что основной причиной является множественное соединение.

Dataset<Row> ret = something dataframe
for (String cmd : cmds) {
   ret = ret.join(processDataset(ret, cmd), "primary_key")
}

итак, каждый processDataset (ret, cmd), если вы запускаете его сам по себе, он очень быстрый, но если у вас есть такое объединение циклов for много раз, скажем, 10 или 20 раз, он получает много намного медленнее, и у вас возникают проблемы с OOM.

1 Ответ

0 голосов
/ 25 января 2019

Когда у меня возникают проблемы с памятью, я проверяю следующие вещи:

  • Иметь больше исполнителей (более 2, определяется total-executor-cores в spark-submit и spark.executor.core в SparkSession)
  • Иметь меньше ядер на исполнителя (3-5). У вас есть 14, что гораздо больше, чем рекомендуется (spark.executor.core)
  • Добавление памяти исполнителям (spark.executor.memory)
  • Добавление памяти в драйвер (driver-memory в скрипте spark-submit)
  • Сделать больше разделов (уменьшить размер разделов) (.config("spark.sql.shuffle.partitions", numPartitionsShuffle) в SparkSession)
  • Посмотрите на PeakExecutionMemory вкладки Tasks in Stages (одна из дополнительных метрик для включения), чтобы увидеть, не слишком ли она велика
  • Если вы используете Mesos на вкладке Агенты, вы можете увидеть реальное использование памяти для каждого драйвера и исполнителей (см. Этот ответ Как получить память Mesos Agents Framework Executor
  • Посмотрите на explain в вашем коде, чтобы проанализировать план выполнения
  • Посмотрите, не разрушит ли одно из ваших объединений вашу память, сделав несколько дубликатов строк
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...