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