一、前述
SparkStreamin是流式問題的解決的代表,一般結合kafka使用,所以本文著重講解sparkStreaming+kafka兩種模式。
二、具體
1、Receiver模式
原理圖:
receiver模式理解:
在SparkStreaming程式執行起來後,Executor中會有receiver tasks接收kafka推送過來的資料。資料會被持久化,預設級別為MEMORY_AND_DISK_SER_2,這個級別也可以修改。receiver task對接收過來的資料進行儲存和備份,這個過程會有節點之間的資料傳輸。備份完成後去zookeeper中更新消費偏移量,然後向Driver中的receiver tracker彙報資料的位置。最後Driver根據資料本地化將task分發到不同節點上執行。
receiver模式中存在的問題:
當Driver程式掛掉後,Driver下的Executor都會被殺掉,當更新完zookeeper消費偏移量的時候,Driver如果掛掉了,就會存在找不到資料的問題,相當於丟失資料。
如何解決這個問題?
開啟WAL(write ahead log)預寫日誌機制,在接受過來資料備份到其他節點的時候,同時備份到HDFS上一份(我們需要將接收來的資料的持久化級別降級到MEMORY_AND_DISK),這樣就能保證資料的安全性。不過,因為寫HDFS比較消耗效能,要在備份完資料之後才能進行更新zookeeper以及彙報位置等,這樣會增加job的執行時間,這樣對於任務的執行提高了延遲度。
注意:1)開啟WAL之後,接受資料級別要降級,有效率問題。2)開啟WAL要checkpoint 3)開啟WAL(write ahead log),往HDFS中備份一份資料
receiver的並行度設定
receiver的並行度是由spark.streaming.blockInterval來決定的,預設為200ms,假設batchInterval為5s,那麼每隔blockInterval就會產生一個block,這裡就對應每批次產生RDD的partition,這樣5秒產生的這個Dstream中的這個RDD的partition為25個,並行度就是25。如果想提高並行度可以減少blockInterval的數值,但是最好不要低於50ms。