Spark Streaming(七)—— Spark Streaming性能優化

1. 減少批數據的執行時間

在Spark中有幾個優化可以減少批處理的時間:
① 數據接收的並行水平
通過網絡(如Kafka,Flume,Socket等)接收數據需要這些數據反序列化並被保存到Spark中。如果數據接收成爲系統的瓶頸,就要考慮並行地接收數據。注意,每個輸入DStream創建一個Receiver(運行在Worker機器上)接收單個數據流。**創建多個輸入DStream並配置它們可以從源中接收不同分區的數據流,從而實現多數據流接收。**例如,接收兩個topic數據的單個輸入DStream可以被切分爲兩個Kafka輸入流,每個接收一個topic。這將在兩個Worker上運行兩個Receiver,因此允許數據並行接收,提高整體的吞吐量。多個DStream可以被合併生成單個DStream,這樣運用在單個輸入DStream的transformation操作可以運用在合併的DStream上。
② 數據處理的並行水平
如果運行在計算stage上的併發任務數不足夠大,就不會充分利用集羣的資源。默認的併發任務數通過配置屬性來確定spark.default.parallelism。
③ 數據序列化
可以通過改變序列化格式來減少數據序列化的開銷。在流式傳輸的情況下,有兩種類型的數據會被序列化:

  • 輸入數據
  • 由流操作生成的持久RDD

在上述兩種情況下,使用Kryo序列化格式可以減少CPU和內存開銷。

2. 設置合理的批容量

爲了Spark Streaming應用程序能夠在集羣中穩定運行,系統應該能夠以足夠的速度處理接收的數據(即處理速度應該大於或等於接收數據的速度)。這可以通過流的網絡UI觀察得到。批處理時間應該小於批間隔時間。

根據流計算的性質,批間隔時間可能顯著的影響數據處理速率,這個速率可以通過應用程序維持。可以考慮WordCountNetwork這個例子,對於一個特定的數據處理速率,系統可能可以每2秒打印一次單詞計數(批間隔時間爲2秒),但無法每500毫秒打印一次單詞計數。所以,爲了在生產環境中維持期望的數據處理速率,就應該設置合適的批間隔時間(即批數據的容量)。

找出正確的批容量的一個好的辦法是用一個保守的批間隔時間(5-10,秒)和低數據速率來測試你的應用程序。

3. 內存調優

重點介紹幾個強烈推薦的自定義選項,它們可以減少Spark Streaming應用程序垃圾回收的相關暫停,獲得更穩定的批處理時間。

Default persistence level of DStreams:
和RDDs不同的是,默認的持久化級別是序列化數據到內存中(DStream是StorageLevel.MEMORY_ONLY_SER,RDD是StorageLevel.MEMORY_ONLY)。即使保存數據爲序列化形態會增加序列化/反序列化的開銷,但是可以明顯的減少垃圾回收的暫停。

Clearing persistent RDDs:
默認情況下,通過Spark內置策略(LUR),Spark Streaming生成的持久化RDD將會從內存中清理掉。如果spark.cleaner.ttl已經設置了,比這個時間存在更老的持久化RDD將會被定時的清理掉。正如前面提到的那樣,這個值需要根據Spark Streaming應用程序的操作小心設置。然而,可以設置配置選項spark.streaming.unpersist爲true來更智能的去持久化(unpersist)RDD。這個配置使系統找出那些不需要經常保有的RDD,然後去持久化它們。這可以減少Spark RDD的內存使用,也可能改善垃圾回收的行爲。

Concurrent garbage collector:
使用併發的標記-清除垃圾回收可以進一步減少垃圾回收的暫停時間。儘管併發的垃圾回收會減少系統的整體吞吐量,但是仍然推薦使用它以獲得更穩定的批處理時間。

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