Я знаю, что он использует pickle и отправляет вещи по узлам, хранит в памяти и так далее. что меня смущает, так это то, почему синтаксис его использования в pyspark работает.

def main():
    sc = SparkContext()
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(worker)

def worker(element):
    element *= V.value

Почему приведенный выше код не получает неопределенную жалобу «V»? Я искал исходный код, связанный с трансляцией, в pyspark, но ничего не понял.

6
dennis.s 26 Ноя 2014 в 12:06

2 ответа

Я считаю, что ваша проблема - это просто проблема с областью действия Python. Если вы попробуете следующий код Python, отличный от Spark, он также выдаст ошибку «V» не определен:

def runner(func):
    func()

def main():
    V = 22
    A = runner(worker)

def worker():
    print V

if __name__ == '__main__':
    main()

Одно исправление заключается в том, что вы можете переместить worker() внутрь main() (или, альтернативно, сделать V глобальной переменной):

def main():
    sc = SparkContext()
    someValue = rand()
    V = sc.broadcast(someValue)
    def worker(element):
        element *= V.value
    A = sc.parallelize().map(worker)
3
Dolan Antenucci 27 Июн 2015 в 19:09
1
Договорились о масштабировании. Вот альтернативный ответ для рабочей функции: stackoverflow .com/questions/26959221/…
 – 
Paul
27 Июл 2015 в 17:00

Из научных статей Spark Spark: кластерные вычисления с рабочими наборами Матей Захария, Мошараф Чоудхури, Майкл Дж. Франклин, Скотт Шенкер, Ион Стойка. HotCloud 2010. Июнь 2010.

Общие переменные: два типа общих переменных в Spark, широковещательные переменные и аккумуляторы, реализуются с использованием классов с пользовательскими форматами сериализации. Когда кто-то создает широковещательную переменную b со значением v, v сохраняется в файл в общей файловой системе. Сериализованная форма b — это путь к этому файлу. Когда значение b запрашивается на рабочем узле, Spark сначала проверяет, находится ли v в локальном кеше, и считывает его из файловой системы, если это не так. Первоначально мы использовали HDFS для трансляции переменных, но мы разрабатываем более эффективную систему потокового вещания.

2
Shawn Guo 10 Дек 2014 в 19:02
3
Спасибо @Shawn, но это не отвечает на мой вопрос о «синтаксисе».
 – 
dennis.s
11 Дек 2014 в 09:49