Как кэшировать данные на рабочих узлах Google Dataproc - PullRequest
0 голосов
/ 04 мая 2018

Я хочу кэшировать некоторые данные (ndarrays) локально на рабочих узлах, чтобы провести некоторое сравнение с ndarray, распределенным из входящих RDD из потоковой передачи Spark. Каков наилучший способ сделать это?

Поскольку я хочу сравнивать ndarrays, хранящиеся в моих файлах, с каждым отдельным ndarray, переданным из потоковой передачи Spark. Не похоже, что я могу загрузить эти данные в RDD, так как я не могу пройти через другой RDD внутри функции карты другого RDD. И я попытался загрузить их в список на главном узле и передать их на рабочие узлы. Но я получил ошибку, что широковещательная переменная не повторяется, когда я пытаюсь просмотреть их и сравнить с входящими данными.

1 Ответ

0 голосов
/ 30 мая 2018

Проблема заключалась в том, что вам нужно использовать метод value () для чтения фактического значения передаваемой переменной. Следуя примеру в комментарии @ user9613318:

bd_array = sc.broadcast(np.arange(100))

Это создаст пустой массив для этого диапазона и передаст его всем работникам. Если вы попытаетесь использовать переменную просто с помощью bd_array, вы получите класс широковещательной переменной, который имеет другие методы, такие как persist, destroy и т. Д. Это не повторяется. Если вы прочитаете его с помощью «bd_array.value», вы вернете широковещательный массив, который можно повторять ( некоторые документы здесь )

...