實(shí)時(shí)數(shù)倉(cāng)在滴滴的實(shí)踐和落地
點(diǎn)擊上方“數(shù)據(jù)管道”,選擇“置頂星標(biāo)”公眾號(hào)
干貨福利,第一時(shí)間送達(dá)

桔妹導(dǎo)讀:隨著滴滴業(yè)務(wù)的高速發(fā)展,業(yè)務(wù)對(duì)于數(shù)據(jù)時(shí)效性的需求越來(lái)越高,而伴隨著實(shí)時(shí)技術(shù)的不斷發(fā)展和成熟,滴滴也對(duì)實(shí)時(shí)建設(shè)做了大量的嘗試和實(shí)踐。本文主要以順風(fēng)車這個(gè)業(yè)務(wù)為引子,從引擎?zhèn)取⑵脚_(tái)側(cè)和業(yè)務(wù)側(cè)各個(gè)不同方面,來(lái)闡述滴滴所做的工作,分享在建設(shè)過(guò)程中的經(jīng)驗(yàn)。
實(shí)時(shí)數(shù)倉(cāng)建設(shè)目的

隨著互聯(lián)網(wǎng)的發(fā)展進(jìn)入下半場(chǎng),數(shù)據(jù)的時(shí)效性對(duì)企業(yè)的精細(xì)化運(yùn)營(yíng)越來(lái)越重要,商場(chǎng)如戰(zhàn)場(chǎng),在每天產(chǎn)生的海量數(shù)據(jù)中,如何能實(shí)時(shí)有效的挖掘出有價(jià)值的信息, 對(duì)企業(yè)的決策運(yùn)營(yíng)策略調(diào)整有很大幫助。
其次從智能商業(yè)的角度來(lái)講,數(shù)據(jù)的結(jié)果代表了用戶的反饋,獲取結(jié)果的及時(shí)性就顯得尤為重要,快速的獲取數(shù)據(jù)反饋能夠幫助公司更快的做出決策,更好的進(jìn)行產(chǎn)品迭代,實(shí)時(shí)數(shù)倉(cāng)在這一過(guò)程中起到了不可替代的作用。
▍1.1?解決傳統(tǒng)數(shù)倉(cāng)的問(wèn)題
從目前數(shù)倉(cāng)建設(shè)的現(xiàn)狀來(lái)看,實(shí)時(shí)數(shù)倉(cāng)是一個(gè)容易讓人產(chǎn)生混淆的概念,根據(jù)傳統(tǒng)經(jīng)驗(yàn)分析,數(shù)倉(cāng)有一個(gè)重要的功能,即能夠記錄歷史。通常,數(shù)倉(cāng)都是希望從業(yè)務(wù)上線的第一天開(kāi)始有數(shù)據(jù),然后一直記錄到現(xiàn)在。但實(shí)時(shí)流處理技術(shù),又是強(qiáng)調(diào)當(dāng)前處理狀態(tài)的一個(gè)技術(shù),結(jié)合當(dāng)前一線大廠的建設(shè)經(jīng)驗(yàn)和滴滴在該領(lǐng)域的建設(shè)現(xiàn)狀,我們嘗試把公司內(nèi)實(shí)時(shí)數(shù)倉(cāng)建設(shè)的目的定位為,以數(shù)倉(cāng)建設(shè)理論和實(shí)時(shí)技術(shù),解決由于當(dāng)前離線數(shù)倉(cāng)數(shù)據(jù)時(shí)效性低解決不了的問(wèn)題。
現(xiàn)階段我們要建設(shè)實(shí)時(shí)數(shù)倉(cāng)的主要原因是:
公司業(yè)務(wù)對(duì)于數(shù)據(jù)的實(shí)時(shí)性越來(lái)越迫切,需要有實(shí)時(shí)數(shù)據(jù)來(lái)輔助完成決策 實(shí)時(shí)數(shù)據(jù)建設(shè)沒(méi)有規(guī)范,數(shù)據(jù)可用性較差,無(wú)法形成數(shù)倉(cāng)體系,資源大量浪費(fèi) 數(shù)據(jù)平臺(tái)工具對(duì)整體實(shí)時(shí)開(kāi)發(fā)的支持也日漸趨于成熟,開(kāi)發(fā)成本降低
▍1.2?實(shí)時(shí)數(shù)倉(cāng)的應(yīng)用場(chǎng)景
實(shí)時(shí)OLAP分析:OLAP分析本身就是數(shù)倉(cāng)領(lǐng)域重點(diǎn)解決的問(wèn)題,基于公司大數(shù)據(jù)架構(gòu)團(tuán)隊(duì)提供的基于Flink計(jì)算引擎的stream sql工具,kafka和ddmq(滴滴自研)等消息中間件,druid和ClickHouse等OLAP數(shù)據(jù)庫(kù),提升數(shù)倉(cāng)的時(shí)效性能力,使其具有較優(yōu)的實(shí)時(shí)數(shù)據(jù)分析能力。 實(shí)時(shí)數(shù)據(jù)看板:這類場(chǎng)景是目前公司實(shí)時(shí)側(cè)主要需求場(chǎng)景,例如“全民拼車日”訂單和券花銷實(shí)時(shí)大屏曲線展示,順風(fēng)車新開(kāi)城當(dāng)日分鐘級(jí)訂單側(cè)核心指標(biāo)數(shù)據(jù)展示,增長(zhǎng)類項(xiàng)目資源投入和收益實(shí)時(shí)效果展示等。 實(shí)時(shí)業(yè)務(wù)監(jiān)控:滴滴出行大量核心業(yè)務(wù)指標(biāo)需要具備實(shí)時(shí)監(jiān)控能力,比如安全指標(biāo)監(jiān)控,財(cái)務(wù)指標(biāo)監(jiān)控,投訴進(jìn)線指標(biāo)監(jiān)控等。 實(shí)時(shí)數(shù)據(jù)接口服務(wù):由于各業(yè)務(wù)線之間存在很多業(yè)務(wù)壁壘,導(dǎo)致數(shù)倉(cāng)開(kāi)發(fā)很難熟悉公司內(nèi)全部業(yè)務(wù)線,需要與各業(yè)務(wù)線相關(guān)部門在數(shù)據(jù)加工和數(shù)據(jù)獲取方面進(jìn)行協(xié)作,數(shù)倉(cāng)通過(guò)提供實(shí)時(shí)數(shù)據(jù)接口服務(wù)的方式,向業(yè)務(wù)方提供數(shù)據(jù)支持。

2.?

在公司內(nèi)部,我們數(shù)據(jù)團(tuán)隊(duì)有幸與順風(fēng)車業(yè)務(wù)線深入合作,在滿足業(yè)務(wù)方實(shí)時(shí)數(shù)據(jù)需求的同時(shí),不斷完善實(shí)時(shí)數(shù)倉(cāng)內(nèi)容,通過(guò)多次迭代,基本滿足了順風(fēng)車業(yè)務(wù)方在實(shí)時(shí)側(cè)的各類業(yè)務(wù)需求,初步建立起順風(fēng)車實(shí)時(shí)數(shù)倉(cāng),完成了整體數(shù)據(jù)分層,包含明細(xì)數(shù)據(jù)和匯總數(shù)據(jù),統(tǒng)一了DWD層,降低了大數(shù)據(jù)資源消耗,提高了數(shù)據(jù)復(fù)用性,可對(duì)外輸出豐富的數(shù)據(jù)服務(wù)。
數(shù)倉(cāng)具體架構(gòu)如下圖所示:

從數(shù)據(jù)架構(gòu)圖來(lái)看,順風(fēng)車實(shí)時(shí)數(shù)倉(cāng)和對(duì)應(yīng)的離線數(shù)倉(cāng)有很多類似的地方。例如分層結(jié)構(gòu);比如ODS層,明細(xì)層,匯總層,乃至應(yīng)用層,他們命名的模式可能都是一樣的。但仔細(xì)比較不難發(fā)現(xiàn),兩者有很多區(qū)別:
與離線數(shù)倉(cāng)相比,實(shí)時(shí)數(shù)倉(cāng)的層次更少一些
從目前建設(shè)離線數(shù)倉(cāng)的經(jīng)驗(yàn)來(lái)看,數(shù)倉(cāng)的數(shù)據(jù)明細(xì)層內(nèi)容會(huì)非常豐富,處理明細(xì)數(shù)據(jù)外一般還會(huì)包含輕度匯總層的概念,另外離線數(shù)倉(cāng)中應(yīng)用層數(shù)據(jù)在數(shù)倉(cāng)內(nèi)部,但實(shí)時(shí)數(shù)倉(cāng)中,app應(yīng)用層數(shù)據(jù)已經(jīng)落入應(yīng)用系統(tǒng)的存儲(chǔ)介質(zhì)中,可以把該層與數(shù)倉(cāng)的表分離。
應(yīng)用層少建設(shè)的好處:實(shí)時(shí)處理數(shù)據(jù)的時(shí)候,每建一個(gè)層次,數(shù)據(jù)必然會(huì)產(chǎn)生一定的延遲。
匯總層少建的好處:在匯總統(tǒng)計(jì)的時(shí)候,往往為了容忍一部分?jǐn)?shù)據(jù)的延遲,可能會(huì)人為的制造一些延遲來(lái)保證數(shù)據(jù)的準(zhǔn)確。舉例,在統(tǒng)計(jì)跨天相關(guān)的訂單事件中的數(shù)據(jù)時(shí),可能會(huì)等到 00:00:05 或者 00:00:10再統(tǒng)計(jì),確保 00:00 前的數(shù)據(jù)已經(jīng)全部接受到位了,再進(jìn)行統(tǒng)計(jì)。所以,匯總層的層次太多的話,就會(huì)更大的加重人為造成的數(shù)據(jù)延遲。
與離線數(shù)倉(cāng)相比,實(shí)時(shí)數(shù)倉(cāng)的數(shù)據(jù)源存儲(chǔ)不同
在建設(shè)離線數(shù)倉(cāng)的時(shí)候,目前滴滴內(nèi)部整個(gè)離線數(shù)倉(cāng)都是建立在 Hive 表之上。但是,在建設(shè)實(shí)時(shí)數(shù)倉(cāng)的時(shí)候,同一份表,會(huì)使用不同的方式進(jìn)行存儲(chǔ)。比如常見(jiàn)的情況下,明細(xì)數(shù)據(jù)或者匯總數(shù)據(jù)都會(huì)存在 Kafka 里面,但是像城市、渠道等維度信息需要借助Hbase,mysql或者其他KV存儲(chǔ)等數(shù)據(jù)庫(kù)來(lái)進(jìn)行存儲(chǔ)。
接下來(lái),根據(jù)順風(fēng)車實(shí)時(shí)數(shù)倉(cāng)架構(gòu)圖,對(duì)每一層建設(shè)做具體展開(kāi):
▍2.1?ODS 貼源層建設(shè)
根據(jù)順風(fēng)車具體場(chǎng)景,目前順風(fēng)車數(shù)據(jù)源主要包括訂單相關(guān)的binlog日志,冒泡和安全相關(guān)的public日志,流量相關(guān)的埋點(diǎn)日志等。這些數(shù)據(jù)部分已采集寫入kafka或ddmq等數(shù)據(jù)通道中,部分?jǐn)?shù)據(jù)需要借助內(nèi)部自研同步工具完成采集,最終基于順風(fēng)車數(shù)倉(cāng)ods層建設(shè)規(guī)范分主題統(tǒng)一寫入kafka存儲(chǔ)介質(zhì)中。
命名規(guī)范:ODS層實(shí)時(shí)數(shù)據(jù)源主要包括兩種。
一種是在離線采集時(shí)已經(jīng)自動(dòng)生產(chǎn)的DDMQ或者是Kafka topic,這類型的數(shù)據(jù)命名方式為采集系統(tǒng)自動(dòng)生成規(guī)范為:cn-binlog-數(shù)據(jù)庫(kù)名-數(shù)據(jù)庫(kù)名 eg:cn-binlog-ihap_fangyuan-ihap_fangyuan
一種是需要自己進(jìn)行采集同步到kafka topic中,生產(chǎn)的topic命名規(guī)范同離線類似:ODS層采用:realtime_ods_binlog_{源系統(tǒng)庫(kù)/表名}/ods_log_{日志名} eg: realtime_ods_binlog_ihap_fangyuan
▍2.2 DWD 明細(xì)層建設(shè)
根據(jù)順風(fēng)車業(yè)務(wù)過(guò)程作為建模驅(qū)動(dòng),基于每個(gè)具體的業(yè)務(wù)過(guò)程特點(diǎn),構(gòu)建最細(xì)粒度的明細(xì)層事實(shí)表;結(jié)合順風(fēng)車分析師在離線側(cè)的數(shù)據(jù)使用特點(diǎn),將明細(xì)事實(shí)表的某些重要維度屬性字段做適當(dāng)冗余,完成寬表化處理,之后基于當(dāng)前順風(fēng)車業(yè)務(wù)方對(duì)實(shí)時(shí)數(shù)據(jù)的需求重點(diǎn),重點(diǎn)建設(shè)交易、財(cái)務(wù)、體驗(yàn)、安全、流量等幾大模塊;該層的數(shù)據(jù)來(lái)源于ODS層,通過(guò)大數(shù)據(jù)架構(gòu)提供的Stream SQL完成ETL工作,對(duì)于binlog日志的處理主要進(jìn)行簡(jiǎn)單的數(shù)據(jù)清洗、處理數(shù)據(jù)漂移和數(shù)據(jù)亂序,以及可能對(duì)多個(gè)ODS表進(jìn)行Stream Join,對(duì)于流量日志主要是做通用的ETL處理和針對(duì)順風(fēng)車場(chǎng)景的數(shù)據(jù)過(guò)濾,完成非結(jié)構(gòu)化數(shù)據(jù)的結(jié)構(gòu)化處理和數(shù)據(jù)的分流;該層的數(shù)據(jù)除了存儲(chǔ)在消息隊(duì)列Kafka中,通常也會(huì)把數(shù)據(jù)實(shí)時(shí)寫入Druid數(shù)據(jù)庫(kù)中,供查詢明細(xì)數(shù)據(jù)和作為簡(jiǎn)單匯總數(shù)據(jù)的加工數(shù)據(jù)源。
命名規(guī)范:DWD層的表命名使用英文小寫字母,單詞之間用下劃線分開(kāi),總長(zhǎng)度不能超過(guò)40個(gè)字符,并且應(yīng)遵循下述規(guī)則:realtime_dwd_{業(yè)務(wù)/pub}_{數(shù)據(jù)域縮寫}_[{業(yè)務(wù)過(guò)程縮寫}]_[{自定義表命名標(biāo)簽縮寫}]
{業(yè)務(wù)/pub}:參考業(yè)務(wù)命名
{數(shù)據(jù)域縮寫}:參考數(shù)據(jù)域劃分部分
{自定義表命名標(biāo)簽縮寫}:實(shí)體名稱可以根據(jù)數(shù)據(jù)倉(cāng)庫(kù)轉(zhuǎn)換整合后做一定的業(yè)務(wù)抽象的名稱,該名稱應(yīng)該準(zhǔn)確表述實(shí)體所代表的業(yè)務(wù)含義
樣例:realtime_dwd_trip_trd_order_base??
▍2.3 DIM 層
公共維度層,基于維度建模理念思想,建立整個(gè)業(yè)務(wù)過(guò)程的一致性維度,降低數(shù)據(jù)計(jì)算口徑和算法不統(tǒng)一風(fēng)險(xiǎn);
DIM 層數(shù)據(jù)來(lái)源于兩部分:一部分是Flink程序?qū)崟r(shí)處理ODS層數(shù)據(jù)得到,另外一部分是通過(guò)離線任務(wù)出倉(cāng)得到;
DIM 層維度數(shù)據(jù)主要使用 MySQL、Hbase、fusion(滴滴自研KV存儲(chǔ))?三種存儲(chǔ)引擎,對(duì)于維表數(shù)據(jù)比較少的情況可以使用 MySQL,對(duì)于單條數(shù)據(jù)大小比較小,查詢 QPS 比較高的情況,可以使用 fusion 存儲(chǔ),降低機(jī)器內(nèi)存資源占用,對(duì)于數(shù)據(jù)量比較大,對(duì)維表數(shù)據(jù)變化不是特別敏感的場(chǎng)景,可以使用HBase 存儲(chǔ)。
命名規(guī)范:DIM層的表命名使用英文小寫字母,單詞之間用下劃線分開(kāi),總長(zhǎng)度不能超過(guò)30個(gè)字符,并且應(yīng)遵循下述規(guī)則:dim_{業(yè)務(wù)/pub}_{維度定義}[_{自定義命名標(biāo)簽}]:
{業(yè)務(wù)/pub}:參考業(yè)務(wù)命名
{維度定義}:參考維度命名
{自定義表命名標(biāo)簽縮寫}:實(shí)體名稱可以根據(jù)數(shù)據(jù)倉(cāng)庫(kù)轉(zhuǎn)換整合后做一定的業(yè)務(wù)抽象的名稱,該名稱應(yīng)該準(zhǔn)確表述實(shí)體所代表的業(yè)務(wù)含義
樣例:dim_trip_dri_base
▍2.4?DWM 匯總層建設(shè)
在建設(shè)順風(fēng)車實(shí)時(shí)數(shù)倉(cāng)的匯總層的時(shí)候,跟順風(fēng)車離線數(shù)倉(cāng)有很多一樣的地方,但其具體技術(shù)實(shí)現(xiàn)會(huì)存在很大不同。
第一:對(duì)于一些共性指標(biāo)的加工,比如pv,uv,訂單業(yè)務(wù)過(guò)程指標(biāo)等,我們會(huì)在匯總層進(jìn)行統(tǒng)一的運(yùn)算,確保關(guān)于指標(biāo)的口徑是統(tǒng)一在一個(gè)固定的模型中完成。對(duì)于一些個(gè)性指標(biāo),從指標(biāo)復(fù)用性的角度出發(fā),確定唯一的時(shí)間字段,同時(shí)該字段盡可能與其他指標(biāo)在時(shí)間維度上完成拉齊,例如行中異常訂單數(shù)需要與交易域指標(biāo)在事件時(shí)間上做到拉齊。
第二:在順風(fēng)車匯總層建設(shè)中,需要進(jìn)行多維的主題匯總,因?yàn)閷?shí)時(shí)數(shù)倉(cāng)本身是面向主題的,可能每個(gè)主題會(huì)關(guān)心的維度都不一樣,所以需要在不同的主題下,按照這個(gè)主題關(guān)心的維度對(duì)數(shù)據(jù)進(jìn)行匯總,最后來(lái)算業(yè)務(wù)方需要的匯總指標(biāo)。在具體操作中,對(duì)于pv類指標(biāo)使用Stream SQL實(shí)現(xiàn)1分鐘匯總指標(biāo)作為最小匯總單位指標(biāo),在此基礎(chǔ)上進(jìn)行時(shí)間維度上的指標(biāo)累加;對(duì)于uv類指標(biāo)直接使用druid數(shù)據(jù)庫(kù)作為指標(biāo)匯總?cè)萜?,根?jù)業(yè)務(wù)方對(duì)匯總指標(biāo)的及時(shí)性和準(zhǔn)確性的要求,實(shí)現(xiàn)相應(yīng)的精確去重和非精確去重。
第三:匯總層建設(shè)過(guò)程中,還會(huì)涉及到衍生維度的加工。在順風(fēng)車券相關(guān)的匯總指標(biāo)加工中我們使用Hbase的版本機(jī)制來(lái)構(gòu)建一個(gè)衍生維度的拉鏈表,通過(guò)事件流和Hbase維表關(guān)聯(lián)的方式得到實(shí)時(shí)數(shù)據(jù)當(dāng)時(shí)的準(zhǔn)確維度
命名規(guī)范:DWM層的表命名使用英文小寫字母,單詞之間用下劃線分開(kāi),總長(zhǎng)度不能超過(guò)40個(gè)字符,并且應(yīng)遵循下述規(guī)則:realtime_dwm_{業(yè)務(wù)/pub}_{數(shù)據(jù)域縮寫}_{數(shù)據(jù)主粒度縮寫}_[{自定義表命名標(biāo)簽縮寫}]_{統(tǒng)計(jì)時(shí)間周期范圍縮寫}:
{業(yè)務(wù)/pub}:參考業(yè)務(wù)命名
{數(shù)據(jù)域縮寫}:參考數(shù)據(jù)域劃分部分
{數(shù)據(jù)主粒度縮寫}:指數(shù)據(jù)主要粒度或數(shù)據(jù)域的縮寫,也是聯(lián)合主鍵中的主要維度
{自定義表命名標(biāo)簽縮寫}:實(shí)體名稱可以根據(jù)數(shù)據(jù)倉(cāng)庫(kù)轉(zhuǎn)換整合后做一定的業(yè)務(wù)抽象的名稱,該名稱應(yīng)該準(zhǔn)確表述實(shí)體所代表的業(yè)務(wù)含義
{統(tǒng)計(jì)時(shí)間周期范圍縮寫}:1d:天增量;td:天累計(jì)(全量);1h:小時(shí)增量;th:小時(shí)累計(jì)(全量);1min:分鐘增量;tmin:分鐘累計(jì)(全量)
樣例:realtime_dwm_trip_trd_pas_bus_accum_1min
▍2.5 APP 應(yīng)用層
該層主要的工作是把實(shí)時(shí)匯總數(shù)據(jù)寫入應(yīng)用系統(tǒng)的數(shù)據(jù)庫(kù)中,包括用于大屏顯示和實(shí)時(shí)OLAP的Druid數(shù)據(jù)庫(kù)(該數(shù)據(jù)庫(kù)除了寫入應(yīng)用數(shù)據(jù),也可以寫入明細(xì)數(shù)據(jù)完成匯總指標(biāo)的計(jì)算)中,用于實(shí)時(shí)數(shù)據(jù)接口服務(wù)的Hbase數(shù)據(jù)庫(kù),用于實(shí)時(shí)數(shù)據(jù)產(chǎn)品的mysql或者redis數(shù)據(jù)庫(kù)中。
命名規(guī)范:基于實(shí)時(shí)數(shù)倉(cāng)的特殊性不做硬性要求
順風(fēng)車實(shí)時(shí)數(shù)倉(cāng)建設(shè)成果

截止目前,一共為順風(fēng)車業(yè)務(wù)線建立了增長(zhǎng)、交易、體驗(yàn)、安全、財(cái)務(wù)五大模塊,涉及40+的實(shí)時(shí)看板,涵蓋順風(fēng)車全部核心業(yè)務(wù)過(guò)程,實(shí)時(shí)和離線數(shù)據(jù)誤差<0.5%,是順風(fēng)車業(yè)務(wù)線數(shù)據(jù)分析方面的有利補(bǔ)充,為順風(fēng)車當(dāng)天發(fā)券動(dòng)態(tài)策略調(diào)整,司乘安全相關(guān)監(jiān)控,實(shí)時(shí)訂單趨勢(shì)分析等提供了實(shí)時(shí)數(shù)據(jù)支持,提高了決策的時(shí)效性。同時(shí)建立在數(shù)倉(cāng)模型之上的實(shí)時(shí)指標(biāo)能根據(jù)用戶需求及時(shí)完成口徑變更和實(shí)時(shí)離線數(shù)據(jù)一致性校驗(yàn),大大提高了實(shí)時(shí)指標(biāo)的開(kāi)發(fā)效率和實(shí)時(shí)數(shù)據(jù)的準(zhǔn)確性,也為公司內(nèi)部大范圍建設(shè)實(shí)時(shí)數(shù)倉(cāng)提供了有力的理論和實(shí)踐支持。
實(shí)時(shí)數(shù)倉(cāng)建設(shè)對(duì)數(shù)據(jù)平臺(tái)的強(qiáng)依賴

目前公司內(nèi)部的實(shí)時(shí)數(shù)倉(cāng)建設(shè),需要依托數(shù)據(jù)平臺(tái)的能力才能真正完成落地,包括StreamSQL能力,數(shù)據(jù)夢(mèng)工程StreamSQL IDE環(huán)境和任務(wù)運(yùn)維組件,實(shí)時(shí)數(shù)據(jù)源元數(shù)據(jù)化功能等。

▍4.1 基于StreamSQL的實(shí)時(shí)數(shù)據(jù)需求開(kāi)發(fā)
描述性語(yǔ)言:業(yè)務(wù)方不需要關(guān)心底層實(shí)現(xiàn),只需要將業(yè)務(wù)邏輯描述出來(lái)即可。 接口穩(wěn)定:Flink 版本迭代過(guò)程中只要 SQL 語(yǔ)法不發(fā)生變化就非常穩(wěn)定。 問(wèn)題易排查:邏輯性較強(qiáng),用戶能看懂語(yǔ)法即可調(diào)查出錯(cuò)位置。 批流一體化:批處理主要是 HiveSQL 和 Spark SQL,如果 Flink 任務(wù)也使用 SQL 的話,批處理任務(wù)和流處理任務(wù)在語(yǔ)法等方面可以進(jìn)行共享,最終實(shí)現(xiàn)一體化的效果。
完善 DDL:包括上游的消息隊(duì)列、下游的消息隊(duì)列和各種存儲(chǔ)如 Druid、HBase 都進(jìn)行了打通,用戶方只需要構(gòu)建一個(gè) source 就可以將上游或者下游描述出來(lái)。
內(nèi)置消息格式解析:消費(fèi)數(shù)據(jù)后需要將數(shù)據(jù)進(jìn)行提取,但數(shù)據(jù)格式往往非常復(fù)雜,如數(shù)據(jù)庫(kù)日志 binlog,每個(gè)用戶單獨(dú)實(shí)現(xiàn),難度較大。StreamSQL 將提取庫(kù)名、表名、提取列等函數(shù)內(nèi)置,用戶只需創(chuàng)建 binlog 類型 source,并內(nèi)置了去重能力。對(duì)于 business log 業(yè)務(wù)日志 StreamSQL 內(nèi)置了提取日志頭,提取業(yè)務(wù)字段并組裝成 Map 的功能。對(duì)于 json 數(shù)據(jù),用戶無(wú)需自定義 UDF,只需通過(guò) jsonPath 指定所需字段。
擴(kuò)展UDX:豐富內(nèi)置 UDX,如對(duì) JSON、MAP 進(jìn)行了擴(kuò)展,這些在滴滴業(yè)務(wù)使用場(chǎng)景中較多。支持自定義 UDX,用戶自定義 UDF 并使用 jar 包即可。兼容 Hive UDX,例如用戶原來(lái)是一個(gè) Hive SQL 任務(wù),則轉(zhuǎn)換成實(shí)時(shí)任務(wù)不需要較多改動(dòng),有助于批流一體化。
②?維表 join 能力:維表支持 HBase、KVStore、Mysql 等,同時(shí)支持 inner、left、right、full join 等多種方式。
?
▍4.2 基于數(shù)據(jù)夢(mèng)工廠的StreamSQL IDE和任務(wù)運(yùn)維
StreamSQL IDE:
提供常用的SQL模板:在開(kāi)發(fā)流式 SQL 時(shí)不需要從零開(kāi)始,只需要選擇一個(gè) SQL 模板,并在這個(gè)模板之上進(jìn)行修修改改即可達(dá)到期望的結(jié)果
提供 UDF 的庫(kù):相當(dāng)于一個(gè)庫(kù)如果不知道具有什么含義以及如何使用,用戶只需要在 IDE 上搜索到這個(gè)庫(kù),就能夠找到使用說(shuō)明以及使用案例,提供語(yǔ)法檢測(cè)與智能提示
提供代碼在線DEBUG能力:可以上傳本地測(cè)試數(shù)據(jù)或者采樣少量 Kafka 等 source 數(shù)據(jù) debug,此功能對(duì)流計(jì)算任務(wù)非常重要。提供版本管理功能,可以在業(yè)務(wù)版本不斷升級(jí)過(guò)程中,提供任務(wù)回退功能。
任務(wù)運(yùn)維:任務(wù)運(yùn)維主要分為四個(gè)方面
日志檢索:Flink UI 上查詢?nèi)罩倔w驗(yàn)非常糟糕,滴滴將 Flink 任務(wù)日志進(jìn)行了采集,存儲(chǔ)在 ES 中,通過(guò) WEB 化的界面進(jìn)行檢索,方便調(diào)查。
指標(biāo)監(jiān)控:Flink 指標(biāo)較多,通過(guò) Flink UI 查看體驗(yàn)糟糕,因此滴滴構(gòu)建了一個(gè)外部的報(bào)表平臺(tái),可以對(duì)指標(biāo)進(jìn)行監(jiān)控。
報(bào)警:報(bào)警需要做一個(gè)平衡,如重啟報(bào)警有多類如 ( 機(jī)器宕機(jī)報(bào)警、代碼錯(cuò)誤報(bào)警 ),通過(guò)設(shè)置一天內(nèi)單個(gè)任務(wù)報(bào)警次數(shù)閾值進(jìn)行平衡,同時(shí)也包括存活報(bào)警 ( 如 kill、start )、延遲報(bào)警、重啟報(bào)警和 Checkpoint 頻繁失敗報(bào)警 ( 如 checkpoint 周期配置不合理 ) 等。
血緣追蹤:實(shí)時(shí)計(jì)算任務(wù)鏈路較長(zhǎng),從采集到消息通道,流計(jì)算,再到下游的存儲(chǔ)經(jīng)常包括4-5個(gè)環(huán)節(jié),如果無(wú)法實(shí)現(xiàn)追蹤,容易產(chǎn)生災(zāi)難性的問(wèn)題。例如發(fā)現(xiàn)某流式任務(wù)流量暴漲后,需要先查看其消費(fèi)的 topic 是否增加,topic 上游采集是否增加,采集的數(shù)據(jù)庫(kù) DB 是否產(chǎn)生不恰當(dāng)?shù)嘏坎僮骰蛘吣硞€(gè)業(yè)務(wù)在不斷增加日志。這類問(wèn)題需要從下游到上游、從上游到下游多方向的血緣追蹤,方便調(diào)查原因。
▍4.3 基于數(shù)據(jù)夢(mèng)工廠的實(shí)時(shí)數(shù)據(jù)源元數(shù)據(jù)化(meta化表)
將topic引入成實(shí)時(shí)表,metastore統(tǒng)一管理元數(shù)據(jù),實(shí)時(shí)開(kāi)發(fā)中統(tǒng)一管理DDL過(guò)程。對(duì)實(shí)時(shí)數(shù)倉(cāng)來(lái)說(shuō),通過(guò)元數(shù)據(jù)化,可以沉淀實(shí)時(shí)數(shù)倉(cāng)的建設(shè)成果,使數(shù)倉(cāng)建模能更好的落地
?

面臨的挑戰(zhàn)和解決方案思考

雖然目前滴滴在實(shí)時(shí)數(shù)倉(cāng)建設(shè)方面已初具規(guī)模,但其面臨的問(wèn)題也不容忽視。
▍5.1 實(shí)時(shí)數(shù)倉(cāng)研發(fā)規(guī)范
問(wèn)題:為了快速響應(yīng)業(yè)務(wù)需求,同時(shí)滿足數(shù)倉(cāng)的需求開(kāi)發(fā)流程,迫切需要建設(shè)一套面向?qū)崟r(shí)數(shù)據(jù)開(kāi)發(fā)的規(guī)范白皮書,該白皮書需要涉及需求對(duì)接、口徑梳理、數(shù)據(jù)開(kāi)發(fā)、任務(wù)發(fā)布、任務(wù)監(jiān)控、任務(wù)保障
目前解決方案:目前由數(shù)據(jù)BP牽頭,制定了一套面向?qū)崟r(shí)數(shù)據(jù)指標(biāo)的開(kāi)發(fā)規(guī)范:

常規(guī)流程:需求方提出需求,分析師對(duì)接需求,提供計(jì)算口徑,編寫需求文檔。之后由數(shù)倉(cāng)BP和離線數(shù)倉(cāng)同學(xué)check計(jì)算口徑,并向?qū)崟r(shí)數(shù)倉(cāng)團(tuán)隊(duì)提供離線hive表,實(shí)時(shí)數(shù)倉(cāng)同學(xué)基于離線hive表完成數(shù)據(jù)探查,基于實(shí)時(shí)數(shù)倉(cāng)模型完成實(shí)時(shí)數(shù)據(jù)需求開(kāi)發(fā),通過(guò)離線口徑完成數(shù)據(jù)自查,最終交付給分析師完成二次校驗(yàn)后指標(biāo)上線。
口徑變更--業(yè)務(wù)方發(fā)起:業(yè)務(wù)方發(fā)起口徑變更,判斷是否涉及到實(shí)時(shí)指標(biāo),數(shù)倉(cāng)BP對(duì)離線和實(shí)時(shí)口徑進(jìn)行拉齊,向離線數(shù)倉(cāng)團(tuán)隊(duì)和實(shí)時(shí)數(shù)倉(cāng)團(tuán)隊(duì)提供更口口徑和數(shù)據(jù)源表,實(shí)時(shí)數(shù)倉(cāng)團(tuán)隊(duì)先上測(cè)試看板,驗(yàn)收通過(guò)后切換到正式看板
存在的不足:
當(dāng)針對(duì)某個(gè)業(yè)務(wù)進(jìn)行新的實(shí)時(shí)數(shù)據(jù)建設(shè)時(shí),會(huì)有一個(gè)比較艱難的初始化過(guò)程,這個(gè)初始化過(guò)程中,會(huì)和離線有較多耦和,需要確定指標(biāo)口徑,數(shù)據(jù)源,并進(jìn)行大量開(kāi)發(fā)測(cè)試工作?
在指標(biāo)口徑發(fā)生變更的時(shí)候,需要有一個(gè)較好的通知機(jī)制,目前還是從人的角度來(lái)進(jìn)行判斷。
▍5.2 離線和實(shí)時(shí)數(shù)據(jù)一致性保證
目前解決辦法:由業(yè)務(wù)、BP、離線數(shù)倉(cāng)共同保證數(shù)據(jù)源、計(jì)算口徑與離線一致,數(shù)據(jù)加工過(guò)程,逐層與離線進(jìn)行數(shù)據(jù)比對(duì),并對(duì)指標(biāo)結(jié)果進(jìn)行詳細(xì)測(cè)試,數(shù)據(jù)校驗(yàn)通過(guò)并上線后,根據(jù)離線周期進(jìn)行實(shí)時(shí)和離線數(shù)據(jù)的校驗(yàn)

待解決的問(wèn)題:結(jié)合指標(biāo)管理工具,保證指標(biāo)口徑上的一致性,擴(kuò)展數(shù)據(jù)夢(mèng)工廠功能,在指標(biāo)加工過(guò)程中,增加實(shí)時(shí)離線比對(duì)功能,降低數(shù)據(jù)比對(duì)成本。
6.?
未來(lái)展望—批流一體化

雖然 Flink 具備批流一體化能力,但滴滴目前并沒(méi)有完全批流一體化,希望先從產(chǎn)品層面實(shí)現(xiàn)批流一體化。通過(guò) Meta 化建設(shè),實(shí)現(xiàn)整個(gè)滴滴只有一個(gè) MetaStore,無(wú)論是 Hive、Kafka topic、還是下游的 HBase、ES 都定義到 MetaStore 中,所有的計(jì)算引擎包括 Hive、Spark、Presto、Flink 都查詢同一個(gè) MetaStore,實(shí)現(xiàn)整個(gè) SQL 開(kāi)發(fā)完全一致的效果。根據(jù) SQL 消費(fèi)的 Source 是表還是流,來(lái)區(qū)分批處理任務(wù)和流處理任務(wù),從產(chǎn)品層面上實(shí)現(xiàn)批流一體化效果。


本文內(nèi)容涉及三個(gè)滴滴云平臺(tái)事業(yè)群團(tuán)隊(duì),云平臺(tái)事業(yè)部大數(shù)據(jù)架構(gòu)團(tuán)隊(duì),主要負(fù)責(zé)大數(shù)據(jù)底層引擎的建設(shè),建設(shè)并維護(hù)公司內(nèi)部,離線、OLAP、實(shí)時(shí)、保障等底層引擎。云平臺(tái)事業(yè)部大數(shù)據(jù)平臺(tái)部,主要負(fù)責(zé)公司內(nèi)部通用平臺(tái)建設(shè),包括一站式開(kāi)發(fā)平臺(tái),內(nèi)置業(yè)界沉淀多年的數(shù)據(jù)開(kāi)發(fā)流程及規(guī)范,滿足用戶對(duì)數(shù)據(jù)開(kāi)發(fā)、數(shù)據(jù)安全、質(zhì)量管理、數(shù)據(jù)管理需求。云平臺(tái)事業(yè)部實(shí)時(shí)數(shù)倉(cāng)團(tuán)隊(duì),主要負(fù)責(zé)滴滴內(nèi)部各業(yè)務(wù)線的實(shí)時(shí)數(shù)據(jù)建設(shè)、以及實(shí)時(shí)數(shù)據(jù)規(guī)范的沉淀,中間層的數(shù)據(jù)建設(shè)等。
