Categories
程式開發

實時數倉在滴滴的落地實踐


1. 實時數倉建設目的

隨著互聯網的發展進入下半場,數據的時效性對企業的精細化運營越來越重要,商場如戰場,在每天產生的海量數據中,如何能實時有效的挖掘出有價值的信息, 對企業的決策運營策略調整有很大幫助。

其次從智能商業的角度來講,數據的結果代表了用戶的反饋,獲取結果的及時性就顯得尤為重要,快速的獲取數據反饋能夠幫助公司更快的做出決策,更好的進行產品迭代,實時數倉在這一過程中起到了不可替代的作用。

1.1 解決傳統數倉的問題

從目前數倉建設的現狀來看,實時數倉是一個容易讓人產生混淆的概念,根據傳統經驗分析,數倉有一個重要的功能,即能夠記錄歷史。通常,數倉都是希望從業務上線的第一天開始有數據,然後一直記錄到現在。但實時流處理技術,又是強調當前處理狀態的一個技術,結合當前一線大廠的建設經驗和滴滴在該領域的建設現狀,我們嘗試把公司內實時數倉建設的目的定位為,以數倉建設理論和實時技術,解決由於當前離線數倉數據時效性低解決不了的問題。

現階段我們要建設實時數倉的主要原因是:

  • 公司業務對於數據的實時性越來越迫切,需要有實時數據來輔助完成決策
  • 實時數據建設沒有規範,數據可用性較差,無法形成數倉體系,資源大量浪費
  • 數據平台工具對整體實時開發的支持也日漸趨於成熟,開發成本降低

1.2 實時數倉的應用場景

  • 實時OLAP分析:OLAP分析本身就是數倉領域重點解決的問題,基於公司大數據架構團隊提供的基於Flink計算引擎的stream sql工具,kafka和ddmq(滴滴自研)等消息中間件,druid和ClickHouse等OLAP數據庫,提升數倉的時效性能力,使其具有較優的實時數據分析能力。
  • 實時數據看板:這類場景是目前公司實時側主要需求場景,例如“全民拼車日”訂單和券花銷實時大屏曲線展示,順風車新開城當日分鐘級訂單側核心指標數據展示,增長類項目資源投入和收益實時效果展示等。
  • 實時業務監控:滴滴出行大量核心業務指標需要具備實時監控能力,比如安全指標監控,財務指標監控,投訴進線指標監控等。
  • 實時數據接口服務:由於各業務線之間存在很多業務壁壘,導致數倉開發很難熟悉公司內全部業務線,需要與各業務線相關部門在數據加工和數據獲取方面進行協作,數倉通過提供實時數據接口服務的方式,向業務方提供數據支持。

實時數倉在滴滴的落地實踐 1

2. 滴滴順風車實時數倉建設舉例

在公司內部,我們數據團隊有幸與順風車業務線深入合作,在滿足業務方實時數據需求的同時,不斷完善實時數倉內容,通過多次迭代,基本滿足了順風車業務方在實時側的各類業務需求,初步建立起順風車實時數倉,完成了整體數據分層,包含明細數據和匯總數據,統一了DWD層,降低了大數據資源消耗,提高了數據復用性,可對外輸出豐富的數據服務。

數倉具體架構如下圖所示

實時數倉在滴滴的落地實踐 2

‍從數據架構圖來看,順風車實時數倉和對應的離線數倉有很多類似的地方。例如分層結構;比如ODS層,明細層,匯總層,乃至應用層,他們命名的模式可能都是一樣的。但仔細比較不難發現,兩者有很多區別:

  • 與離線數倉相比,實時數倉的層次更少一些
  • 從目前建設離線數倉的經驗來看,數倉的數據明細層內容會非常豐富,處理明細數據外一般還會包含輕度匯總層的概念,另外離線數倉中應用層數據在數倉內部,但實時數倉中,app應用層數據已經落入應用系統的存儲介質中,可以把該層與數倉的表分離。
  • 應用層少建設的好處:實時處理數據的時候,每建一個層次,數據必然會產生一定的延遲。
  • 匯總層少建的好處:在匯總統計的時候,往往為了容忍一部分數據的延遲,可能會人為的製造一些延遲來保證數據的準確。舉例,在統計跨天相關的訂單事件中的數據時,可能會等到00:00:05 或者00:00:10再統計,確保00:00 前的數據已經全部接受到位了,再進行統計。所以,匯總層的層次太多的話,就會更大的加重人為造成的數據延遲。
  • 與離線數倉相比,實時數倉的數據源存儲不同
  • 在建設離線數倉的時候,目前滴滴內部整個離線數倉都是建立在Hive 表之上。但是,在建設實時數倉的時候,同一份表,會使用不同的方式進行存儲。比如常見的情況下,明細數據或者匯總數據都會存在Kafka 裡面,但是像城市、渠道等維度信息需要藉助Hbase,mysql或者其他KV存儲等數據庫來進行存儲。

接下來,根據順風車實時數倉架構圖,對每一層建設做具體展開

2.1 ODS 貼源層建設

根據順風車具體場景,目前順風車數據源主要包括訂單相關的binlog日誌,冒泡和安全相關的public日誌,流量相關的埋點日誌等。這些數據部分已採集寫入kafka或ddmq等數據通道中,部分數據需要藉助內部自研同步工具完成採集,最終基於順風車數倉ods層建設規範分主題統一寫入kafka存儲介質中。

命名規範: ODS層實時數據源主要包括兩種。

  • 一種是在離線採集時已經自動生產的DDMQ或者是Kafka topic,這類型的數據命名方式為採集系統自動生成規範為:cn-binlog-數據庫名-數據庫名eg:cn-binlog-ihap_fangyuan-ihap_fangyuan
  • 一種是需要自己進行採集同步到kafka topic中,生產的topic命名規範同離線類似:ODS層採用:realtime_ods_binlog_{源系統庫/表名}/ods_log_{日誌名} eg: realtime_ods_binlog_ihap_fangyuan

2.2 DWD 明細層建設

根據順風車業務過程作為建模驅動,基於每個具體的業務過程特點,構建最細粒度的明細層事實表;結合順風車分析師在離線側的數據使用特點,將明細事實表的某些重要維度屬性字段做適當冗餘,完成寬表化處理,之後基於當前順風車業務方對實時數據的需求重點,重點建設交易、財務、體驗、安全、流量等幾大模塊;該層的數據來源於ODS層,通過大數據架構提供的Stream SQL完成ETL工作,對於binlog日誌的處理主要進行簡單的數據清洗、處理數據漂移和數據亂序,以及可能對多個ODS表進行Stream Join,對於流量日誌主要是做通用的ETL處理和針對順風車場景的數據過濾,完成非結構化數據的結構化處理和數據的分流;該層的數據除了存儲在消息隊列Kafka中,通常也會把數據實時寫入Druid數據庫中,供查詢明細數據和作為簡單匯總數據的加工數據源。

命名規範: DWD層的表命名使用英文小寫字母,單詞之間用下劃線分開,總長度不能超過40個字符,並且應遵循下述規則:realtime_dwd_{業務/pub}{數據域縮寫}[{业务过程缩写}]_[{自定义表命名标签缩写}]

  • {業務/pub}:參考業務命名
  • {數據域縮寫}:參考數據域劃分部分
  • {自定義表命名標籤縮寫}:實體名稱可以根據數據倉庫轉換整合後做一定的業務抽象的名稱,該名稱應該準確表述實體所代表的業務含義

樣例:realtime_dwd_trip_trd_order_base

2.3 DIM 層

  • 公共維度層,基於維度建模理念思想,建立整個業務過程的一致性維度,降低數據計算口徑和算法不統一風險;
  • DIM 層數據來源於兩部分:一部分是Flink程序實時處理ODS層數據得到,另外一部分是通過離線任務出倉得到;
  • DIM 層維度數據主要使用MySQL、Hbase、fusion(滴滴自研KV存儲) 三種存儲引擎,對於維表數據比較少的情況可以使用MySQL,對於單條數據大小比較小,查詢QPS 比較高的情況,可以使用fusion 存儲,降低機器內存資源佔用,對於數據量比較大,對維表數據變化不是特別敏感的場景,可以使用HBase 存儲。

命名規範: DIM層的表命名使用英文小寫字母,單詞之間用下劃線分開,總長度不能超過30個字符,並且應遵循下述規則:dim_{業務/pub}{維度定義}[{自定义命名标签}]:

  • {業務/pub}:參考業務命名
  • {維度定義}:參考維度命名
  • {自定義表命名標籤縮寫}:實體名稱可以根據數據倉庫轉換整合後做一定的業務抽象的名稱,該名稱應該準確表述實體所代表的業務含義

樣例:dim_trip_dri_base

2.4 DWM 匯總層建設

在建設順風車實時數倉的匯總層的時候,跟順風車離線數倉有很多一樣的地方,但其具體技術實現會存在很大不同。

第一:對於一些共性指標的加工,比如pv,uv,訂單業務過程指標等,我們會在匯總層進行統一的運算,確保關於指標的口徑是統一在一個固定的模型中完成。對於一些個性指標,從指標復用性的角度出發,確定唯一的時間字段,同時該字段盡可能與其他指標在時間維度上完成拉齊,例如行中異常訂單數需要與交易域指標在事件時間上做到拉齊。

第二:在順風車匯總層建設中,需要進行多維的主題匯總,因為實時數倉本身是面向主題的,可能每個主題會關心的維度都不一樣,所以需要在不同的主題下,按照這個主題關心的維度對數據進行匯總,最後來算業務方需要的匯總指標。在具體操作中,對於pv類指標使用Stream SQL實現1分鐘匯總指標作為最小匯總單位指標,在此基礎上進行時間維度上的指標累加;對於uv類指標直接使用druid數據庫作為指標匯總容器,根據業務方對匯總指標的及時性和準確性的要求,實現相應的精確去重和非精確去重。

第三:匯總層建設過程中,還會涉及到衍生維度的加工。在順風車券相關的匯總指標加工中我們使用Hbase的版本機制來構建一個衍生維度的拉鍊表,通過事件流和Hbase維表關聯的方式得到實時數據當時的準確維度

命名規範: DWM層的表命名使用英文小寫字母,單詞之間用下劃線分開,總長度不能超過40個字符,並且應遵循下述規則:realtime_dwm_{業務/pub}{數據域縮寫}{數據主粒度縮寫}[{自定义表命名标签缩写}]{統計時間週期範圍縮寫}:

  • {業務/pub}:參考業務命名
  • {數據域縮寫}:參考數據域劃分部分
  • {數據主粒度縮寫}:指數據主要粒度或數據域的縮寫,也是聯合主鍵中的主要維度
  • {自定義表命名標籤縮寫}:實體名稱可以根據數據倉庫轉換整合後做一定的業務抽象的名稱,該名稱應該準確表述實體所代表的業務含義
  • {統計時間週期範圍縮寫}:1d:天增量;td:天累計(全量);1h:小時增量;th:小時累計(全量);1min:分鐘增量;tmin:分鐘累計(全量)

樣例:realtime_dwm_trip_trd_pas_bus_accum_1min

2.5 APP 應用層

該層主要的工作是把實時匯總數據寫入應用系統的數據庫中,包括用於大屏顯示和實時OLAP的Druid數據庫(該數據庫除了寫入應用數據,也可以寫入明細數據完成匯總指標的計算)中,用於實時數據接口服務的Hbase數據庫,用於實時數據產品的mysql或者redis數據庫中。

命名規範: 基於實時數倉的特殊性不做硬性要求‍

3. 順風車實時數倉建設成果

截止目前,一共為順風車業務線建立了增長、交易、體驗、安全、財務五大模塊,涉及40+的實時看板,涵蓋順風車全部核心業務過程,實時和離線數據誤差<0.5%,是順風車業務線數據分析方面的有利補充,為順風車當天發券動態策略調整,司乘安全相關監控,實時訂單趨勢分析等提供了實時數據支持,提高了決策的時效性。同時建立在數倉模型之上的實時指標能根據用戶需求及時完成口徑變更和實時離線數據一致性校驗,大大提高了實時指標的開發效率和實時數據的準確性,也為公司內部大範圍建設實時數倉提供了有力的理論和實踐支持。

4. 實時數倉建設對數據平台的強依賴

目前公司內部的實時數倉建設,需要依托數據平台的能力才能真正完成落地,包括StreamSQL能力,數據夢工程StreamSQL IDE環境和任務運維組件,實時數據源元數據化功能等。

實時數倉在滴滴的落地實踐 3

4.1 基於StreamSQL的實時數據需求開發

‍StreamSQL是滴滴大數據引擎部在Flink SQL 基礎上完善後形成的一個產品。

使用StreamSQL 具有多個優勢

  • 描述性語言: 業務方不需要關心底層實現,只需要將業務邏輯描述出來即可。
  • 接口穩定: Flink 版本迭代過程中只要SQL 語法不發生變化就非常穩定。
  • 問題易排查: 邏輯性較強,用戶能看懂語法即可調查出錯位置。
  • 批流一體化: 批處理主要是HiveSQL 和Spark SQL,如果Flink 任務也使用SQL 的話,批處理任務和流處理任務在語法等方面可以進行共享,最終實現一體化的效果。

StreamSQL 相對於Flink SQL (1.9之前版本)的完善

  • 完善DDL: 包括上游的消息隊列、下游的消息隊列和各種存儲如Druid、HBase 都進行了打通,用戶方只需要構建一個source 就可以將上游或者下游描述出來。
  • 內置消息格式解析: 消費數據後需要將數據進行提取,但數據格式往往非常複雜,如數據庫日誌binlog,每個用戶單獨實現,難度較大。 StreamSQL 將提取庫名、表名、提取列等函數內置,用戶只需創建binlog 類型source,並內置了去重能力。對於business log 業務日誌StreamSQL 內置了提取日誌頭,提取業務字段並組裝成Map 的功能。對於json 數據,用戶無需自定義UDF,只需通過jsonPath 指定所需字段。
  • 擴展UDX: 豐富內置UDX,如對JSON、MAP 進行了擴展,這些在滴滴業務使用場景中較多。支持自定義UDX,用戶自定義UDF 並使用jar 包即可。兼容Hive UDX,例如用戶原來是一個Hive SQL 任務,則轉換成實時任務不需要較多改動,有助於批流一體化。

Join 能力擴展

① 基於TTL 的雙流join:在滴滴的流計算業務中有的join 操作數據對應的跨度比較長,例如順風車業務發單到接單的時間跨度可能達到一個星期左右,如果這些數據的join 基於內存操作並不可行,通常將join 數據放在狀態中,窗口通過TTL 實現,過期自動清理。

② 維表join 能力:維表支持HBase、KVStore、Mysql 等,同時支持inner、left、right、full join 等多種方式。

4.2 基於數據夢工廠的StreamSQL IDE和任務運維

StreamSQL IDE

  • 提供常用的SQL模板: 在開發流式SQL 時不需要從零開始,只需要選擇一個SQL 模板,並在這個模板之上進行修修改改即可達到期望的結果
  • 提供UDF 的庫: 相當於一個庫如果不知道具有什麼含義以及如何使用,用戶只需要在IDE 上搜索到這個庫,就能夠找到使用說明以及使用案例,提供語法檢測與智能提示
  • 提供代碼在線DEBUG能力: 可以上傳本地測試數據或者採樣少量Kafka 等source 數據debug,此功能對流計算任務非常重要。提供版本管理功能,可以在業務版本不斷升級過程中,提供任務回退功能。

任務運維: 任務運維主要分為四個方面

  • 日誌檢索: Flink UI 上查詢日誌體驗非常糟糕,滴滴將Flink 任務日誌進行了採集,存儲在ES 中,通過WEB 化的界面進行檢索,方便調查。
  • 指標監控: Flink 指標較多,通過Flink UI 查看體驗糟糕,因此滴滴構建了一個外部的報表平台,可以對指標進行監控。
  • 報警: 報警需要做一個平衡,如重啟報警有多類如( 機器宕機報警、代碼錯誤報警),通過設置一天內單個任務報警次數閾值進行平衡,同時也包括存活報警( 如kill、start )、延遲報警、重啟報警和Checkpoint 頻繁失敗報警( 如checkpoint 週期配置不合理) 等。
  • 血緣追踪: 實時計算任務鏈路較長,從採集到消息通道,流計算,再到下游的存儲經常包括4-5個環節,如果無法實現追踪,容易產生災難性的問題。例如發現某流式任務流量暴漲後,需要先查看其消費的topic 是否增加,topic 上游採集是否增加,採集的數據庫DB 是否產生不恰當地批量操作或者某個業務在不斷增加日誌。這類問題需要從下游到上游、從上游到下游多方向的血緣追踪,方便調查原因。

4.3 基於數據夢工廠的實時數據源元數據化(meta化表)

將topic引入成實時表,metastore統一管理元數據,實時開發中統一管理DDL過程。對實時數倉來說,通過元數據化,可以沉澱實時數倉的建設成果,使數倉建模能更好的落地

實時數倉在滴滴的落地實踐 4

目前數據夢工廠支持的元數據化實時數據源包括Postgre、DDMQ、Mysql、Druid、ClickHouse、Kylin、Kafka。 ‍

5. 面臨的挑戰和解決方案思考

雖然目前滴滴在實時數倉建設方面已初具規模,但其面臨的問題也不容忽視。

5.1 實時數倉研發規範

問題: 為了快速響應業務需求,同時滿足數倉的需求開發流程,迫切需要建設一套面向實時數據開發的規範白皮書,該白皮書需要涉及需求對接、口徑梳理、數據開發、任務發布、任務監控、任務保障

目前解決方案: 目前由數據BP牽頭,制定了一套面向實時數據指標的開發規範:

實時數倉在滴滴的落地實踐 5

常規流程: 需求方提出需求,分析師對接需求,提供計算口徑,編寫需求文檔。之後由數倉BP和離線數倉同學check計算口徑,並向實時數倉團隊提供離線hive表,實時數倉同學基於離線hive表完成數據探查,基於實時數倉模型完成實時數據需求開發,通過離線口徑完成數據自查,最終交付給分析師完成二次校驗後指標上線。

口徑變更–業務方發起: 業務方發起口徑變更,判斷是否涉及到實時指標,數倉BP對離線和實時口徑進行拉齊,向離線數倉團隊和實時數倉團隊提供更口口徑和數據源表,實時數倉團隊先上測試看板,驗收通過後切換到正式看板

存在的不足

  • 當針對某個業務進行新的實時數據建設時,會有一個比較艱難的初始化過程,這個初始化過程中,會和離線有較多耦和,需要確定指標口徑,數據源,並進行大量開發測試工作
  • 在指標口徑發生變更的時候,需要有一個較好的通知機制,目前還是從人的角度來進行判斷。

5.2 離線和實時數據一致性保證

目前解決辦法: 由業務、BP、離線數倉共同保證數據源、計算口徑與離線一致,數據加工過程,逐層與離線進行數據比對,並對指標結果進行詳細測試,數據校驗通過並上線後,根據離線週期進行實時和離線數據的校驗

實時數倉在滴滴的落地實踐 6

待解決的問題: 結合指標管理工具,保證指標口徑上的一致性,擴展數據夢工廠功能,在指標加工過程中,增加實時離線比對功能,降低數據比對成本。

6. 未來展望—批流一體化

雖然Flink 具備批流一體化能力,但滴滴目前並沒有完全批流一體化,希望先從產品層面實現批流一體化。通過Meta 化建設,實現整個滴滴只有一個MetaStore,無論是Hive、Kafka topic、還是下游的HBase、ES 都定義到MetaStore 中,所有的計算引擎包括Hive、Spark、Presto、Flink 都查詢同一個MetaStore,實現整個SQL 開發完全一致的效果。根據SQL 消費的Source 是表還是流,來區分批處理任務和流處理任務,從產品層面上實現批流一體化效果。

實時數倉在滴滴的落地實踐 7

作者介紹

潘澄,資深軟件開發工程師

負責實時數據倉庫建設,多年數據相關工作經驗,專注數據建模、數據倉庫、實時數據技術等領域。

朱峰,高級軟件開發工程師

主要從事實時數據倉庫建設,專注實時和離線數倉技術,對數倉建模、數據研發和數倉中間層建設有一定積累。

本文轉載自公眾號滴滴技術(ID:didi_tech)。

原文鏈接

實時數倉在滴滴的落地實踐