多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > Spark 定制版:010~Spark Streaming源碼解讀之流數據不斷接收全生命周期徹底研究和思考

Spark 定制版:010~Spark Streaming源碼解讀之流數據不斷接收全生命周期徹底研究和思考

來源:程序員人生   發布時間:2016-06-06 08:06:31 閱讀次數:2612次

本講內容:

a. 數據接收架構設計模式
b. 數據接收源碼完全研究

注:本講內容基于Spark 1.6.1版本(在2016年5月來講是Spark最新版本)講授。

上節回顧

上1講中,我們給大家具體分析了Receiver啟動的方式及其啟動設計帶來的多個問題:

a. 如果有多個InputDStream,那就要啟動多個Receiver,每一個Receiver也就相當于分片partition,那我啟動Receiver的時候理想的情況下是在不同的機器上啟動Receiver,但是Spark Core的角度來看就是利用程序,感覺不到Receiver的特殊性,所以就會依照正常的Job啟動的方式來處理,極有可能在1個Executor上啟動多個Receiver;這樣的話便可能致使負載不均衡

b. 有可能啟動Receiver失敗,只要集群存在,Receiver就不應當啟動失敗

c. 從運行進程中看,1個Reveiver就是1個partition的話,Reveiver的啟動伴隨1個Task啟動,如果Task啟動失敗,以Task啟動的Receiver也會失敗

由此,我們通過源碼分析,完全解析了Spark Streaming是如何解決這些問題的:

a. Spark使用1個Job啟動1個Receiver.最大程度的保證了負載均衡

b. Spark Streaming已指定每一個Receiver運行在那些Executor上,在Receiver運行之前就指定了運行的地方

c. 如果Receiver啟動失敗,此時其實不是Job失敗,在內部會重新啟動Receiver

開講

本講我們主要給大家介紹Spark Streaming在接收數據的全生命周期貫通;

a. 當有Spark Streaming有利用程序的時候Spark Streaming會延續不斷的接收數據

b. 1般Receiver和Driver不在1個進程中的,所以接收到數據以后要不斷的匯報給Driver

c. Spark Streaming要接收數據肯定要使用消息循環器,循環器不斷的接收到數據以后,然后將數據存儲起來,再將存儲完的數據匯報給Driver

d. Sparkstreaming接收數據的全部流程類似于MVC模式,M就是Receiver,V就是Driver,C就是ReceiverSupervisor

e. ReceiverSupervisor是控制器,Receiver的啟動是靠ReceiverTracker啟動的,Receiver接收到數據以后是靠ReceiverSupervisor存儲數據的。然后Driver就取得元數據也就是界面,通過界面來操作底層的數據,這個元數據就相當于指針

Spark Streaming接收數據流程以下:

這里寫圖片描述

接收數據的時候肯定有1個循環器不斷的接收數據,接收到數據肯定也有存儲器,存儲過以后向Driver匯報。接收數據和存儲數據固然要分為兩個不同的模塊。

這里寫圖片描述

ReceiverSupervisorImpl是receiver的監控器,同時負責receiver的寫操作 這個方法需要傳入1個Iterator,實時上里邊就只有1個Receiver

取得receiver,這個receiver是根據數據輸入來源InputDstream取得的receiver。以SocketInputDstream為例,它的receiver就是SocketReceiver.這里的receiver只是1個援用,并沒有被實例化。作為1個參數傳入ReceiverSupervisorImpl

這里寫圖片描述

為了啟動Receiver啟動了1個spark作業,每個Receiver的啟動都會有1個作業來負責,Receiver是1個1個的啟動的如果是將所有的Receiver作為1個作業的不同task來啟動會有很多弱點

a. Reciver啟動可能失敗進而致使利用程序失敗
b. 運行的進程中會有任務傾斜的問題,將所有的Receiver作為1個作業的不同task來運行是采取的spark core的調度方式,在很不幸的情況下會出現所有Receiver運行在1個節點上,Receiver要不斷的接收數據,需要消耗很多資源,就會致使這個節點負載特別大。

將每一個Receiver都作為1個job來運行就會最大可能的負載均衡,不過這樣也有可能失敗,失敗以后不會重試job,而是重新schedule提交1個新的job來運行

Receiver,并且不會在之前運行的executor上啟動,只要sparkstreaming程序不停止,假設Receiver出故障就會不停止的進行重新echedule并啟動,確保Receiver1定會啟動還有很重要的1點是,當重新啟動1個Receiver時,是用1個線程池在新的線程中啟動的

這里寫圖片描述

ReceiverSupervisorImpl負責處理Receiver接收到的數據,處理以后匯報給ReceiverTracker,所以ReceiverSupervisorImpl內部有和ReceiverTracker進行通訊的endpoint。這個負責向ReceiverTracker發送消息。

private val trackerEndpoint = RpcUtils.makeDriverRef(“ReceiverTracker”, env.conf,env.rpcEnv)

這個負責接收ReceiverTracker發送的消息,CleanupOldBlocks是用來清除運行完的每一個batch的Blocks,UpdateRateLimit是用來隨時調劑限流(限流實際上是限的數據存儲的速度)

這里寫圖片描述

ReceiverSupervisor的start方法

這里寫圖片描述

在onStart中啟動的是BlockGenerator,BlockGenerator是把接收到的1條1條的數據生成block存儲起來,1個BlockGenerator只服務于1個Receiver。所以BlockGenerator要在Receiver啟動之前啟動

這里寫圖片描述

BlockGenerator種有1個定時器。這個定時器每隔1定(默許是200ms,和設定的batchduration無關)的時間就履行以下方法。這個方法就是把接收到的數據1條1條的放入到這個buffer緩存中,再把這個buffer依照1定的時間或尺寸合并成block。除定時器之外還有1條線程不停的把生成的block交給blockmanager存儲起來。

這里寫圖片描述

下面來看startReceiver方法

這里寫圖片描述

在啟動Receiver之前還要向ReceiverTracker要求是不是可以啟動Receiver。當返回是true才會啟動。ReceiverTracker接收到匯報的信息就把注冊Receiver的信息。

這里寫圖片描述

Receiver的啟動只是調用receiver.onStart(),Receiver就在work節點上運行了

以SocketReceiver為例我看看它的onStart方法

這里寫圖片描述

備注:
1、DT大數據夢工廠微信公眾號DT_Spark
2、Spark大神級專家:王家林
3、新浪微博: http://www.weibo.com/ilovepains

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费观看欧美成人1314色 | a级毛毛片看久久 | 可以看毛片的网址 | 国产69精品久久久久99 | 成人午夜在线 | 亚洲欧美日韩小说 | 视频一区视频二区在线观看 | 手机在线日韩高清理论片 | 亚洲精品色综合久久久 | 欧美一级毛片高清免费观看 | 亚洲aⅴ天堂 | 欧美同性video| 黑人xxxx性hd极品 | 日本一区二区高清免费不卡 | 日韩国产欧美视频 | 午夜美女写真福利写视频 | 在线啪| 色综合久久综合欧美综合图片 | 欧美 日本 亚洲 | 中文字幕在线视频在线看 | 国产精品久久久久久久久久久久久久 | 国产日韩精品一区二区在线观看播放 | 亚洲视频在线网 | 永久精品 | 久久成人永久免费播放 | 在线日本中文字幕 | 亚洲午夜国产精品无卡 | 欧美一区二区三区视频在线观看 | 国语精品视频在线观看不卡 | 亚洲精品日韩中文字幕久久久 | 亚洲性色视频 | 欧美日韩国产高清一区二区三区 | 综合免费视频 | 国产一区二区视频在线 | 噜噜啪啪| a毛片全部播放免费视频完整18 | 国产高清自拍 | 国产jizz中国jizz免费看 | 精品国产一区二区三区四 | 91日韩在线| 亚洲国产精品看片在线观看 |