一、Broadcast徹底解密
多端合一響應(yīng)式網(wǎng)站:PC+平板+手機(jī),同一后臺(tái)修改數(shù)據(jù)多端同步更新提交您的需求,獲取網(wǎng)站建設(shè)與營(yíng)銷策劃方案報(bào)價(jià),我們會(huì)在1小時(shí)內(nèi)與您聯(lián)系!
1、Broadcast就是將數(shù)據(jù)從一個(gè)節(jié)點(diǎn)發(fā)送到其他節(jié)點(diǎn)。
2、Broadcast是分布式的共享數(shù)據(jù),默認(rèn)情況下只要程序運(yùn)行Broadcast變量就會(huì)存在,因?yàn)锽roadcast底層是由BlockManager管理的,但是也可以手動(dòng)銷毀Broadcast變量。
3、Broadcast一般用于處理共享的配置文件,通用的Dataset、常用的數(shù)據(jù)結(jié)構(gòu)等等,但是不適合存放太大的數(shù)據(jù)在Broadcast,Broadcast不會(huì)內(nèi)存溢出,因?yàn)槠鋽?shù)據(jù)的保存的StorageLevel是MEMORY_AND_DISK,雖然如此,也不可以放太大的數(shù)據(jù),因?yàn)榫W(wǎng)絡(luò)IO和可能的單點(diǎn)壓力會(huì)非常大。
4、廣播的Broadcast變量是只讀變量,保持了數(shù)據(jù)的一致性。
5、Broadcast的使用:
* {{{
* scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
* broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
*
* scala> broadcastVar.value
* res0: Array[Int] = Array(1, 2, 3)
* }}}
6、HttpBroadcast方式的Broadcast:最開始的時(shí)候數(shù)據(jù)存在Driver的文件系統(tǒng)中,Driver會(huì)在本地創(chuàng)建一個(gè)文件夾存放Broadcast中的data,然后啟動(dòng)HttpServer來(lái)訪問(wèn)文件夾中的數(shù)據(jù),同時(shí)寫入到BlockManager中,獲得BlockId(BroacastBlockId)。當(dāng)?shù)谝淮蜤xecutor中Task要訪問(wèn)Broadcast變量的時(shí)候,會(huì)向Driver通過(guò)HttpServer來(lái)訪問(wèn)數(shù)據(jù),然后會(huì)在Executor中的BlockManager中注冊(cè),這樣后續(xù)的Task需要訪問(wèn)Broadcast變量的時(shí)候會(huì)首先查詢當(dāng)前Executor的BlockManager中是否存在,如果存在就就直接獲取數(shù)據(jù)。
7、BroadcastManager是用來(lái)管理Broadcast的,該對(duì)象是在SparkContext創(chuàng)建SparkEnv的時(shí)候創(chuàng)建的。在實(shí)例化BroadcastManager的時(shí)候會(huì)創(chuàng)建BroadcastFactory工廠來(lái)構(gòu)建具體的Broadcst類型,默認(rèn)是TorrentBroadcastFactory。
8、HttpBroadcast存在單點(diǎn)故障和網(wǎng)絡(luò)IO性能問(wèn)題,所以默認(rèn)使用TorrentBroadcast的方式,開始數(shù)據(jù)存放在Driver端,假設(shè)A點(diǎn)需要訪問(wèn)數(shù)據(jù),就會(huì)去Driver端拿數(shù)據(jù),然后在本地存儲(chǔ)一份,A節(jié)點(diǎn)也就擁有了一個(gè)副本,A節(jié)點(diǎn)也就成了數(shù)據(jù)源,降低了節(jié)點(diǎn)壓力。
9、TorrentBroadcast按照BLOCK_SIZE(默認(rèn)4m)將Broadcast中的數(shù)據(jù)劃分成不同的block,然后講分塊信息也就是meta信息存放到Driver端的BlockManager中,同時(shí)會(huì)通知BlockManagerMaster說(shuō)明meta信息存放完畢。
二、Broadcast源碼解密
當(dāng)廣播數(shù)據(jù)的時(shí)候,會(huì)調(diào)用SparkContext的broadcast方法,在方法內(nèi)部,Broadcast是由BroadcastManager管理創(chuàng)建的,而BroadcastManager又是有SparkEnv管理的,
SparkEnv是由SparkContext中的createSparkEnv創(chuàng)建的,進(jìn)而調(diào)用SparkEnv的createDriverEnv方法,最終會(huì)調(diào)用create自身的方法,構(gòu)建一些所需的組建。管理Broadcast的BoradcastManager就在此方法中創(chuàng)建。
在創(chuàng)建BroadcastManager實(shí)例的時(shí)候,回調(diào)用initialize初始化方法,創(chuàng)建BoradcastFactory,默認(rèn)是TorrentBroadcastFactory:咋
BroadcastManager初始化之后,就可以調(diào)用newBroadcast方法,根據(jù)BroadcastFactory創(chuàng)建相應(yīng)的Broadcast(TorrentBroadcast)進(jìn)行數(shù)據(jù)的廣播:
TorrentBroadcastFactory的newBroadcast方法創(chuàng)建一個(gè)TorrentBroadcast實(shí)例。當(dāng)我們進(jìn)行數(shù)據(jù)的廣播的時(shí)候,會(huì)調(diào)用writeBlocks方法,將廣播的數(shù)據(jù)劃分成多個(gè)block塊(默認(rèn)是4m),把這些block塊存放在Driver端:
當(dāng)獲取廣播變量的值時(shí),會(huì)調(diào)用相應(yīng)Broadcast的getValue方法,在TorrentBroadcast中readBroadcastBlock方法,首先會(huì)在本地的BlockManager根據(jù)BroadcastBlockId獲取數(shù)據(jù),如果獲取不到進(jìn)而調(diào)用readBlocks方法
TorrentBroadcast中的readBlocks方法會(huì)從Driver端或者其他的Executor獲取相應(yīng)的block快數(shù)據(jù),然后把獲取的block數(shù)據(jù)保存到Executor的BlockManager中:
當(dāng)前題目:SparkBroadcast運(yùn)行機(jī)制解密(42)
本文地址:http://www.chinadenli.net/article26/jcogcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站策劃、小程序開發(fā)、外貿(mào)建站、自適應(yīng)網(wǎng)站、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)