[Spark]-結構化流之初始篇
1.什麽是結構化流.
結構化流(Structured Streaming),是一種基於Spark-SQL引擎構建的,可容錯的,可擴展的流處理引擎.
它以微批量計算的形式來表達流式計算,隨著流式數據持續到達,它能持續的進行處理並更新最終計算結果.
它使用Spark-SQL帶來的豐富的API,來表示流聚合(streaming aggregations),事件時間窗口( event-time windows),流到批處理連接(stream-to-batch joins)等,最終在同一個引擎(優化的Spark-SQL引擎)執行.
並且,系統能以檢查點(CheckPoint)和預寫日誌(Write Ahead Logs),來確保端到端的(end-to-end)有且僅有一次(exactly-once)的容錯保證.
它的微批處理機制,可以將端到端的延遲降低到100毫秒以下,而在2.3版本中,新提供了一種連續處理(Continuous Processing)機制,將這種端到端的延遲進一步降低到1毫秒以內
簡單來說,結構化流提供一種快速的,可容錯的,可擴展的,端到端有且僅有一次保證的流式處理方案
2.結構化流與流式處理(Streaming)
結構化流是Spark2.X時代提出的新一代流式計算框架.
它相當於Streaming的增強版,從就舊的來說,它可以完全覆蓋Streaming的功能,從新的來說,它還具有以下的演進:
Streaming是按時間分片為DStream,這導致Streaming很難基於event-time,來處理數據延時,甚至數據亂序的情況.而結果化流是視為一個無界DataFrame,輸出結果映射為另一張表.天然支持亂序情況.
流式(使用RDD)和批處理(使用Spark-SQL)API不能保持完全兼容,程序代碼需要做一些轉換才行
端到端的保障機制由用戶維護,難以處理增量更新和持久化存儲一致的問題
3.編程模型
3.1 基本概念
結構化流的核心思想是時間分片,是將實時數據流,視為一個不斷增加(append)的表.這讓它與普通的批處理非常類似
但是,結構化流不實現整個表.它讀取最新的可用數據流數據來源,處理結果逐步更新,然後丟棄的源數據.只保持在所需的最少的中間狀態的數據更新結果
3.2 基於事件時間處理數據延遲
因為時間分片的機制,時間屬性就是一個非常重要的屬性.結構化流支持基於事件時間(Event-time)來處理.
事件時間是嵌入在數據本身中.很多的時候,都需要基於事件時間而不是結構化流接受時間來處理.比如某些情況下,一部分數據到達出現延遲
3.3 容錯機制
[Spark]-結構化流之初始篇