操作場景
Broadcast(廣播)可以把數(shù)據(jù)集合分發(fā)到每一個節(jié)點(diǎn)上郁稍,Spark任務(wù)在執(zhí)行過程中要使用這個數(shù)據(jù)集合時捷兰,就會在本地查找Broadcast過來的數(shù)據(jù)集合折欠。如果不使用Broadcast造壮,每次任務(wù)需要數(shù)據(jù)集合時,都會把數(shù)據(jù)序列化到任務(wù)里面绪商,不但耗時苛谷,還使任務(wù)變得很大。
? ? ? ? 1格郁、每個任務(wù)分片在執(zhí)行中都需要同一份數(shù)據(jù)集合時腹殿,就可以把公共數(shù)據(jù)集Broadcast到每個節(jié)點(diǎn),讓每個節(jié)點(diǎn)在本地都保存一份例书。
? ? ? ? 2锣尉、大表和小表做join操作時可以把小表Broadcast到各個節(jié)點(diǎn),從而就可以把join操作轉(zhuǎn)變成普通的操作决采,減少了shuffle操作自沧。
操作步驟
在開發(fā)應(yīng)用程序時,添加如下代碼树瞭,將“testArr”數(shù)據(jù)廣播到各個節(jié)點(diǎn)拇厢。
def main(args: Array[String]) {
? ? ...
? ? val testArr: Array[Long] = new Array[Long](200)
? ? val testBroadcast: Broadcast[Array[Long]] = sc.broadcast(testArr)
? ? val resultRdd: RDD[Long] = inpputRdd.map(input => handleData(testBroadcast, input))
? ? ...
}
def handleData(broadcast: Broadcast[Array[Long]], input: String) {
? ? val value = broadcast.value
? ? ...
}