分享一些Spark Streaming在使用中關於高吞吐和高可靠的優化。
作為Spark的流式處理框架,Spark Streaming基於微批RDDs實現,需要7*24小時執行。在實踐中,我們需要通過不斷的優化來保證它的高可靠,高吞吐。
本文從高吞吐和高可靠兩個角度來簡單介紹一下Spark Streaming中常用的一些優化方式。
1. 高吞吐的優化方式
1.1 更改序列化的方式
Spark在變數落盤或者序列化的時候會涉及到序列化。
Spark提供了Java自帶的序列化和Kryo序列化。Kyro序列化比Java序列化更快,推薦使用Kyro序列化。
在Spark2.0後將Kyro序列化作為簡單型別的預設序列化方式。對於我們自己的類,可以通過registerKyroClasses來註冊。
1.2 修改Receiver接受到的資料的儲存級別
Spark Streaming通過Receiver來接收資料,接收後會以StorageLevel.MEMORY_AND_DISK_SER_2
的儲存級別來儲存資料。
將接收到的資料儲存兩份是為了有更好的容錯性,如果你的Streaming程式做了其他的容錯,就可以修改為其他的儲存級別。
1.3 廣播配置變數
對於要在多個Executor中都會用到的變數,可以將變數廣播到每個節點上,減少資料傳輸的開銷。
1.4 調大接收器的個數
對資料有序性要求不是很高的場景下,可以多起幾個接收器來接收資料。
1.5 設定合理的批處理間隔
對於Streaming系統來說,只有系統的處理速度能趕上接受速度,整個系統才能穩定的執行,不然可能會出現OOM等問題。
批處理間隔的設定可以根據自己的資料量、處理速度、業務峰值等指標來合理估算一個適合自己的。
1.6 多給點資源
這是最基本的了,多分點CPU、記憶體,吞吐量蹭蹭的就上來了。
1.7 記憶體比例管理
記憶體主要用來儲存和計算,可以根據自己的場景調整記憶體的佔比。
1.8 垃圾回收機制
基於JVM執行的程式都能通過垃圾回收調優來獲得一定的優化。
根據自己的場景選擇使用CMS、G1....
1.9 使用合適的運算元
對於要讀寫資料庫的場景,肯定是在每個foreachPartition中維護一個連線,而不是每個foreach維護一個。
map和mapPartition同理了。
1.10 反壓機制
上游太快,壓力太大怎麼辦。
Spark Streaming中也提供了反壓機制,可以設定引數來開啟反壓機制。
2. 高可靠的保障
2.1 可重放的上游
有個可重放的上游,就不是很怕丟資料了,起碼可以保證至少一次。
2.2 checkpoint
通過開啟checkpoint將後設資料寫到檔案中,在程式失敗重啟後可以直接讀取checkpoint
2.3 wal
預寫日誌。
上面也提到了Recevier會將接收到的資料存兩份,但是那個可能會丟資料。
如果對可靠性要求較高,還是老老實實的開啟wal,缺點就是會損失吞吐量。
2.4 對執行狀況做監控
這個的話方法就多了:
- 記得Spark Streaming提供了一個介面,在每個批次處理前後可以做處理。感興趣的可以研究。
- 寫指令碼對streaming程式進行監控報警
- .....
3. 參考
- 《Spark Streaming實時流式大資料處理實踐》