1. 程式人生 > >SreamCQL架構解析,來自華為的開源流處理框架

SreamCQL架構解析,來自華為的開源流處理框架

StreamCQL是一個類SQL的宣告式語言,它用於在流(streams)和可更新關係(updatable relation)上的可持續查詢,目的是在流處理平臺分散式計算能力之上,通過使用簡易通用的類SQL語言,使得業務邏輯的開發變得統一和簡易。在功能上,StreamCQL彌補了傳統流處理平臺上一些基本業務功能的缺失,除了過濾、轉換等基本SQL能力之外, 還引入基於記憶體視窗的計算、統計、關聯等能力,以及流資料的拆分、合併等功能。

StreamCQL重要概念介紹

  • 流:流是一組(無窮)元素的集合,流上的每個元素都屬於同一個schema;每個元素都和邏輯時間有關;即流包含了元組和時間的雙重屬性。流上的任何一個元素,都可以用Element<tuple, Time>的方式來表示,tuple是元組,包含了資料結構和資料內容,Time就是該資料的邏輯時間。
  • Window:視窗(window)是流處理中解決事件的無邊界(unbounded)及流動性的一種重要手段,把事件流在某一時刻變成靜態的檢視,以便進行類似資料庫表的各種查詢操作。在stream上可以定義window,視窗有兩種型別,時間視窗(time-based)和記錄視窗(row-based)。兩種視窗都支援兩種模式,滑動(slide)和跳動(tumble)。
  • 運算元:運算元是包含了一系列運算關係的組合,比如聚合運算元,就包含了查詢(select),視窗,聚合(aggregate),排序(sort),視窗前過濾(filter before window),視窗之後的過濾(where),聚合之後的過濾(having)等功能,除此之外,還有流拆分運算元,流合併運算元等。StreamCQL中的運算元分為三類:輸入運算元、輸出運算元、功能運算元。

StreamCQL架構介紹

StreamCQL總體架構如下圖所示:


圖1 StreamCQL架構圖

StreamCQL的總體架構分為引擎、功能、業務介面三層,每隔層次之間分工明確,責任清晰,可以輕易進行功能拓展。

1. 引擎

StreamCQL的引擎層,可以適配各種不同的流處理引擎,比如Flink等,目前主要適配Storm。

引擎層的作用在於完成完成對各類運算元對底層不同流處理引擎的介面適配、拓撲的構建、提交檢視刪除等操作。

以Storm適配為例,在Storm中,對外介面分為Spout和Bolt,其中,Spout就對應輸入運算元,Bolt對應輸出運算元和功能運算元;StreamCQL中所有操作是以運算元為單位的,各類運算都發生在不同的運算元內部。運算元分為輸入運算元、輸出運算元和功能運算元,在Storm適配層中,就包含輸入運算元對Spout的適配,輸出運算元和功能運算元對Bolt的適配,以及emit的適配,topology builder的適配。只要通過幾百行程式碼就可以完成對Storm引擎的適配工作。

StreamCQL引擎層和Streaming的對外介面如下圖所示:


圖2 StreamCQL底層解耦架構

StreamCQL在Storm自身的IRichSpout,IRichBolt介面基礎上,實現了StormSpout、StormBolt和StormOutputBolt來遮蔽底層不同引擎帶來的介面變更。

StreamApapter是一個介面卡,主要作用就是將Streaming運算元注入到Spout和Bolt中。

IInputStreamOperator、IFunctionStreamOperator和IOutputStreamOperator是所有的輸入輸出和功能性運算元的介面,同用戶自定義介面一致。

該架構使用依賴注入的原則,實現了各個每個層級運算元之間的解耦。

2. 功能

功能層以Stream和Window為基礎,構建出了Join,Aggregate等運算元。

Stream即流,該功能構建出了整個流處理平臺數據流的基礎。定義了資料流動、解析和分發規則。

Window:window是流上一段時間內資料的集合。StreamCQL上絕大部分的計算,都是基於視窗的。

流和視窗構成了整個流處理平臺的核心。

StreamCQL功能層的運算元包含Join運算元、Aggregate運算元、Split運算元、Merge運算元、Functor運算元、filter運算元、union運算元、輸入運算元和輸出運算元,模式匹配運算元目前暫時沒有實現。

Join運算元提供的功能類似關係型資料庫的Join功能。目前StreamCQL支援的Join型別包含Inner Join,Left (outer) Join,Right (outer) Join,Full (outer) Join ,Cross Join四種類型。目前只支援雙流Join。由於流的特殊性,Join的時候,兩個流的資料都是在不斷髮生變化的,所以兩個流任何一個流的資料變化,都會觸發Join操作。如果只想讓某個流觸發Join,那麼就應該使用UNIDIRECTION關鍵字。


圖3 雙流Join示例

下表時當有資料流動的時候,雙向Join的輸出舉例。


圖4 雙流Join結果示例


圖5 雙流Join單流觸發Join示例


圖6 雙流Join單流觸發Join資料示例

Filter運算元適合只有單純資料過濾的簡單場景,不支援任何其他列轉換運算,不支援視窗。

Functor運算元在Filter運算元的基礎上 添加了列轉換運算,支援Select子句運算。

Aggregate運算元是一個大而全的運算元,在Functor的基礎上,添加了視窗功能,並支援分組,聚合,視窗前過濾,視窗後過濾,聚合後過濾(having),排序功能。


圖7 aggregate聚合運算元內部關係說明

Split運算元的主要作用在於完成單個流到多個流的拆分,支援每個流輸出不同資料。


圖8 Split運算元示例


圖9 Split運算元輸出舉例

Merge運算元作用正好和Split運算元相反,支援多流到單個流的合併。Merge運算元要求每個流都有一個欄位和其他流中的一個欄位匹配,這樣才會合併做同一條資料。類似關係型資料庫中的多留等值Join。


圖10 Merge運算元示例


圖11 Merge運算元資料輸出示例

Union運算元在CQL語法層面不支援,但是在CQL內部,會自動將滿足條件的運算元優化為Union運算元。Union運算元不支援任何過濾查詢運算,只是簡單進行流合併。

Input和output運算元是單純的輸入和輸出運算元,其中包含資料的讀取,寫入,序列化、反序列化功能。

3. 業務介面

StreamCQL的業務介面構建在Storm所有功能之上,分為CQL和IDE,其中IDE指的是類似Eclipse的開發IDE,這種IDE以功能層各類運算元和視窗為基礎,可以很容易進行拖拉拽等流拓撲開發;IDE功能目前還沒有實現。

CQL指的是CQL的語法,包含語法定義,語法解析,語義分析,流抽象拓撲構建等功能。CQL對StreamCQL對外功能展示的入口。相關CQL語法設計和對外拓展介面可以在Github上檢視語法手冊。