2016-12-27 2 views
6

Я работаю с довольно большим (?) Графиком (60 миллионов вершин и 9,5 млрд. Ребер), используя Spark Graphframes. Основные данные невелики - вершины занимают около 500 МБ на диске, а ребра - около 40 ГБ. Мои контейнеры часто закрываются из-за проблем с памятью из-за проблем с памятью, но я думаю, что основная проблема заключается в том, что графический фрейм постоянно перетасовывает данные (я вижу, что shuffle read/write до 150gb). Есть ли способ эффективно разбивать Graphframe или основные края/вершины, чтобы уменьшить перемещение?Разделение на Spark Graphframes

ответ

6

TL; DR Невозможно эффективно разделить Graphframe.

Graphframe алгоритмы могут быть разделены на две категории:

  • Методы обработки которых делегат GraphX аналог. GraphX ​​поддерживает ряд методов разбиения, но они не отображаются через API Graphframe. Если вы используете один из них, вероятно, лучше использовать GraphX напрямую.

    К сожалению, разработка GraphX практически полностью остановилась на нескольких небольших исправлениях за последние два года, а общая производительность очень разочаровывает по сравнению с обоими встроенными библиотеками и out-of-core libraries.

  • Методы, которые реализованы изначально с использованием Spark Datasets, которые рассматривают ограниченную модель программирования и только один режим разбиения, крайне непригодны для сложной обработки графа.

    В то время как реляционное хранилище столбцов может использоваться для эффективной обработки графа наивный итеративный подход join, используемый Graphframes, просто не масштабируется (но это нормально для мелкого пересечения с одним или двумя перелетами).

    Вы можете попробовать перераспределить vertices и edgesDataFrames по id и src соответственно:

    val nPart: Int = ??? 
    
    GraphFrame(v.repartition(nPart, v("id")), e.repartition(e(nPart, "src"))) 
    

    что должно помочь в некоторых случаях.

В целом, в текущем состоянии (декабрь 2016 года), Spark не является хорошим выбором для интенсивной графовой аналитики.

+1

Оцените понимание. Я обнаружил, что могу повысить производительность, создав пользовательский столбец в пограничном фреймворке с использованием GraphX ​​[схемы разделов] (http://note.yuhc.me/2015/03/graphx-partition-strategy/) и разбив на него. – John

+0

@John Я не мог понять это, у вас есть пример того, как сделать разбиение на пользовательский столбец? –

+0

@John Можете ли вы поделиться обновлением о том, как вы решили эту проблему с производительностью? –

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