Spark Structured Streaming特性介紹

為幫助開發者更深入的瞭解這三個大數據開源技術及其實際應用場景,9月8日,InfoQ聯合華為雲舉辦了一場實時大數據Meetup,集結了來自Databricks、華為及美團點評的大咖級嘉賓前來分享。

作為Spark Structured Streaming最核心的開發人員、Databricks工程師,Tathagata Das(以下簡稱“TD”)在開場演講中介紹了Structured Streaming的基本概念,及其在存儲、自動流化、容錯、性能等方面的特性,在事件時間的處理機制,最後帶來了一些實際應用場景。

首先,TD對流處理所面對的問題和概念做了清晰的講解。TD提到,因為流處理具有如下顯著的複雜性特徵,所以很難建立非常健壯的處理過程:

Spark Structured Streaming特性介紹

  • 一是數據有各種不同格式(Jason、Avro、二進制)、髒數據、不及時且無序;
  • 二是複雜的加載過程,基於事件時間的過程需要支持交互查詢,和機器學習組合使用;
  • 三是不同的存儲系統和格式(SQL、NoSQL、Parquet等),要考慮如何容錯。

因為可以運行在Spark SQL引擎上,Spark Structured Streaming天然擁有較好的性能、良好的擴展性及容錯性等Spark優勢。除此之外,它還具備豐富、統一、高層次的API,因此便於處理複雜的數據和工作流。再加上,無論是Spark自身,還是其集成的多個存儲系統,都有豐富的生態圈。這些優勢也讓Spark Structured Streaming得到更多的發展和使用。

流的定義是一種無限表(unbounded table),把數據流中的新數據追加在這張無限表中,而它的查詢過程可以拆解為幾個步驟,例如可以從Kafka讀取JSON數據,解析JSON數據,存入結構化Parquet表中,並確保端到端的容錯機制。其中的特性包括:

  • 支持多種消息隊列,比如Files/Kafka/Kinesis等。
  • 可以用join(), union()連接多個不同類型的數據源。
  • 返回一個DataFrame,它具有一個無限表的結構。
  • 你可以按需選擇SQL(BI分析)、DataFrame(數據科學家分析)、DataSet(數據引擎),它們有幾乎一樣的語義和性能。
  • 把Kafka的JSON結構的記錄轉換成String,生成嵌套列,利用了很多優化過的處理函數來完成這個動作,例如from_json(),也允許各種自定義函數協助處理,例如Lambdas, flatMap。
  • 在Sink步驟中可以寫入外部存儲系統,例如Parquet。在Kafka sink中,支持foreach來對輸出數據做任何處理,支持事務和exactly-once方式。
  • 支持固定時間間隔的微批次處理,具備微批次處理的高性能性,支持低延遲的連續處理(Spark 2.3),支持檢查點機制(check point)。
  • 秒級處理來自Kafka的結構化源數據,可以充分為查詢做好準備。

Spark SQL把批次查詢轉化為一系列增量執行計劃,從而可以分批次地操作數據。

Spark Structured Streaming特性介紹

在容錯機制上,Structured Streaming採取檢查點機制,把進度offset寫入stable的存儲中,用JSON的方式保存支持向下兼容,允許從任何錯誤點(例如自動增加一個過濾來處理中斷的數據)進行恢復。這樣確保了端到端數據的exactly-once。

在性能上,Structured Streaming重用了Spark SQL優化器和Tungsten引擎,而且成本降低了3倍!!更多的信息可以參考作者的blog。

Structured Streaming隔離處理邏輯採用的是可配置化的方式(比如定製JSON的輸入數據格式),執行方式是批處理還是流查詢很容易識別。同時TD還比較了批處理、微批次-流處理、持續流處理三種模式的延遲性、吞吐性和資源分配情況。

在時間窗口的支持上,Structured Streaming支持基於事件時間(event-time)的聚合,這樣更容易瞭解每隔一段時間發生的事情。同時也支持各種用戶定義聚合函數(User Defined Aggregate Function,UDAF)。另外,Structured Streaming可通過不同觸發器間分佈式存儲的狀態來進行聚合,狀態被存儲在內存中,歸檔採用HDFS的Write Ahead Log (WAL)機制。當然,Structured Streaming還可自動處理過時的數據,更新舊的保存狀態。因為歷史狀態記錄可能無限增長,這會帶來一些性能問題,為了限制狀態記錄的大小,Spark使用水印(watermarking)來刪除不再更新的舊的聚合數據。允許支持自定義狀態函數,比如事件或處理時間的超時,同時支持Scala和Java。

TD在演講中也具體舉例了流處理的應用情況。在蘋果的信息安全平臺中,每秒將產生有百萬級事件,Structured Streaming可以用來做缺陷檢測,下圖是該平臺架構:

Spark Structured Streaming特性介紹

在該架構中,一是可以把任意原始日誌通過ETL加載到結構化日誌庫中,通過批次控制可很快進行災難恢復;二是可以連接很多其它的數據信息(DHCP session,緩慢變化的數據);三是提供了多種混合工作方式:實時警告、歷史報告、ad-hoc分析、統一的API允許支持各種分析(例如實時報警系統)等,支持快速部署。四是達到了百萬事件秒級處理性能。


分享到:


相關文章: