1. 程式人生 > >Spark Streaming高吞吐、高可靠的一些優化

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

> 分享一些Spark Streaming在使用中關於高吞吐和高可靠的優化。 [toc] 作為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實時流式大資料處理