前言
當(dāng)一個函數(shù)傳遞給spark集群去運行的時候(map践险,reduce)桥氏。該函數(shù)的所有變量都會在各個節(jié)點的任務(wù)中創(chuàng)建一個副本间狂,當(dāng)該變量數(shù)據(jù)計較大的手俊戳,會極大的占用計算機寶貴的內(nèi)存資源惨奕。并且各個節(jié)點的變量是相互隔離的雪位,變量的更新也不會傳入到driver中。針對于此梨撞,spark提供了兩種類型的共享變量雹洗,廣播變量和累加器香罐。
閉包
跨作用域訪問函數(shù)量變。深度解釋时肿,在spark集群中庇茫,如果在main函數(shù)也就是driver中定義了變量,使用foreach或者map等函數(shù)使用該變量的時候螃成,會在每個節(jié)點任務(wù)中創(chuàng)建該變量的副本旦签,并且對于副本的操作更新相互隔離的,也就是說每個節(jié)點對于變量的更新操作都不會影響driver中的變量值锈颗,這樣就是閉包顷霹,閉包會導(dǎo)致數(shù)據(jù)操作異常。
廣播變量
使用廣播變量可以是變量在每個節(jié)點上緩存一個副本而不是各個任務(wù)中
sparkcontext.broadcast(Array(1,2,3))
累加器
使用累加器可以方便的在集群中統(tǒng)計數(shù)量击吱,一般使用+=進行自增淋淀,我們也可以使用自定義的累計器,繼承AccumulatorParam
val c = sparkcontext.accumulator(0,"a")
c+=1