#apache-spark
#apache-spark
Вопрос:
У меня есть набор больших переменных, которые я транслирую. Эти переменные загружаются из кластеризованной базы данных. Возможно ли распределить нагрузку из базы данных по рабочим узлам, а затем, чтобы каждый передавал свои конкретные переменные всем узлам для последующих операций отображения?
Спасибо!
Ответ №1:
Широковещательные переменные обычно передаются workers, но я могу рассказать вам, что я сделал в аналогичном случае в python.
Если вы знаете общее количество строк, вы можете попытаться создать RDD такой длины, а затем выполнить над ним операцию сопоставления (которая будет распространена среди рабочих). На карте рабочие запускают функцию для получения некоторого фрагмента данных (не уверен, как вы собираетесь заставить их всех получать разные данные).
Каждый работник будет извлекать необходимые данные, совершая звонки. Затем вы могли бы выполнить collectAsMap(), чтобы получить словарь и передать его всем работникам.
Однако имейте в виду, что вам нужны все программные зависимости от выполнения клиентских запросов для каждого работника. Вам также необходимо помнить об использовании сокетов. Я только что сделал что-то подобное с запросом API и не увидел увеличения количества сокетов, хотя я делал регулярные HTTP-запросы. Не уверен….
Комментарии:
1. Довольно просто создать функцию разделения для данных, поступающих из базы данных, чтобы гарантировать, что каждый работник получает только уникальное подмножество. Кажется глупым, чтобы один драйвер обрабатывал один поток, извлекающий все данные из БД только для трансляции данных в кластер. Почему бы кластеру не выполнить эту работу?
Ответ №2:
Итак, ответ, похоже, отрицательный.
Вызов sc.broadcast(someRDD) приводит к ошибке. Сначала вы должны собрать () его обратно в драйвер.