背景:web
爲何從SparkStreaming入手?瀏覽器
由於SparkStreaming 是Spark Core上的一個子框架,若是咱們可以徹底精通了一個子框架,咱們就可以更好的駕馭Spark。SparkStreaming和Spark SQL是目前最流行的框架,從研究角度而言,Spark SQL有太多涉及到SQL優化的問題,不太適應用來深刻研究。而SparkStreaming和其餘的框架不一樣,它更像是SparkCore的一個應用程序。若是咱們能深刻的瞭解SparkStreaming,那咱們就能夠寫出很是複雜的應用程序。負載均衡
SparkStreaming的優點是能夠結合SparkSQL、圖計算、機器學習,功能更增強大。這個時代,單純的流計算已經沒法知足客戶的需求啦。在Spark中SparkStreaming也是最容易出現問題的,由於它是不斷的運行,內部比較複雜。框架
本課內容:機器學習
1,SparkStreaming另類在線實驗oop
這個另類在線實驗體如今batchInterval設置的很大,5分鐘甚至更大,爲了更清晰的看清楚Streaming運行的各個環境。學習
實驗內容是使用SparkStreaming在線統計單詞個數,SparkStreaming鏈接一個端口中接收發送過來的單詞數據,將統計信息輸出到控制檯中,其中使用netcat建立一個簡單的server,來開啓並監聽一個端口,接收用戶鍵盤輸入的單詞數據。優化
2,瞬間理解SparkStreaming的本質spa
結合這個實驗並經過觀察Web UI上的Job,Stage,Task等信息,再結合SparkStreaming的源碼,對SparkStreaming進行分析。server
實驗環境說明:
實驗由3臺Ubuntu14.04虛擬機上運行,其中一臺做爲Spark的Master,另外兩臺做爲Spark的Worker。使用的Spark版本爲目前最早版1.6.1,Spark checkpoint的存儲在HDFS上(hadoop的版本爲2.6.0)。爲了記錄SparkStreaming運行的過程信息,須要啓動Spark的HistoryServer,如下是啓廳Spark,HDFS,HistoryServer服務的腳本。
經過使用JPS觀察各節點的進行信息,或經過瀏覽器訪問各個服務WEB頁面來確認服務是否正確運行。
實驗代碼以下
提交到Spark集羣的腳本以下
首先在Master節點使用nc -lk 9999,建立一個簡單的Server,而後在運行腳本提交Spark Application。
從網上找來一篇英文文章,以下
單詞統計結果以下
在Spark UI上觀察發現有4個Job
首先查看Job 0發現SparkStreaming在剛啓動時會提交一個Job
StreamingContext的start方法中調用了JobScheduler的start方法
繼續看JobScheduler類的start方法
從註釋中說明該方法是爲了確保每一個Slave都註冊上,避免全部的Receiver在同一個節點,爲了後面計算負載均衡。
Job1一直在運行是由於它不斷接收數據流中的數據,運行在Worker1上而且運行1個Task來接收數據,數據本地性爲PROCESS_LOCAL,receiver接收到數據會保存到內存中。
Job2的信息以下
其中Stage3信息以下
其中Stage4信息以下
Job3的信息以下,Job3的DAG圖和Job2的DAG圖是同樣的,可是Stage5跳過了。
後面的Job都是在對單詞切分統計。
回顧這4個Job,其中2個Job是框架運行的,Job0確保全部slave都註冊上,避免全部的Receiver在同一個節點,爲了後面計算負載均衡。Job1爲啓動一個數據接收器,運行在一個Executor上的一個Task上,不斷接收數據量數據,而後保存到內存中。Job2和Job3在運行單詞切分統計。