Spark Streaming揭秘 Day29
深入理解Spark2.x中的Structured Streaming
在Spark2.x中,Spark Streaming獲得了比較全面的升級,稱為Structured Streaming,和之前的很不同,功能更強大,效率更高,跟其他的組件整合性也更好。
連續應用程序continuous application
首先,也是最重要的,在2.x中,提出了一個叫做continuous applications連續應用程序的概念。
如下圖所示,數據從Kafka中流進來,通過ETL操作進行數據清洗,清洗出來作為目標數據進行進一步處理,可能是機器學習,也可能是交互式查詢,也有可能直接把數據存在數據庫或者其他外部存儲設備,也有可能是直接交給已有的應用程序。也就是說SparkStreaming從獲得數據后,能把全部處理環節串聯起來,稱之為端到端(End to end)處理!!!
舉個例子:如果要將貨物進行海運,大致會下面這些階段:
貨物從倉庫運出-->出來之后裝上車-->到車開動-->車在馬路上行駛-->到了碼頭停下來-->貨物從車上卸下來-->從陸地上弄到船上。
這些階段一環扣一環,每一環都有責任,都會有風險。
continuous application的模型就與這個類似,在充分應對風險的前提下,可以串聯業務的全部過程!!!
無邊界表unbounded table
對SparkStreaming來說,Continuous還有另一層含義,即運行在DataSet和Dataframe之上。
基本觀點是把數據看成一張表,默認情況下DataSet和Dataframe中的表是有邊界的,而在流處理中是無邊界的。對於SparkStreaming來說,是將數據抽象為了一個沒有邊界的表!!!
這個做法有一個非常大的好處,我們知道,目前SparkStreaming是直接依賴RDD,優化需要自己完成,使用DataSet和Dataframe就可以利用Tungsten引擎來進行優化。把Tungsten等優化技術輕而易舉的應用起來,可以說是在技術的運用上促進化學反應的發生。
新加入的Planner就類似路由器,我們在使用時,可以按照時間說明,由planner確定每次讀取的位置,在運行時動態綁定位置。在這種模式下,沒有數據收集再處理的概念,認為數據一直在那兒,直接拿了處理就行。這可以極大的簡化對流處理的理解。
增量輸出模式delta output
在2.x中,增加了很多輸出模式,delta output是其中的一種最重要的一種。
增量更新,也就是說有需要更新數據的才會更新,其他的不變。Trigger會不斷檢測輸入數據,在不斷的進行處理之后,輸出結果只更新需要更新的內容,這個更符合我們應用程序的處理場景。
API簡化
在API方面,引入和流函數的封裝。
這邊舉個例子:Kafka中讀取的數據,通過stream方法形成流,就可以直接與jdbc中讀取的數據在DataSet層面就進行Join,不用使用transform或者foreachRDD方法。
stream方法底層依賴Dataset和Dataframe,集成了SparkSql和Dataset幾乎所有的功能,把流處理的代碼編寫一下子簡化了很多。
其他改進
2.x同時也解決了DStream的很多問題。
- 增加了eventTime的概念,在原有基於mini batch處理的基礎上,學習了Storm基於每個record的事件處理機制。
- serve using JDBC,可以把SparkStreaming抽象成一個數據庫,直接通過jdbc訪問數據。
- change queries,在運行時可以變更query,並支持多個query並行運行。
小結
從2.x的設計來看,從更根本上,是為了滿足更快Faster、完全容錯fault-tolerant、完全的語義一致性exactly的要求。
通過實現有狀態流處理,讓我們的功能更強大。而基於DataSet和Dataframe處理,讓我們忘記流的概念,使用將會越來越簡單。
欲知后事如何,且聽下回分解!
DT大數據每天晚上20:00YY頻道現場授課頻道68917580