Apache Spark: что происходит, когда вы используете значение хост-объекта в рабочем потоке, который не транслировался?

Представьте себе такую ​​простую программу:

def main(args: String[]):
 val hostLocalValue = args(0).toInt
 val someRdd = getSomeIntRdd
 val mySum = someRdd
       .map(x => if (x < 0) 1 else hostLocalValue)
       .reduce(_ + _)
 print(mySum)

Функция map, которая выполняется на удаленном рабочем месте, использует локальное значение хоста без его широковещательной передачи. Как это работает? Если ЭТО работает постоянно, то зачем нам broadcast()?


person Ilya Smagin    schedule 20.10.2014    source источник


Ответы (1)


В вашем примере «hostLocalValue» будет сериализован и отправлен на каждый рабочий узел с закрытием «карты». Если у вас есть 1000 разделов, эта переменная будет распределена по рабочим процессам 1000 раз. Ваша переменная - Int, так что все в порядке. Но если ваша переменная будет словарной картой ~ 100 МБ, вам придется отправить 100 гигов по сети.

Но если вы завернете свой словарь в трансляцию, вам придется отправить его только один раз => Выгода!

person Eugene Zhulenev    schedule 20.10.2014
comment
Не будет ли это по-прежнему 100-гигабайтным трафиком? Я думаю, что да, но операция «отправить» будет выполнена только один раз. Я прав? - person Ilya Smagin; 21.10.2014
comment
Если у вас есть словарь объемом 100 МБ, 10 рабочих узлов, набор данных, который вы хотите сопоставить, имеет 1000 разделов (по 100 для каждого рабочего), вам придется отправить 100 МБ * 10 = 1 гигабайт данных, если вы отправляете эти данные с узла драйвера. Однако для широковещательной переменной Spark использует высокопроизводительный протокол p2p, поэтому он будет намного быстрее. С сериализацией Java вам придется отправлять сериализованные clojure с данными 100 МБ 1000 раз. - person Eugene Zhulenev; 21.10.2014