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中 的算子分為三類:輸入算子、輸出算子、功能算子。 </ul>
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上查看語法手冊。
StreamCQL Github地址:https://github.com/HuaweiBigData/StreamCQL
來自:http://www.csdn.net/article/2015-12-22/2826541