2015-06-12 4 views
25

Я запускаю приложение Spark streaming с двумя рабочими. Приложение имеет объединение и объединение операций.Как оптимизировать разлив в случайном порядке в приложении Apache Spark

Все партии успешно завершены, но заметили, что показатели разлива в случайном порядке не соответствуют размеру входных данных или размера выходных данных (память разливов более 20 раз).

Пожалуйста, найти детали искровой стадии в изображении ниже: enter image description here

После исследования по этому вопросу, обнаружили, что

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

Shuffle spill (memory) - размер десериализованных виде данных в памяти во время разлива

shuffle spill (disk) - размер сериализованных виде данных на диск после того, как разлив

Поскольку десериализованные данные занимает больше места, чем сериализованные данные. Таким образом, переполнение Shuffle (память) больше.

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

Мои запросы:

ли это проливая влияет на производительность значительно?

Как оптимизировать это разлив как памяти, так и диска?

Есть ли какие-либо свойства искры, которые могут уменьшить/контролировать это огромное утепление?

+0

@mitchus Частично Да, я просто увеличил количество задач и выделил больше памяти для перетасовки. Кроме того, я оптимизировал свой код, чтобы уплотнить размер структуры данных ... –

ответ

34

Учимся настраивать игру. Искра требует довольно много исследований и обучения. Есть несколько хороших ресурсов, включая this video. Spark 1.4 имеет лучшую диагностику и визуализацию в интерфейсе, который может вам помочь.

Таким образом, вы разливаете, когда размер разделов RDD в конце этапа превышает объем памяти, доступный для буфера перетасовки.

Вы можете:

  1. вручную repartition() вашего предварительного этапа, так что у вас есть меньшие разделы от входа.
  2. Увеличение буфера в случайном порядке путем увеличения памяти в процессах исполнителя (spark.executor.memory)
  3. Увеличения буфера в случайном порядке путем увеличения доли исполнителя памяти, выделенную ему (spark.shuffle.memoryFraction) от заданного по умолчанию 0,2. Вы должны вернуть spark.storage.memoryFraction.
  4. Увеличение буфера в случайном порядке для каждого потока, уменьшая соотношение рабочих потоков (SPARK_WORKER_CORES) Исполнитель модулю памяти

Если эксперт прослушивание, я хотел бы знать больше о том, как настройки memoryFraction взаимодействуют и их разумное ассортимент.

+0

Перераспределение может перетасовывать ненужные данные, использовать coalesce внутри, использовать комбайнер, чтобы минимизировать перетасовку. –

+4

@VenuAPositive Я думаю, что он предлагал перераспределить больше разделов не меньше. Если бы он собирался на меньшее количество разделов, то объединение было бы разумным. –

+0

spark.shuffle.memoryFraction больше не используется после искры 1.5, если вы не активируете устаревший режим. См. Https://spark.apache.org/docs/latest/configuration.html. –

Смежные вопросы