必須掌握的Spark調優技術點

在利用Spark處理數據時,若是數據量不大,那麼Spark的默認配置基本就能知足實際的業務場景。可是當數據量大的時候,就須要作必定的參數配置調整和優化,以保證業務的安全、穩定的運行。而且在實際優化中,要考慮不一樣的場景,採起不一樣的優化策略。apache

1. 合理設置微批處理時間緩存

在SparkSreaming流式處理中,合理的設置微批處理時間(batchDuration)是很是有必要的。安全

若是batchDuration設置太短,會致使SparkStreaming頻繁提交job。若是每一個batchDuration所產生的job不能在這個時間內完成處理,就會形成job不斷堆積,最終致使SparkStreaming發生阻塞,甚至程序宕掉。微信

須要根據不一樣的應用場景和硬件配置等肯定,能夠根據SparkStreaming的可視化監控界面,觀察Total Delay等指標來進行batchDuration的調整。app

2. 控制消費的最大速率性能

好比SparkStreaming和Kafka集成,採用direct模式時,須要設置參數spark.streaming.kafka.maxRatePerPartition以控制每一個Kafka分區最大消費數。該參數默認沒有上線,即Kafka當中有多少數據它就會直接所有拉出。學習

但在實際使用中,須要根據生產者寫入Kafka的速率以及消費者自己處理數據的速度綜合考慮。大數據

同時還須要結合上面的batchDuration,使得每一個partition拉取的數據,要在每一個batchDuration期間順利處理完畢,作到儘量高的吞吐量,該參數的調整需參考可視化監控界面中的Input Rate和Processing Time。優化

3. 緩存反覆使用的"數據集"spa

Spark中的RDD和SparkStreaming中的DStream,若是被反覆的使用,最好利用cache或者persist算子,將"數據集"緩存起來,防止過分的調度資源形成的沒必要要的開銷。

4. 合理的設置GC

JVM垃圾回收是很是消耗性能和時間的,尤爲是stop world、full gc很是影響程序的正常運行。

關於JVM和參數配置,建議研讀《JVM內存管理和垃圾回收》《JVM垃圾回收器、內存分配與回收策略》《內存泄漏、內存溢出和堆外內存,JVM優化配置參數》。

5. 合理設置CPU

每一個executor能夠佔用一個或多個core,能夠經過觀察CPU的使用率變化來了解計算資源的使用狀況。

要避免CPU的使用浪費,好比一個executor佔用多個core,可是總的CPU利用率卻不高。此時建議讓每一個executor佔用相對以前較少的core,同時worker下面增長更多的executor進程來增長並行執行的executor數量,從而提升CPU利用率。同時要考慮內存消耗,畢竟一臺機器運行的executor越多,每一個executor的內存就越小,容易產生OOM。

6. 使用Kryo進行序列化和反序列化

Spark默認使用Java的序列化機制,但這種Java原生的序列化機制性能卻比Kryo差不少。使用Kryo須要進行設置:

//設置序列化器爲KryoSerializerSparkConf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")

//註冊要序列化的自定義類型SparkConf.registerKryoClasses(Array(classOf[CustomClass1],classOf[CustomClass2]))

7. 使用高性能的算子

1)使用reduceByKey、aggregateByKey替代groupByKey

2)filter以後進行coalesce操做

3)使用repartitionAndSortWithinPartition

替代repartition與sort操做

4)使用mapPartition替代map

5)使用foreachPartition替代foreach

要結合實際使用場景,進行算子的替代優化。

除了上述經常使用調優策略,還有合理設置Spark並行度,好比參數spark.default.parallelism的設置等,全部這些都要求對Spark內核原理有深刻理解,這裏再也不一一闡述。


 

關注微信公衆號:大數據學習與分享,獲取更對技術乾貨

相關文章
相關標籤/搜索