Ошибки памяти на этапе перемешивания (потерянная задача) при обработке очень большого графа с помощью алгоритма Pregel

Я выполняю алгоритм Pregel с помощью Spark GraphX ​​в Scala.

Мой граф содержит 1 миллион узлов и 5 миллионов ребер между ними. Мой кластер очень мощный, с несколькими серверами для BigData, по 256 ГБ памяти каждый.

У меня возникла ошибка "Ошибка пространства кучи Java" на этапе перемешивания во время выполнения, после более чем 20 минут обработки: задача потеряна.. Я собираюсь проанализировать эти параметры:

  • Анализ того, как я загружаю график и его постоянство (StorageLevel)
  • Анализ памяти, используемой: узлами, ребрами и отправленными сообщениями
  • Анализ параметров, установленных в Spark при использовании команды spark-submit: количество исполнителей, память/виртуальные ядра на исполнителя, сериализация...

person Carlos AG    schedule 01.05.2016    source источник


Ответы (1)


Заключение моего анализа и оптимизаций, которые я использовал:

  • Параметры Spark, используемые в spark-submit: 90% используется память доступной YARN в кластере. Я использовал 3 виртуальных ядра/исполнитель и 3 исполнителя на физический сервер. Я запускаю его с помощью KryoSerializer, чтобы уменьшить объем хранимых данных.

  • График — СДР узлов и ребер: ранее я создавал и сохранял СДР узлов и ребер в HDFS в 1000 файлов с помощью объединения, чтобы данные сохранялись. равномерно, хотя и длится долго.

  • График — загрузка: из существующих файлов RDD в HDFS.

  • График — узлы и ребра: загружается правильно. Их атрибуты в scala — это только те, которые использую я (по 5 атрибутов в каждом) и с минимальным использованием памяти (целые числа), без вспомогательных атрибутов.

  • График – сообщения, объединенные методом mergeMsg: я объединяю два сообщения, используя собственную формулу (связанную с целью моего проекта).

  • График — vprog: узлы собирают всю информацию, полученную в сообщениях, и сохраняют ее в списке «известной достоверной информации» внутри каждого узла. Эта информация используется для создания

  • График — сообщения, отправленные в методе sendMsg: каждый узел использует свою информацию (список известных полезных сведений и другие атрибуты) для создания сообщений для отправки. Также, чтобы уменьшить количество сообщений, я отфильтровал бесполезные сообщения, чтобы не отправлять их в Iterator.

Я обнаружил МОЮ ГЛАВНУЮ ПРОБЛЕМУ: список внутри каждого узла, который сохраняет "известную полезную информацию", является неизменяемым.

РЕШЕНИЕ. Я должен использовать ListBuffer (изменяемый). Кроме того, я должен использовать метод .append() вместо .++(), потому что он создает новый экземпляр списка.

Дополнительная информация о коллекциях в scala: http://docs.scala-lang.org/overviews/collections/performance-characteristics

Производительность увеличилась более чем в 10 раз, ошибки памяти больше не появляются.

person Carlos AG    schedule 01.05.2016
comment
Также я использовал стратегию StorageLevel.MEMORY_AND_DISK при загрузке графа. - person Carlos AG; 01.05.2016
comment
В каждом списке 10-20 пунктов после 4-х итераций в Pregel - person Carlos AG; 01.05.2016