Как правильно использовать переменную Broadcast в Spark GraphX? - PullRequest
0 голосов
/ 02 марта 2020

Я использую GraphX ​​для обработки графика. я использовал GraphLoader для его загрузки и создал переменную, которая содержит соседей каждого узла, используя следующий код:

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

, потому что мне часто нужны узлы-соседи, я решил передать их. Когда я использую этот код, я получаю ошибку:

val broadcastVar = sc.broadcast(all_neighbors)

, но когда я использую этот код, ошибки нет:

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

Правильно ли использовать collect () для трансляции ??

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

val nvalues = broadcastVar.value.toMap

транслируется ли вышеуказанный код (я имею в виду nvalues) всем ведомым в кластере ?? я должен транслировать значения тоже ?? Я немного запутался с темой широкого спектра. пожалуйста, помогите мне с этой проблемой.

1 Ответ

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

Есть два вопроса:

Правильно ли использовать collect () для вещания ??

all_neighbors имеет тип VertexRDD, который по сути является СДР , В RDD нет ничего, что вы могли бы транслировать. RDD - это структура данных, которая описывает распределенные вычисления для некоторых наборов данных. По функциям RDD вы можете описать, что и как вычислять. Это абстрактная сущность. Вы можете транслировать только реальное значение, но СДР - это просто контейнер значений, которые доступны только тогда, когда исполнители обрабатывают свои данные.

цитирование из Broadcast Variables :

Широковещательные переменные позволяют программисту хранить переменную только для чтения в кэше на каждом компьютере, а не отправлять ее копию с задачами. Их можно использовать, например, для эффективного предоставления каждому узлу копии большого входного набора данных.

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

По этой причине нам нужно выполнить collect набор данных, который хранится в RDD, который преобразует RDD в локально доступную коллекцию, которую затем можно транслировать.

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

. Передается ли вышеуказанный код (я имею в виду nvalues) всем ведомым в кластере ?? я тоже должен транслировать nvalues ​​??

Это полностью зависит от вашего варианта использования. Если вы хотите использовать только broadcastVar, то только транслировать его или если вы хотите использовать nvalues, только широковещание nvalues, иначе вы можете транслировать оба значения, хотя вам нужно быть осторожным с ограничениями памяти.

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

...