SparkStreaming程序優化小記

最近公司部署了一個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程序的優化遠不止於此,後期還需要學習更深層次的知識,這樣才能更好的去適配各種運行環境,完成健壯性,穩定的項目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章