Spark Broadcast

Broadcast Variables(廣播變量)

Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it with tasks. They can be used, for example, to give every node a copy of a large input dataset in an efficient manner. Spark also attempts to distribute broadcast variables using efficient broadcast algorithms to reduce communication cost.

(廣播變量容許程序在每臺機器上保存一份只讀變量緩存碾盐,而不是為每一個任務(wù)發(fā)送一個副本。他們可以被使用,例如以一種高效的方式給每一個節(jié)點拷貝一份大的數(shù)據(jù)集。spark 試圖通過分布式廣播變量來有效低減少通信開銷。)

以上直意,意思是這樣。就是spark執(zhí)行任務(wù)的時候會用到共享變量彼城。一般方式是為每個task拷貝一份共享變量。那么問題來了退个,如果一個機器上有上百個task那么就要拷貝上百次募壕,延遲不說,對內(nèi)存溢出造成隱患帜乞。那么使用廣播變量后司抱,所有任務(wù)公用一個只讀變量。有點類似于readonly黎烈,那么只需要傳輸一次习柠,且內(nèi)存保留一個副本匀谣,大大提高效率。

那么廣播變量這么有用资溃,大家鐵定多用武翎,不知道有木有遇到空指正bug的。

spark Broadcast 空指正異常:(看下面代碼 查查他有沒有毛踩芏А)

package com.migu.dpi

import java.util

import org.apache.spark.{SparkConf, SparkContext}

import org.apache.spark.broadcast.Broadcast

object Test2 {

//代碼純屬為了引出問題 不要較真

? var data: Broadcast[java.util.ArrayList[String]] =null

? def formatFlag(sc: SparkContext, datas: util.ArrayList[String]):Unit = {

data = sc.broadcast(datas)

}

def main(args: Array[String]):Unit = {

var datas: util.ArrayList[String] =new util.ArrayList[String]()

datas.add("mmp")

var conf =new SparkConf().setAppName(Test2.getClass.getName).setMaster("local[2]")

var sc =new SparkContext(conf)

formatFlag(sc, datas)

//...... args(0) is a path

sc.textFile(args(0)).map(x => {

x +data.value.get(0)

}).foreach(println)

? }

}


如果沒有那么這樣呢宝恶,提交到集群呢?

package com.migu.dpi

import java.util

import org.apache.spark.{SparkConf, SparkContext}

import org.apache.spark.broadcast.Broadcast

object Test2 {

//代碼純屬為了引出問題 不要較真

? var data: Broadcast[java.util.ArrayList[String]] =null

? def formatFlag(sc: SparkContext, datas: util.ArrayList[String]):Unit = {

data = sc.broadcast(datas)

}

def main(args: Array[String]):Unit = {

var datas: util.ArrayList[String] =new util.ArrayList[String]()

datas.add("mmp")

var conf =new SparkConf().setAppName(Test2.getClass.getName)

var sc =new SparkContext(conf)

formatFlag(sc, datas)

//...... args(0) is a path

sc.textFile(args(0)).map(x => {

x +data.value.get(0)

}).foreach(println)

? }

}


這時候你會發(fā)現(xiàn)趴捅,第二種情況垫毙,報data廣播變量空指正異常。但是你會想拱绑,不是格式化過了嗎综芥?是的,我當(dāng)時也是這么想的猎拨。

但是 我們 來看看spark提交任務(wù)是怎么干的膀藐。

Spark actions are executed through a set of stages, separated by distributed “shuffle” operations. Spark automatically broadcasts the common data needed by tasks within each stage. The data broadcasted this way is cached in serialized form and deserialized before running each task. This means that explicitly creating broadcast variables is only useful when tasks across multiple stages need the same data or when caching the data in deserialized form is important.

(意譯:spark行為是通過一個stage集執(zhí)行來完成的。stage是被分布式shuffle動作分割的红省。spark自動將廣播變量廣播到每一個需要的節(jié)點上额各。廣播變量廣播是在每一個運行任務(wù)之前完成的。下面沒用不譯了

spark 對任務(wù)分發(fā)是通過 預(yù)讀碼 然后 根據(jù)編譯中代碼中行為動作和轉(zhuǎn)換動作來做shuffle切分的吧恃。切分好后把各個任務(wù)發(fā)送到各個節(jié)點虾啦,在任務(wù)執(zhí)行前,把廣播變量發(fā)過去蚜枢。具體誰前誰后缸逃,我猜是廣播變量在前针饥,因為task很多厂抽,有些廣播變量貫穿整個stage,所以我也就不讀源碼直接猜了丁眼。

那么問題來了筷凤,代碼沒運行你的廣播變量格式化個毛啊。所以除非本地運行苞七,否則其他機器全空指正異常藐守。

造成這個現(xiàn)象的根本原因是——全局變量的濫用。所以自我檢討一下蹂风,能用局部變量別用全局卢厂,除非局部變量造成內(nèi)存溢出,為了防止OOM惠啄。其他別為了省幾個變量的空間而使用全局變量慎恒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末任内,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子融柬,更是在濱河造成了極大的恐慌死嗦,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粒氧,死亡現(xiàn)場離奇詭異越除,居然都是意外死亡,警方通過查閱死者的電腦和手機外盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門摘盆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饱苟,你說我怎么就攤上這事骡澈。” “怎么了掷空?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵肋殴,是天一觀的道長。 經(jīng)常有香客問我坦弟,道長护锤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任酿傍,我火速辦了婚禮烙懦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赤炒。我一直安慰自己氯析,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布莺褒。 她就那樣靜靜地躺著掩缓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遵岩。 梳的紋絲不亂的頭發(fā)上你辣,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音尘执,去河邊找鬼舍哄。 笑死,一個胖子當(dāng)著我的面吹牛誊锭,可吹牛的內(nèi)容都是我干的表悬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丧靡,長吁一口氣:“原來是場噩夢啊……” “哼蟆沫!你這毒婦竟也來了叉讥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饥追,失蹤者是張志新(化名)和其女友劉穎图仓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體但绕,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡救崔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捏顺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片六孵。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幅骄,靈堂內(nèi)的尸體忽然破棺而出劫窒,到底是詐尸還是另有隱情,我是刑警寧澤拆座,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布主巍,位于F島的核電站,受9級特大地震影響挪凑,放射性物質(zhì)發(fā)生泄漏孕索。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一躏碳、第九天 我趴在偏房一處隱蔽的房頂上張望搞旭。 院中可真熱鬧,春花似錦菇绵、人聲如沸肄渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翎嫡。三九已至,卻和暖如春丹诀,著一層夾襖步出監(jiān)牢的瞬間钝的,已是汗流浹背翁垂。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工铆遭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沿猜。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓枚荣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啼肩。 傳聞我的和親對象是個殘疾皇子橄妆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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