最近公司部署了一個sparkstreaming程序,主要邏輯是處理flume採集到kafka的數據,集羣環境3個nodemanager,5核20G內存,剛開始測試階段並沒設置資源配置,直接丟在yarn上運行,每天的數據量大概2500萬records。測試幾天後發現數據處理時間延遲稍微長了一點,懷疑是程序處理數據的數據低於數據產生的數據,隨着時間和數據的增加,這個時間延遲越來越大,遂決定對程序進行相關的優化,整個過程主要從下面幾個方面進行了優化:
1、程序佔用資源
3個節點,每個節點配置5cores,20G內存。
spark submit提交的時候,executor-memory設置爲2G,每個節點啓2個executor,3臺節點一共啓了5個executor,還有一個供 ApplicationMaster使用。
spark-submit
--master yarn
--conf spark.streaming.concurrentJobs=4
--class com.jiadun.handler.CP_GetWA_Source_1001FromKafka
--executor-memory 2G
--executor-cores 2
--num-executors 5
/data/test/GetDataFromKafka-1.0-SNAPSHOT.jar >/dev/null 2>/data/test/log/wa.log
2、設置程序拉取數據的大小
我啓用的是spark的反應機制,動態的控制拉取數據的rate。
conf.set("spark.streaming.backpressure.enabled","true")
當然還可以從下面兩種方式中進行控制,如果三種都設置的話,程序會比較它們的大小取最小值
conf.set("spark.streaming.receiver.maxRate","")
conf.set("spark.streaming.kafka.maxRatePerPartition","")
3、配置JVM GC的頻率和時間
conf.set("spark.executor.extraJavaOptions","-XX:+UseConcMarkSweepGC")
4、batch interval
這個參數很重要,如果一個interval時間段內你拉取的batch沒有處理結束,那麼就會出現數據堆積,長此以往,數據會堆積的越來越多,這樣的處理邏輯肯定有問題,所以適當的調節interval大小對於程序能不能穩定運行有很大的影響。一般設置在1-10s內,視具體情況而定
5、spark.streaming.concurrentJobs
這是決定你程序同時啓動幾個active job的參數,如果你的資源足夠多,你可以在提交的任務的時候指定這個參數,此參數默認爲1,我暫時設置項目的這個參數爲4。
觀察程序的運行狀況 :
可以從sparkUI來觀察,
上圖中紅框內記錄了每個batch的執行耗時的折線圖和柱狀圖,其中有個虛線stable,這是你的batch interval時間,如果大量的batch都在這條線以下的話,說明程序的處理速度是足夠的,少量的超過是沒有問題的。
當然對sparkstreaming程序的優化遠不止於此,後期還需要學習更深層次的知識,這樣才能更好的去適配各種運行環境,完成健壯性,穩定的項目