Я работаю с довольно большим (?) Графиком (60 миллионов вершин и 9,5 млрд. Ребер), используя Spark Graphframes. Основные данные невелики - вершины занимают около 500 МБ на диске, а ребра - около 40 ГБ. Мои контейнеры часто закрываются из-за проблем с памятью из-за проблем с памятью, но я думаю, что основная проблема заключается в том, что графический фрейм постоянно перетасовывает данные (я вижу, что shuffle read/write до 150gb). Есть ли способ эффективно разбивать Graphframe или основные края/вершины, чтобы уменьшить перемещение?Разделение на Spark Graphframes
ответ
TL; DR Невозможно эффективно разделить Graphframe
.
Graphframe
алгоритмы могут быть разделены на две категории:
Методы обработки которых делегат
GraphX
аналог. GraphX поддерживает ряд методов разбиения, но они не отображаются через APIGraphframe
. Если вы используете один из них, вероятно, лучше использоватьGraphX
напрямую.К сожалению, разработка
GraphX
практически полностью остановилась на нескольких небольших исправлениях за последние два года, а общая производительность очень разочаровывает по сравнению с обоими встроенными библиотеками и out-of-core libraries.Методы, которые реализованы изначально с использованием Spark
Datasets
, которые рассматривают ограниченную модель программирования и только один режим разбиения, крайне непригодны для сложной обработки графа.В то время как реляционное хранилище столбцов может использоваться для эффективной обработки графа наивный итеративный подход
join
, используемыйGraphframes
, просто не масштабируется (но это нормально для мелкого пересечения с одним или двумя перелетами).Вы можете попробовать перераспределить
vertices
иedges
DataFrames
поid
иsrc
соответственно:val nPart: Int = ??? GraphFrame(v.repartition(nPart, v("id")), e.repartition(e(nPart, "src")))
что должно помочь в некоторых случаях.
В целом, в текущем состоянии (декабрь 2016 года), Spark не является хорошим выбором для интенсивной графовой аналитики.
- 1. spark graphframes stateful motif
- 2. Graphframes BFS вопрос
- 3. PySpark, GraphFrames, exception Причина: java.lang.ClassNotFoundException: com.typesafe.scalalogging.slf4j.LazyLogging
- 4. не может найти модуль 'graphframes'
- 5. Apache Spark Разделение и присоединение к RDD
- 6. Разделение раздела Kafka и картирование исполнителя Spark
- 7. Разделение Spark для записи файла очень медленное
- 8. Разделение строк словами в Scala Spark
- 9. Apache Spark DataFrame нет Разделение RDD
- 10. разделение на "." используя flatMap в Spark для текстового файла
- 11. Влияет ли совместное разделение RDD на Shuffle в Apache Spark?
- 12. Spark: Разделение одного массива на элементы в другом
- 13. Использование пакетов Spark с ноутбуком Jupyter на HD Insight
- 14. Как использовать графические рамки внутри SPARK на кластере HDInsight
- 15. Разделение колонны на несколько столбцов
- 16. Разделение на ","?
- 17. Преобразование GraphFrames ShortestPath Map в строки DataFrame в PySpark
- 18. SBT в кадрах графа Apache-Spark
- 19. Как работает разбиение на Spark?
- 20. Пользовательское разделение JavaDStreamPairRDD
- 21. Как изменить разделение на горизонтальное разделение на R?
- 22. Являются ли GraphFrames совместимыми с типизированным набором данных?
- 23. Разделение JS на массив
- 24. Разделение daterange на столбцы
- 25. Разделение на импорт/отчетность
- 26. Разделение вектора на категории
- 27. Разделение позиции на вход
- 28. разделение строк на -
- 29. Разделение матлаба на сетки
- 30. Разделение поля на Sitecore
Оцените понимание. Я обнаружил, что могу повысить производительность, создав пользовательский столбец в пограничном фреймворке с использованием GraphX [схемы разделов] (http://note.yuhc.me/2015/03/graphx-partition-strategy/) и разбив на него. – John
@John Я не мог понять это, у вас есть пример того, как сделать разбиение на пользовательский столбец? –
@John Можете ли вы поделиться обновлением о том, как вы решили эту проблему с производительностью? –