Spark Streaming源碼解讀之Receiver生成全生命周期徹底研究和思考

Spark Streaming源碼解讀之Receiver生成全生命周期徹底研究和思考 - 簡書
http://www.itdecent.cn/p/dff0dbf0ced0

一:Receiver啟動的方式設(shè)想

1.Spark Streaming通過Receiver持續(xù)不斷的從外部數(shù)據(jù)源接收數(shù)據(jù),并把數(shù)據(jù)匯報給Driver端,由此每個Batch Durations就可以根據(jù)匯報的數(shù)據(jù)生成不同的Job,在不同的機器之上啟動,每個reveiver 相當(dāng)于一個分片,由于Sapark core 感覺不到它的特殊性,按普通的調(diào)度,即有可能在同一個Executor之中啟動多個Receiver,這種情況之下導(dǎo)致負載不均勻或者由于Executor運行本身的故障,task 有可能啟動失敗,整個job啟動就失敗,即receiver啟動失敗。

啟動Receiver

  1. 從Spark Core的角度來看,Receiver的啟動Spark Core并不知道, Receiver是通過Job的方式啟動的,運行在Executor之上的,由task運行。

  2. 一般情況下,只有一個Receiver,但是可以創(chuàng)建不同的數(shù)據(jù)來源的InputDStream.

3.啟動Receiver的時候,實其上一個receiver就是一個partition分片,由一個Job啟動,這個Job里面有RDD的transformations操作和action的操作,隨著定時器觸發(fā),不斷的產(chǎn)生有數(shù)據(jù)接收,每個時間段中產(chǎn)生的接收數(shù)據(jù)實其上就是一個partition分片,

  1. 以上設(shè)計思想產(chǎn)生的如下問題:

(1)如果有多個InputDStream,那就要啟動多個Receiver,每個Receiver也就相當(dāng)于分片partition,那我啟動Receiver的時候理想的情況下是在不同的機器上啟動Receiver,但是SparkCore的角度來看就是應(yīng)用程序,感覺不到Receiver的特殊性,所以就會按照正常的Job啟動的方式來處理,極有可能在一個Executor上啟動多個Receiver.這樣的話就可能導(dǎo)致負載不均衡。(2)有可能啟動Receiver失敗,只要集群存在,Receiver就不應(yīng)該啟動失敗。

(3)從運行過程中看,一個Reveiver就是一個partition的話,啟動的由一個Task,如果Task啟動失敗,相應(yīng)的Receiver也會失敗。由此,可以得出,對于Receiver失敗的話,后果是非常嚴(yán)重的,那么在SparkStreaming如何防止這些事的呢?Spark Streaming源碼分析,在Spark Streaming之中就指定如下信息:

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

二是Spark Streaming已經(jīng)指定每個Receiver運行在那些Executor上,在Receiver運行之前就指定了運行的地方!

三是 如果Receiver啟動失敗,此時并不是Job失敗,在內(nèi)部會重新啟動Receiver.

在StreamingContext的start方法被調(diào)用的時候,JobScheduler的start

文/陽光男孩spark(簡書作者)
原文鏈接:http://www.itdecent.cn/p/dff0dbf0ced0
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容