廣播變量
Spark有兩種共享變量——累加器泽篮、廣播變量赔嚎。廣播變量可以讓程序高效地向所有工作節(jié)點(diǎn)發(fā)送一個(gè)較大的只讀值现喳,以供一個(gè)或多個(gè)Spark操作使用怔接。
需求來(lái)源
Spark中分布式執(zhí)行的代碼需要傳遞到各個(gè)Executor的Task上運(yùn)行吟税。對(duì)于一些只讀凹耙、固定的數(shù)據(jù)(比如從DB中讀出的數(shù)據(jù)),每次都需要Driver廣播到各個(gè)Task上,這樣效率低下肠仪。廣播變量允許將變量只廣播(提前廣播)給各個(gè)Executor肖抱。該Executor上的各個(gè)Task再?gòu)乃诠?jié)點(diǎn)的BlockManager獲取變量,而不是從Driver獲取變量异旧,從而提升了效率意述。
一個(gè)Executor只需要在第一個(gè)Task啟動(dòng)時(shí),獲得一份Broadcast數(shù)據(jù)吮蛹,之后的Task都從本節(jié)點(diǎn)的BlockManager中獲取相關(guān)數(shù)據(jù)荤崇。
使用方法
1.調(diào)用SparkContext.broadcast方法創(chuàng)建一個(gè)Broadcast[T]對(duì)象。任何序列化的類型都可以這么實(shí)現(xiàn)潮针。
2.通過(guò)value屬性訪問(wèn)改對(duì)象的值(Java之中為value()方法)
3.變量只會(huì)被發(fā)送到各個(gè)節(jié)點(diǎn)一次术荤,應(yīng)作為只讀值處理(修改這個(gè)值不會(huì)影響到別的節(jié)點(diǎn))
上面這個(gè)程序可以運(yùn)行,但是如果表更加大(比如表中不是呼號(hào)每篷,而是IP地址)瓣戚,signPrefixes很容易就會(huì)達(dá)到MB級(jí)別的大小,從主節(jié)點(diǎn)為每個(gè)任務(wù)發(fā)送一個(gè)這樣的數(shù)據(jù)就會(huì)代價(jià)巨大雳攘。而且如果之后還要再次使用signPrefixes這個(gè)對(duì)象带兜,則還需要向每個(gè)節(jié)點(diǎn)再發(fā)送一遍。
所以可以將signPrefixes作為廣播變量來(lái)解決這個(gè)問(wèn)題: