Spark權威指南(中文版)----第21章 Structured Streaming基礎

​Spark The Definitive Guide(Spark權威指南) 中文版。本書詳細介紹了Spark2.x版本的各個模塊,目前市面上最好的Spark2.x學習書籍!!!

掃碼關注公衆號:登峯大數據,閱讀中文Spark權威指南(完整版),系統學習Spark大數據框架!

如果您覺得作者翻譯的內容有幫助,請分享給更多人。您的分享,是作者翻譯的動力

既然我們已經簡要概述了流處理,現在讓我們直接進入結構化流。在本章中,我們將再次說明結構化流背後的一些關鍵概念,然後將它們與一些代碼示例一起應用,這些代碼示例展示了系統的易用性。

21.1.Structured Streaming(結構化流)基礎知識

正如我們在第20章末尾所討論的,結構化流是構建在Spark SQL引擎上的流處理框架。結構化流使用Spark中現有的結構化API (DataFrames、dataset和SQL),而不是引入單獨的API,這意味着支持您熟悉的所有操作。用戶表達流計算的方式與在靜態數據上編寫批處理計算的方式相同。在指定這一點並指定流目的地之後,結構化流引擎將負責在新數據到達系統時以增量和連續的方式運行查詢。然後使用本書第二部分中討論的相同Catalyst引擎執行這些計算邏輯指令,包括查詢優化、代碼生成等。除了核心的結構化處理引擎之外,結構化流還包括許多專門用於流的特性。例如,結構化流通過檢查點和write-ahead logs確保端到端、精確的一次處理以及容錯。

結構化流背後的主要思想是將數據流視爲一個表,數據不斷地附加到該表中。然後,作業定期檢查新的輸入數據,對其進行處理,在需要時更新狀態存儲中的一些內部狀態,並更新其結果。該API的一個基礎是,在進行批處理或流處理時,您不應該更改查詢的代碼——您應該只指定是以批處理方式還是流方式運行該查詢。在內部,結構化流將自動指出如何“增量化”您的查詢,即在新數據到達時有效地更新其結果,並以容錯方式運行它。

簡單地說,結構化流是“您的DataFrame,且是流式的”。這使得開始使用流處理應用程序變得非常容易。您可能已經有了它們的代碼! 然而,結構化流能夠運行的查詢類型有一些限制,還有一些您必須考慮的特定於流的新概念,如事件時間和無序數據。我們將在本章和接下來的章節中討論這些問題。最後,通過與Spark的其餘部分集成,結構化流使用戶能夠構建我們稱爲連續應用程序的應用程序。continous應用程序是一個端到端應用程序,它通過組合各種工具實時響應數據:流作業、批處理作業、流和離線數據之間的連接以及交互式查詢。因爲現在大多數流作業都是在一個更大的連續應用程序上下文中部署的,所以Spark開發人員希望能夠更容易地在一個框架中指定整個應用程序,並在不同的部分中獲得一致的結果。例如,您可以使用結構化流連續更新一個表,用戶可以使用Spark SQL交互式地查詢該表,爲Mllib訓練的機器學習模型提供服務,或者在Spark的任何數據源中使用離線數據連接流。

21.2.重要概念

既然我們已經說到了高級概念,現在讓我們介紹結構化流作業中的一些重要概念。你會發現,沒有很多重要概念。這是因爲結構化流被設計得很簡單。閱讀一些其他的大數據流書籍,你會注意到他們開始介紹術語,比如用於傾斜數據reducers的分佈式流處理拓撲(一種誇張但準確的描述)和其他複雜的術語。Spark的目標是自動處理這些問題,併爲用戶提供在流上運行任何Spark計算的簡單方法。

21.2.1.Transformations 和 Actions

結構化流使用了我們在本書中看到的相同的Transformations和Actions概念。結構化流中可用的Transformations與我們在第二部分中看到的Transformations完全相同,但有一些限制。這些限制通常涉及引擎還不能支持的某些類型的查詢,儘管一些限制已經在Spark的新版本中被取消了。在結構化流中通常只有一個action可用於啓動流,然後流將連續運行並輸出結果。

21.2.2.Input Sources

結構化流支持以流方式讀取的多個輸入源。從Spark 2.2開始,支持的輸入源如下:

  • Apache Kafka 0.10

  • 分佈式文件系統上的文件,如HDFS或S3 (Spark將不斷讀取目錄中的新文件)

  • 用於測試的socket

我們將在本章後面深入討論這些,但值得一提的是,Spark的作者正在開發一個穩定的源API,以便您可以構建自己的流連接器。

21.2.3.Sinks

就像源允許您將數據放入結構化流中一樣,sink指定流的結果集的目標。接收器和執行引擎還負責可靠地跟蹤數據處理的確切進度。以下是Spark 2.2支持的輸出接收器:

  • Apache Kafka 0.10

  • 幾乎任何文件格式

  • 用於在輸出記錄上運行任意計算的foreach接收器

  • 用於測試的控制檯接收器console sink

  • 用於調試的內存接收器 memory sink

我們將在本章後面討論Sources時更詳細地討論這些。

21.2.4.Output Modes

爲我們的結構化流工作定義一個接收器只是故事的一半。我們還需要定義我們希望Spark如何向該接收器寫入數據。例如,我們是否只想添加新信息?隨着時間的推移,我們是否希望隨着接收到關於行的更多信息而更新行(例如,更新給定web頁面的點擊計數)?我們是否希望每次都完全覆蓋結果集(即始終爲所有頁面編寫具有完整點擊計數的文件)? 爲此,我們定義了一個輸出模式,類似於我們在靜態結構化api中定義輸出模式的方式。

支持的輸出模式如下:

  • Append (只向輸出接收器添加新記錄)

  • Update (更新已更改的記錄)

  • Complete (重寫完整輸出)

一個重要的細節是,某些查詢和某些接收器只支持特定的輸出模式,我們將在本書的後面討論。例如,假設您的工作只是在流上執行map。當新記錄到達時,輸出數據將無限增長,因此使用Complete模式沒有意義,因爲Complete模式要求立即將所有數據寫入一個新文件。相反,如果您要做一個聚合到有限數量的鍵中,那麼Complete和Update模式是有意義的,但是Append沒有意義,因爲有些鍵的值需要隨着時間的推移而更新。

21.2.5.Triggers

輸出模式定義數據的輸出方式,觸發器定義數據何時輸出——也就是說,結構化流何時應該檢查新的輸入數據並更新其結果。默認情況下,結構化流將在處理完最後一組輸入數據後立即查找新的輸入記錄,從而爲新結果提供儘可能低的延遲。然而,當接收器是一組文件時,這種行爲可能導致許多小的輸出文件。因此,Spark還支持基於處理時間的觸發器(只在固定的時間間隔內查找新數據)。將來,還可能支持其他類型的觸發器。

21.2.6.Event-Time Processing事件時間處理

結構化流還支持事件時間處理(即,根據記錄中包含的時間戳處理可能出現故障的數據)。這裏有兩個關鍵的概念,你們現在需要理解;我們將在下一章更深入地討論這兩個問題,所以如果您現在對它們還不是很清楚,也不要擔心。

21.2.6.1.Event-time data事件時間數據

事件時間是指嵌入到數據中的時間字段。這意味着,您不是根據數據到達系統的時間來處理數據,而是根據生成數據的時間來處理數據,即使由於上傳速度慢或網絡延遲導致流應用程序中的記錄無法正常到達流應用程序。

在結構化流中,表示事件時間處理非常簡單。因爲系統將輸入數據視爲一個表,所以事件時間只是該表中的另一個字段,您的應用程序可以使用標準SQL操作符進行分組、聚合和窗口操作。然而,在底層,當結構化流知道您的列之一是事件時間字段時,它可以採取一些特殊的操作,包括優化查詢執行或確定何時可以安全地忘記關於時間窗口的狀態。其中許多操作可以使用水印來控制。

21.2.6.2.Watermarks水印

水印是流處理系統的一個特性,允許您指定希望在事件發生時多晚看到數據。例如,在處理來自移動設備的日誌的應用程序中,由於上傳延遲,日誌可能會延遲30分鐘。支持事件時間(包括結構化流)的系統通常允許設置水印,以限制需要記住舊數據的時間。水印還可以用於控制何時爲特定的事件時間窗口輸出結果(例如,等待水印通過)。

21.3.Structured Streaming 實戰

請在公衆號中閱讀本章剩下的內容。

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