基于Doris構(gòu)建億級(jí)數(shù)據(jù)實(shí)時(shí)數(shù)據(jù)分析系統(tǒng)
背景
隨著公司業(yè)務(wù)快速發(fā)展,對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行增長(zhǎng)分析的需求越來(lái)越迫切,與此同時(shí)我們的業(yè)務(wù)數(shù)據(jù)量也在快速激增、每天的數(shù)據(jù)新增量大概在30w 左右,一年就會(huì)產(chǎn)生1 個(gè)億的數(shù)據(jù),顯然基于傳統(tǒng)MySQL數(shù)據(jù)庫(kù)已經(jīng)無(wú)法支撐
基于上述需求和痛點(diǎn),決定提供一個(gè)靈活的多維實(shí)時(shí)查詢和分析平臺(tái),幫助業(yè)務(wù)線做精細(xì)化運(yùn)營(yíng)。
業(yè)務(wù)分析
現(xiàn)有業(yè)務(wù)數(shù)據(jù)有以下特點(diǎn),查詢多、更新少,基本不會(huì)更新1 個(gè)月以前的數(shù)據(jù),但是查詢范圍較大,有時(shí)需要查詢幾年前的數(shù)據(jù),而且數(shù)據(jù)會(huì)以年、月等不同維度統(tǒng)計(jì)
因此以上場(chǎng)景使用 OLTP 引擎不是特別適合,OLAP則更為適合
這里可能有些人員不懂什么是 OLAP,下面是一個(gè)OLAP與OLTP對(duì)比圖
圖片
技術(shù)選型
實(shí)時(shí)數(shù)倉(cāng)
以上場(chǎng)景確定后,我們就開始了框架選型,最終確定了 Doris,理由如下
- 性能滿足要求
- 兼容MySQL 協(xié)議
- 運(yùn)維成本較低
- 架構(gòu)足夠簡(jiǎn)單
- 社區(qū)活躍,支持力度高
下面是一個(gè)選型對(duì)比,沒(méi)有好壞,只是Doris適合我們
圖片
實(shí)時(shí)數(shù)據(jù)捕獲
實(shí)時(shí)數(shù)據(jù),采用Fink CDC進(jìn)行捕獲,F(xiàn)ink CDC Connectors 是Apache Flink的一組源連接器,使用變更數(shù)據(jù)捕獲 (CDC) 從不同數(shù)據(jù)庫(kù)中獲取變更,而獲取變更是通過(guò)Debezium監(jiān)聽Binlog 日志,獲取到更新數(shù)據(jù)以后,可以對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,然后在根據(jù)doris 提供的Flink 插件Doris flink connecto導(dǎo)入到 Doris 里面
圖片
具體示例,可以參考:https://mp.weixin.qq.com/s/ssXocqCyoSVuRFBi2hzCKQ
為什么需要實(shí)時(shí)數(shù)據(jù)捕獲?
Doris 只是一個(gè)數(shù)據(jù)倉(cāng)庫(kù),他提供的功能是實(shí)時(shí)數(shù)據(jù)統(tǒng)計(jì)、查詢和存儲(chǔ),他不支持主動(dòng)實(shí)時(shí)抓取數(shù)據(jù),需要借助第三方工具來(lái)進(jìn)行實(shí)現(xiàn),比如我們?cè)?MySQL修改了一條數(shù)據(jù),怎么讓 Doris 進(jìn)行更新?目前想到的答案是主動(dòng)發(fā)送更新數(shù)據(jù)至Kafka,然后Doris訂閱 KafKa 的 Topic 然后進(jìn)行實(shí)時(shí)同步,雖然以上能實(shí)現(xiàn)我們想要的功能,但是有點(diǎn)復(fù)雜,業(yè)務(wù)每次操作都要發(fā)送 Kafka,同時(shí)要想對(duì)數(shù)據(jù)進(jìn)行加工,工作量相對(duì)較大,正因?yàn)橛幸陨蠁?wèn)題,所以我們采用Flink CDC
數(shù)據(jù)調(diào)度平臺(tái)
數(shù)據(jù)調(diào)度平臺(tái),采用海豚調(diào)度器(DolphinScheduler),它也是國(guó)人開源的一款分布式可擴(kuò)展的大數(shù)據(jù)調(diào)度平臺(tái),使用Java 語(yǔ)言開發(fā),目前已經(jīng)成為Apache 項(xiàng)目,它提供了強(qiáng)大的DAG可視化界面,所有流程定義都是可視化,通過(guò)拖拽任務(wù)完成定制DAG,同時(shí)支持 30+類型的任務(wù),比如執(zhí)行 SQL、shell 、DataX 等類型,官網(wǎng)地址:https://dolphinscheduler.apache.org
圖片
為什么需要數(shù)據(jù)調(diào)度平臺(tái)?
數(shù)據(jù)轉(zhuǎn)換:通過(guò)Flink 抽取的數(shù)據(jù),如果還想對(duì)這些數(shù)據(jù)進(jìn)行加工處理,比如實(shí)時(shí)同步的業(yè)務(wù)數(shù)據(jù),需要再次轉(zhuǎn)換為分鐘級(jí)、小時(shí)級(jí)、天、月等維度的報(bào)表
非實(shí)時(shí)數(shù)據(jù)同步:通過(guò)調(diào)度DataX,以分鐘、小時(shí)、天為單位進(jìn)行源數(shù)據(jù)同步
定時(shí)歸檔:比如每晚同步業(yè)務(wù)數(shù)據(jù)庫(kù)一個(gè)月前數(shù)據(jù),同步完成之后,在執(zhí)行刪除任務(wù),刪除業(yè)務(wù)庫(kù)一個(gè)月前的數(shù)據(jù)
數(shù)倉(cāng)數(shù)據(jù)分層
數(shù)據(jù)倉(cāng)庫(kù)的分層是一種常見的設(shè)計(jì)模式,它將數(shù)據(jù)倉(cāng)庫(kù)劃分為不同的層級(jí),每個(gè)層級(jí)有不同的功能和用途。
圖片
ODS層
Operation Data Store 數(shù)據(jù)準(zhǔn)備區(qū),也稱為貼源層。數(shù)據(jù)倉(cāng)庫(kù)源頭系統(tǒng)的數(shù)據(jù)表通常會(huì)原封不動(dòng)的存儲(chǔ)一份,這稱為ODS層,是后續(xù)數(shù)據(jù)倉(cāng)庫(kù)加工數(shù)據(jù)的來(lái)源。
DWD層
data warehouse details 細(xì)節(jié)數(shù)據(jù)層,是業(yè)務(wù)層與數(shù)據(jù)倉(cāng)庫(kù)的隔離層。主要對(duì)ODS數(shù)據(jù)層做一些數(shù)據(jù)清洗和規(guī)范化的操作,數(shù)據(jù)清洗:去除空值、臟數(shù)據(jù)、超過(guò)極限范圍的
DWS層
data warehouse service 數(shù)據(jù)服務(wù)層,基于DWD上的基礎(chǔ)數(shù)據(jù),整合匯總成分析某一個(gè)主題域的服務(wù)數(shù)據(jù)層,一般是寬表。用于提供后續(xù)的業(yè)務(wù)查詢,OLAP分析,數(shù)據(jù)分發(fā)等。
- 用戶行為,輕度聚合
- 主要對(duì)ODS/DWD層數(shù)據(jù)做一些輕度的匯總。
注意:數(shù)倉(cāng)層內(nèi)部的劃分不是為了分層而分層,它是數(shù)據(jù)倉(cāng)庫(kù)經(jīng)過(guò)了建模和 ETL 之后真正開始對(duì)外提供服務(wù)的地方,因此數(shù)倉(cāng)層內(nèi)的劃分更應(yīng)該符合使用者的思維習(xí)慣。DW 內(nèi)的分層沒(méi)有最正確的,只有最適合你的。
命名規(guī)范
圖片
系統(tǒng)架構(gòu)
經(jīng)過(guò)前面的技術(shù)選型,以及分層定義,我們最終架構(gòu)如下
圖片
數(shù)據(jù)查詢
假設(shè)語(yǔ)句已經(jīng)同步到doris,那么怎么進(jìn)行展現(xiàn),這里有很多種方式,比如通過(guò)BI工具,例如:power bi、dataEase、Davinci等,同時(shí)Doris 支持mysql 協(xié)議,我們?yōu)榱俗屩暗臉I(yè)務(wù)改動(dòng),對(duì)后端接口實(shí)現(xiàn)進(jìn)行了替換,通過(guò) mybatis 動(dòng)態(tài)解析 sql,并調(diào)用 doris進(jìn)行查詢,架構(gòu)如下
圖片
示例介紹
Flink實(shí)時(shí)同步
具體查看鋒哥的文章,https://mp.weixin.qq.com/s/ssXocqCyoSVuRFBi2hzCKQ
DolphinScheduler準(zhǔn)實(shí)時(shí)同步
同步業(yè)務(wù)數(shù)據(jù)庫(kù)mysql中register表至doris的ods_test_mysql_register_s表中,并對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行刪除
1. 創(chuàng)建datax文件
在資源中心創(chuàng)建各個(gè)團(tuán)隊(duì)文件夾,并在文件夾中創(chuàng)建對(duì)應(yīng)datax文件
圖片
2. 創(chuàng)建任務(wù)
進(jìn)入項(xiàng)目管理/工作流定義目錄,點(diǎn)擊創(chuàng)建工作流
圖片
選擇shell任務(wù),worker分區(qū)選擇datax,
datax組為自行創(chuàng)建,實(shí)際配置時(shí),以本地執(zhí)行環(huán)境為準(zhǔn)
圖片
選擇資源,并編寫datax啟動(dòng)命令
圖片
如果遷移完,需要進(jìn)行原數(shù)據(jù)刪除,則新建sql任務(wù),編寫sql語(yǔ)句,進(jìn)行清理
圖片
3. 依賴關(guān)系創(chuàng)建
第一步進(jìn)行datax數(shù)據(jù)同步第二步進(jìn)行原數(shù)據(jù)清理,如下圖連線就是依賴關(guān)系
圖片
4. 全局參數(shù)設(shè)置
參數(shù)可以設(shè)置為動(dòng)態(tài)參數(shù),這里為了測(cè)試方便為固定值
例如:$[yyyy-MM-dd 00:00:00-15] 表示前15天,具體參考dolphinscheduler內(nèi)置參數(shù)說(shuō)明
圖片
5. 啟動(dòng)任務(wù)
首選點(diǎn)擊對(duì)應(yīng)任務(wù)進(jìn)行上線,在配置定時(shí)任務(wù),如果測(cè)試連通性,則點(diǎn)擊啟動(dòng)按鈕可以立即測(cè)試