Сравнение пересечения между двумя узлами с использованием широковещательной переменной и использованием RDD.filter в Spark GraphX - PullRequest
0 голосов
/ 02 марта 2020

я работаю над графиками в GraphX. используя приведенный ниже код, я создал переменную для хранения соседей узлов в СДР:

val all_neighbors: VertexRDD[Array[VertexId]] = graph.collectNeighborIds(EdgeDirection.Either)

я использовал широковещательную переменную для широковещательной передачи соседей всем ведомым, используя следующий код:

val broadcastVar = all_neighbors.collect().toMap
val nvalues = sc.broadcast(broadcastVar)

Я хочу вычислить пересечение между соседями двух узлов. например, пересечение между узлами 1 и соседями узла 2.

Сначала я использую этот код для вычисления пересечения, которое использует переменную широковещания nvalues:

val common_neighbors=nvalues.value(1).intersect(nvalues.value(2))

, и как только я использовал приведенный ниже код для вычисление пересечения двух узлов:

val common_neighbors2=(all_neighbors.filter(x=>x._1==1)).intersection(all_neighbors.filter(x=>x._1==2))

Мой вопрос заключается в следующем: какой из перечисленных выше методов эффективен и более распределен и параллелен ? используя широковещательную переменную nvalue для вычисления пересечения или используя метод фильтрации RDD ?

1 Ответ

0 голосов
/ 02 марта 2020

Я думаю, это зависит от ситуации.

В случае, если ваш размер nvalues меньше и может вписаться в каждый узел исполнителя и драйвера, подход с широковещательной передачей будет оптимальным, поскольку данные кэшируются в исполнители и эти данные не пересчитываются снова и снова. Кроме того, это спасет искру от огромного общения и вычислительной нагрузки. В таких случаях другой подход не является оптимальным, поскольку может случиться так, что all_neighbours rdd вычисляется каждый раз, и это снизит производительность, поскольку будет много повторных вычислений и увеличит стоимость вычислений.

В В случае, когда ваш nvalues не может вписаться в каждый узел исполнителя и драйвера, трансляция не будет работать, так как вызовет ошибку. Следовательно, не остается иного выбора, кроме как использовать второй подход, хотя он все еще может вызывать проблемы с производительностью, по крайней мере, код будет работать !!

Дайте мне знать, если это поможет !!

...