Spark -- Structured Streaming入門介紹

介紹

●官網

http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html

●簡介

spark在2.0版本中發佈了新的流計算的API,Structured Streaming/結構化流。

Structured Streaming是一個基於Spark SQL引擎的可擴展、容錯的流處理引擎。統一了流、批的編程模型,可以使用靜態數據批處理一樣的方式來編寫流式計算操作。並且支持基於event_time的時間窗口的處理邏輯

隨着數據不斷地到達,Spark 引擎會以一種增量的方式來執行這些操作,並且持續更新結算結果。可以使用Scala、Java、Python或R中的DataSet/DataFrame API來表示流聚合、事件時間窗口、流到批連接等。此外,Structured Streaming會通過checkpoint和預寫日誌等機制來實現Exactly-Once語義。

簡單來說,對於開發人員來說,根本不用去考慮是流式計算,還是批處理,只要使用同樣的方式來編寫計算操作即可Structured Streaming提供了快速、可擴展、容錯、端到端的一次性流處理,而用戶無需考慮更多細節

默認情況下,結構化流式查詢使用微批處理引擎進行處理,該引擎將數據流作爲一系列小批處理作業進行處理,從而實現端到端的延遲,最短可達100毫秒,並且完全可以保證一次容錯。自Spark 2.3以來,引入了一種新的低延遲處理模式,稱爲連續處理,它可以在至少一次保證的情況下實現低至1毫秒的端到端延遲。也就是類似於 Flink 那樣的實時流,而不是小批量處理。實際開發可以根據應用程序要求選擇處理模式,但是連續處理在使用的時候仍然有很多限制,目前大部分情況還是應該採用小批量模式。

 

​​​​​​​ API

1.Spark Streaming 時代 -DStream-RDD

Spark Streaming 採用的數據抽象是DStream,而本質上就是時間上連續的RDD,對數據流的操作就是針對RDD的操作

2.Structured Streaming 時代 - DataSet/DataFrame -RDD

Structured Streaming是Spark2.0新增的可擴展和高容錯性的實時計算框架,它構建於Spark SQL引擎,把流式計算也統一到DataFrame/Dataset裏去了。

Structured Streaming 相比於 Spark Streaming 的進步就類似於 Dataset 相比於 RDD 的進步

 

​​​​​​​主要優勢

1.簡潔的模型。Structured Streaming 的模型很簡潔,易於理解。用戶可以直接把一個流想象成是無限增長的表格

2.一致的 API。由於和 Spark SQL 共用大部分 API,對 Spaprk SQL 熟悉的用戶很容易上手,代碼也十分簡潔。同時批處理和流處理程序還可以共用代碼,不需要開發兩套不同的代碼,顯著提高了開發效率。

3.卓越的性能。Structured Streaming 在與 Spark SQL 共用 API 的同時,也直接使用了 Spark SQL 的 Catalyst 優化器和 Tungsten,數據處理性能十分出色。此外,Structured Streaming 還可以直接從未來 Spark SQL 的各種性能優化中受益。

4.多語言支持。Structured Streaming 直接支持目前 Spark SQL 支持的語言,包括 Scala,Java,Python,R 和 SQL。用戶可以選擇自己喜歡的語言進行開發。

 

​​​​​​​ 編程模型

 ●編程模型概述

一個流的數據源從邏輯上來說就是一個不斷增長的動態表格,隨着時間的推移,新數據被持續不斷地添加到表格的末尾

對動態數據源進行實時查詢,就是對當前的表格內容執行一次 SQL 查詢。

數據查詢,用戶通過觸發器(Trigger)設定時間(毫秒級)。也可以設定執行週期。

一個流的輸出有多種模式,既可以是基於整個輸入執行查詢後的完整結果,也可以選擇只輸出與上次查詢相比的差異,或者就是簡單地追加最新的結果

這個模型對於熟悉 SQL 的用戶來說很容易掌握,對流的查詢跟查詢一個表格幾乎完全一樣,十分簡潔,易於理解

核心思想

Structured Streaming最核心的思想就是將實時到達的數據不斷追加到unbound table無界表,到達流的每個數據項(RDD)就像是表中的一個新行被附加到無邊界的表中.這樣用戶就可以用靜態結構化數據的批處理查詢方式進行流計算,如可以使用SQL對到來的每一行數據進行實時查詢處理;(SparkSQL+SparkStreaming=StructuredStreaming)

●應用場景

Structured Streaming將數據源映射爲類似於關係數據庫中的表,然後將經過計算得到的結果映射爲另一張表,完全以結構化的方式去操作流式數據,這種編程模型非常有利於處理分析結構化的實時數據;

 ●WordCount圖解

如圖所示,

第一行表示從socket不斷接收數據,

第二行可以看成是之前提到的“unbound table",

第三行爲最終的wordCounts是結果集。

當有新的數據到達時,Spark會執行“增量"查詢,並更新結果集;

該示例設置爲Complete Mode(輸出所有數據),因此每次都將所有數據輸出到控制檯;

 

1.在第1秒時,此時到達的數據爲"cat dog"和"dog dog",因此我們可以得到第1秒時的結果集cat=1 dog=3,並輸出到控制檯;
2.當第2秒時,到達的數據爲"owl cat",此時"unbound table"增加了一行數據"owl cat",執行word count查詢並更新結果集,可得第2秒時的結果集爲cat=2 dog=3 owl=1,並輸出到控制檯;
3.當第3秒時,到達的數據爲"dog"和"owl",此時"unbound table"增加兩行數據"dog"和"owl",執行word count查詢並更新結果集,可得第3秒時的結果集爲cat=2 dog=4 owl=2;

這種模型跟其他很多流式計算引擎都不同。大多數流式計算引擎都需要開發人員自己來維護新數據與歷史數據的整合並進行聚合操作。然後我們就需要自己去考慮和實現容錯機制、數據一致性的語義等。然而在structured streaming的這種模式下,spark會負責將新到達的數據與歷史數據進行整合,並完成正確的計算操作,同時更新result table,不需要我們去考慮這些事情。

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