Spark Streaming高吞吐、高可靠的一些優化

upupfeng發表於2020-07-31

分享一些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實時流式大資料處理實踐》

相關文章