2016-05-01 4 views
0

Я выполняю алгоритм Pregel с помощью Spark GraphX ​​в Scala.Ошибки памяти в фазе перетасовки (потерянная задача ...) при обработке очень большого графа с алгоритмом Pregel

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

У меня есть «Java Heap ошибки Space» в фазе в случайном порядке во время выполнения, после более чем 20 минут обработки: задачи потеряла ... Я буду анализировать эти параметры:

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

ответ

0

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

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

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

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

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

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

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

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

я обнаружил Моя главная проблема: в Список внутри каждого узла, который экономит «удачную ИНФО» неизменны.

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

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

Производительность сейчас более чем в 10 раз быстрее и ошибка памяти не появляется в настоящее время.

+0

Кроме того, я использовал стратегию StorageLevel.MEMORY_AND_DISK при загрузке графика. –

+0

Сколько элементов ваш «Список» содержит в среднем? –

+0

Каждый список содержит 10-20 элементов после 4 итераций в Pregel –

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

  • Нет связанных вопросов^_^