spark发行版笔记9
感謝DT大數(shù)據(jù)夢工廠支持提供技術(shù)支持,DT大數(shù)據(jù)夢工廠專注于Spark發(fā)行版定制。
本期概覽:
1 Receiver生命全周期
首先,我們找到數(shù)據(jù)來源的入口,入口如下
Receiver的設(shè)計(jì)是極其巧妙的。它的設(shè)計(jì)非常的出色,很多的地方都值得我們認(rèn)真的學(xué)習(xí)。
在深入認(rèn)識Receiver之前,我們有必要思考一下,假如沒有spark,我們可以嘗試思考一下,Receiver不斷的接受輸入進(jìn)來的數(shù)據(jù),如果是我們來做,我們該怎么做?該怎么啟動(dòng)Receiver呢?
我們嘗試從以下幾個(gè)方向來假設(shè)思考。
方式如下所示
Receiver是應(yīng)用程序啟動(dòng)的一部分,我們啟動(dòng)Receiver的時(shí)候,Receiver與InputStream是一一對應(yīng)的。假如我們啟動(dòng)多個(gè)Receiver,一個(gè)partition有多條一條數(shù)據(jù)是沒有關(guān)系的。但是這里有一個(gè)問題,從資源調(diào)度的角度看,有可能從一臺機(jī)器上啟動(dòng)多個(gè)Receiver,從而導(dǎo)致負(fù)載不均衡,同時(shí)也有可能導(dǎo)致Receiver啟動(dòng)失敗。因?yàn)镽DD不同的分片對應(yīng)不同的分片。在不同的機(jī)器上有可能Executor失敗,導(dǎo)致任務(wù)失敗。
我們要要求,只要我們的集群在運(yùn)行,我們的Receiver就要正常運(yùn)行。如果Receiver不正常運(yùn)行,就導(dǎo)致整個(gè)集群任務(wù)不能執(zhí)行,這是不可以接受的。
因此,我們的這倆個(gè)假設(shè)都不可行,可行的辦法是,Receiver可以失敗,但是不能影響Job的正常運(yùn)行。Receiver失敗后一定會容錯(cuò),最終一定會成功運(yùn)行,那么我們來看spark官方是怎么做這么一個(gè)巧妙的Receiver的容錯(cuò)性能的。
其實(shí)我們可以認(rèn)為InputStreams與Receivers是一一對應(yīng)的。
?
不過,這樣可能導(dǎo)致負(fù)載不均衡,因?yàn)镽eceiver在不同的機(jī)器上。另外Receiver啟動(dòng)可能失敗。
至今,我們?nèi)匀粵]有看到啟動(dòng)Receiver的代碼,那么啟動(dòng)它的代碼在哪呢?
然后接下來就是啟動(dòng)Receiver的方法了
這個(gè)代碼進(jìn)一步證明了一個(gè)Receiver只有一個(gè)InputStream與之對應(yīng)。
Driver層面決定在哪個(gè)Executor上執(zhí)行Receiver
終止一個(gè)Receiver,意味著不用重新啟動(dòng)一個(gè)JOB
Receiver start不會重試
為了啟動(dòng)Receiver,啟動(dòng)了一個(gè)spark作業(yè)
下面一個(gè)問題很重要:
這里要啟動(dòng)一個(gè)作業(yè),這個(gè)作業(yè)是每個(gè)Receiver都啟動(dòng)一個(gè)Job,還是多個(gè)Receiver啟動(dòng)一個(gè)Job.循環(huán)啟動(dòng)每個(gè)Receiver,每個(gè)Receiver啟動(dòng)一個(gè)Job
?
這樣,我們就解決了啟動(dòng)一個(gè)Task來啟動(dòng)Receiver的缺點(diǎn),每個(gè)Receiver對應(yīng)一個(gè)Job,對應(yīng)一個(gè)任務(wù)。最大程度的避免負(fù)載不均衡,不會使得Receiver失敗使得整個(gè)Job不能運(yùn)行。另外對解決任務(wù)傾斜也有一定好處。
重新啟動(dòng)Receiver的時(shí)候會將不可用的Executor剪掉
這里設(shè)計(jì)得非常的美妙,能保證Receiver無論如何都能成功的啟動(dòng)
任務(wù)一旦失敗,框架會裝作若無其事的ReStartReceiver,可以說設(shè)計(jì)得天衣無縫。
線程池的方式并發(fā)啟動(dòng)Receiver,因?yàn)榭赡懿煌腞eceiver接收來的數(shù)據(jù)是沒有耦合的
到現(xiàn)在,我們視乎還有一團(tuán)烏云沒有解開,那就是決定Receiver具體在哪些機(jī)器上,代碼如下
最后研究的一行代碼:保證Executor活著(默認(rèn)50個(gè)線程,20個(gè)并發(fā)度),作為一個(gè)SparkStreaming應(yīng)用程序,超過50個(gè)數(shù)據(jù)來源的可能性不大。
轉(zhuǎn)載于:https://www.cnblogs.com/lilingi/p/5515387.html
總結(jié)
以上是生活随笔為你收集整理的spark发行版笔记9的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共通脚本utils
- 下一篇: 07年的奔驰维亚诺仪表盘中间显示屏不出字