QStreaming背景
首先在進入主題之前我們先來回顧下經(jīng)典的大數(shù)據(jù)ETL架構(gòu)有哪些滚婉?
1. Lambda架構(gòu)
2. Kappa架構(gòu)
3. 混合架構(gòu)
它們之間的區(qū)別如下:
七牛的大數(shù)據(jù)平臺在搭建過程中也經(jīng)歷了上面幾個架構(gòu)的變遷挠铲,也就是從最早的Lambda架構(gòu)戴差,到嘗試使用Kappa架構(gòu),再到后面的新型混合ETL架構(gòu)竭钝,為了滿足業(yè)務(wù)需求慕的,開發(fā)人員在這幾個架構(gòu)中進行折中選擇堕伪,但是我們發(fā)現(xiàn)上面幾個架構(gòu)對于大數(shù)據(jù)的開發(fā)人員要求較高,主要體現(xiàn)在下面幾個方面:
1. 涉及到眾多的框架诈皿,如流處理框架就有早期的Apache Storm林束,到后面的Apache Spark Streaming,再到Apache Flink像棘,學(xué)習(xí)門檻較高
2. 不同計算框架對與數(shù)據(jù)源的定義不統(tǒng)一,造成輸入輸出較難管理
3. 數(shù)據(jù)開發(fā)人員新開發(fā)一個業(yè)務(wù)指標壶冒,不同開發(fā)人員寫出的代碼風格不統(tǒng)一缕题,開發(fā)效率低,很難進行工程化胖腾,后期維護也必將困難
為了解決上面的幾個問題烟零,團隊選擇基于Apache Spark開發(fā)了QStreaming這套簡單輕量級ETL開發(fā)框架
QStreaming特性
數(shù)據(jù)源支持
1. Apache Kafka
2. Apache Hbase
3. Hadoop HDFS/S3
4. Jdbc
5. MongoDB
6. Apache Hudi
主要特性
1. DDL定義輸入源
這里面stream關(guān)鍵字代表定義了一個流表,并且是連接到kafka消息中間件
2. 流處理watermark的DSL支持
在DSL中添加watermark咸作,主要有2種方式:
- 在DDL中指定锨阿,
- 在create view 語句中指定
3. 動態(tài)UDF
比如下面這個轉(zhuǎn)換一個日期字符串為時間戳格式
4. 流處理的多輸出
這個特性主要是通過spark structed streaming的forEachBatch實現(xiàn)的
5. 變量渲染
變量渲染經(jīng)常在一些定時調(diào)度批處理中非常有用,如下根據(jù)小時讀取一個HDFS上的parquet文件
6. 監(jiān)控性宏,如kafka lag監(jiān)控
由于Apache spark消費kafka是使用的低階API群井,默認我們沒有辦法知道消費的topic有沒有延遲, 我們通過指定group-id屬性毫胜,模擬kafka consumer的subscribe模式书斜,這樣就和普通的kafka consumer 高級API一樣了
7. 數(shù)據(jù)質(zhì)量
這個特性主要是用來對數(shù)據(jù)做單元測試的,比如校驗我們ETL結(jié)果表的準確性
QStreaming完整的語法特性參考[這里](https://github.com/qiniu/QStreaming/blob/master/stream-core/src/main/antlr4/com/qiniu/stream/core/parser/Sql.g4)
QStreaming架構(gòu)
?架構(gòu)圖
核心組件
從上面的架構(gòu)圖中可以看出QStreaming主要有以下幾個組件組成
1. Pipeline DSL
Pipeline DSL是一個定義時的Job任務(wù)描述文件酵使,類似于SQL語法荐吉,對Spark SQL完全兼容,比如下面這個
2. Pipeline DSL Parser
Pipeline DSL Parser組件負責解析Pipeline DSL并且轉(zhuǎn)換ANTLR AST為Pipeline Domain Models
Pipeline Domain models
3. Pipleine Translator
Pipeline Translator進一步將Pipeline domain model轉(zhuǎn)換為spark transformations和actions
4. Data Quality Checker
Data Quality Check負責解析單元測試語句口渔,使用Amazon Deequ庫并且翻譯為Deequ的VerificationSuite
5. Pipeline Runner
這個組件負責構(gòu)建Pipeline啟動上下文样屠,協(xié)同PipelineParser和Pipeline Translator一起工作,根據(jù)配置啟動流或者批處理Application
QStreaming使用場景
- 場景一
在這一個場景中缺脉,QStreaming主要通過消費kafka,然后進行預(yù)聚合痪欲,預(yù)聚合可以進行開窗口計算,比如1分鐘的窗口攻礼,然后在把窗口聚合的結(jié)果寫入下游數(shù)據(jù)存儲中业踢,這里面很重要的一個特性就是數(shù)據(jù)訂正功能,所以可以選擇的ETL架構(gòu)如下:
1. lambda架構(gòu)
2. kappa架構(gòu)
3. 混合架構(gòu)
- 場景二
在這個場景中礁扮,QStreaming扮演了一層很薄的角色知举,比如對數(shù)據(jù)進行加工,但是不對數(shù)據(jù)進行聚合太伊,保留了明顯雇锡,預(yù)聚合的功能交給了下游支持OLAP引擎,比如支持RollUp功能的Apache Druid,Apache Doris,Clickhouse等僚焦,另外Apache Doris還可以保留明細功能
- 場景三
在這個場景中锰提,QStreaming主要是通過Apache Airflow進行調(diào)度的,ODS對接Apache Hive數(shù)據(jù)倉庫,然后可以做DWS或者是DWD操作欲账,再把結(jié)果寫入Hive數(shù)據(jù)倉庫中屡江,提供離線即席查詢,或者是聚合的結(jié)果寫入RDS,NOSQL等數(shù)據(jù)庫赛不,上層對其結(jié)果封裝為API惩嘉,供用戶使用
- 場景四
這個場景主要是消息驅(qū)動的,通過上游業(yè)務(wù)方發(fā)送消息到消息中間件踢故,然后消費消息驅(qū)動QStreaming ETL任務(wù)
QStreaming總結(jié)
整體上QStreaming可以從下面3個圖簡單概況:
- 架構(gòu)層面
可用于下面三種架構(gòu)中文黎,靈活切換
- 開發(fā)層面
- 運維層面
QStreaming RoadMap
QStreaming還非常年輕,后期還會有進一步的規(guī)劃殿较,規(guī)劃的特性如下:
完善數(shù)據(jù)源支持(如Delta lake,Apache Hudi等)
添加數(shù)據(jù)血緣功能
機器學(xué)習(xí)Pipeline