#轉(zhuǎn)#Spark核心編程進(jìn)階-spark算子的閉包原理詳解

Spark中一個(gè)非常難以理解的概念皱蹦,就是在集群中分布式并行運(yùn)行時(shí)操作的算子外部的變量的生命周期

通常來說宙枷,這個(gè)問題跟在RDD的算子中操作作用域外部的變量有關(guān)
所謂RDD算子中斥季,操作作用域外部的變量搞动,指的是,類似下面的語句: val a = 0; rdd.foreach(i -> a += i)
此時(shí)李丰,對rdd執(zhí)行的foreach算子的作用域,其實(shí)僅僅是它的內(nèi)部代碼逼泣,但是這里卻操作了作用域外部的a變量
根據(jù)不同的編程語言的語法趴泌,這種功能是可以做到的,而這種現(xiàn)象就叫做閉包

閉包簡單來說拉庶,就是操作的不屬于一個(gè)作用域范圍的變量

如果使用local模式運(yùn)行spark作業(yè)嗜憔,那么實(shí)際只有一個(gè)jvm進(jìn)程在執(zhí)行這個(gè)作業(yè)
此時(shí),你所有的RDD算子的代碼執(zhí)行以及它們操作的外部變量氏仗,都是在一個(gè)進(jìn)程的內(nèi)存中吉捶,這個(gè)進(jìn)程就是driver進(jìn)程
此時(shí)是沒有任何問題的

但是在作業(yè)提交到集群執(zhí)行的模式下(無論是client或cluster模式,作業(yè)都是在集群中運(yùn)行的)
為了分布式并行執(zhí)行你的作業(yè)皆尔,spark會將你的RDD算子操作呐舔,分散成多個(gè)task,放到集群中的多個(gè)節(jié)點(diǎn)上的executor進(jìn)程中去執(zhí)行
每個(gè)task執(zhí)行的是相同的代碼慷蠕,但是卻是處理不同的數(shù)據(jù)

在提交作業(yè)的task到集群去執(zhí)行之前珊拼,spark會先在driver端處理閉包
spark中的閉包,特指那些砌们,不在算子的作用域內(nèi)部杆麸,但是在作用域外部卻被算子處理和操作了的變量
而算子代碼的執(zhí)行也需要這些變量才能順利執(zhí)行
此時(shí),這些閉包變量會被序列化成多個(gè)副本浪感,然后每個(gè)副本都發(fā)送到各個(gè)executor進(jìn)程中昔头,供那個(gè)executor進(jìn)程運(yùn)行的task執(zhí)行代碼時(shí)使用

對于上面說的閉包變量處理機(jī)制
對于local模式,沒有任何特別的影響影兽,畢竟都在一個(gè)jvm進(jìn)程中揭斧,變量發(fā)送到executor,也不過就是進(jìn)程中的一個(gè)線程而已
但是對于集群運(yùn)行模式來說峻堰,每個(gè)executor進(jìn)程讹开,都會得到一個(gè)閉包變量的副本,這個(gè)時(shí)候捐名,就會出問題

因此閉包變量發(fā)送到executor進(jìn)程中之后旦万,就變成了一個(gè)一個(gè)獨(dú)立的變量副本了,這就是最關(guān)鍵的一點(diǎn)
此時(shí)在executor進(jìn)程中镶蹋,執(zhí)行task和算子代碼時(shí)成艘,訪問的閉包變量赏半,也僅僅只是當(dāng)前executor進(jìn)程中的一個(gè)變量副本而已了
此時(shí)雖然在driver進(jìn)程中,也有一個(gè)變量副本淆两,但是卻完全跟各個(gè)executor進(jìn)程中的變量副本不是一個(gè)東西
此時(shí)断箫,各個(gè)executor進(jìn)程對于自己內(nèi)存中的變量副本進(jìn)行操作,即使改變了變量副本的值秋冰,但是對于driver端的程序仲义,是完全感知不到的
driver端的變量沒有被進(jìn)行任何操作

因此綜上所述,在你使用集群模式運(yùn)行作業(yè)的時(shí)候剑勾,切忌不要在算子內(nèi)部埃撵,對作用域外面的閉包變量進(jìn)行改變其值的操作
因?yàn)槟菦]有任何意義,算子僅僅會在executor進(jìn)程中甥材,改變變量副本的值
對于driver端的變量沒有任何影響盯另,我們也獲取不到executor端的變量副本的值


image.png

如果希望在集群模式下,對某個(gè)driver端的變量洲赵,進(jìn)行分布式并行地全局性的修改
可以使用Spark提供的Accumulator鸳惯,全局累加器
后面我們會講解一個(gè)Accumulator的高級用法,自定義Accumulator叠萍,實(shí)現(xiàn)任意機(jī)制和算法的全局計(jì)算器

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芝发,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苛谷,更是在濱河造成了極大的恐慌辅鲸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腹殿,死亡現(xiàn)場離奇詭異独悴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锣尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門刻炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人自沧,你說我怎么就攤上這事坟奥。” “怎么了拇厢?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵爱谁,是天一觀的道長。 經(jīng)常有香客問我孝偎,道長访敌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任衣盾,我火速辦了婚禮捐顷,結(jié)果婚禮上荡陷,老公的妹妹穿的比我還像新娘雨效。我一直安慰自己迅涮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布徽龟。 她就那樣靜靜地躺著叮姑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪据悔。 梳的紋絲不亂的頭發(fā)上传透,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音极颓,去河邊找鬼朱盐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菠隆,可吹牛的內(nèi)容都是我干的兵琳。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼骇径,長吁一口氣:“原來是場噩夢啊……” “哼躯肌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起破衔,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤清女,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晰筛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫡丙,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年读第,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曙博。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卦方,死狀恐怖羊瘩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盼砍,我是刑警寧澤尘吗,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站浇坐,受9級特大地震影響睬捶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜近刘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一擒贸、第九天 我趴在偏房一處隱蔽的房頂上張望臀晃。 院中可真熱鬧,春花似錦介劫、人聲如沸徽惋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽险绘。三九已至,卻和暖如春誉碴,著一層夾襖步出監(jiān)牢的瞬間宦棺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工黔帕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留代咸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓成黄,卻偏偏與公主長得像呐芥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子慨默,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容