1. 引言
通過 BI 平台取數看數分析數成為輔助決策、精細運營等非常重要的手段,然而随着去哪兒網業務不斷發展,産品、運營等同學對這方面有更高的要求,例如簡單易用的拖拽式報表、取數方便的自由式分析、查詢速度的秒級響應、觀測指标數據的準确可信等等。面對用戶的個性化訴求以及海量數據,在平台體系化建設和技術實現上有一定的挑戰性,本文将介紹去哪兒網BI平台的建設曆程及實踐,通過打造全場景的 BI 平台為業務增長賦能。
2. 建設曆程
從2015年至今 BI 平台的建設,經曆了多年叠代發展,始終結合業務需要遵循以下幾個原則:
BI 平台建設時間線如上圖,根據實際業務需要上線相應模塊,總體大緻分為三個階段:
後續将詳細介紹每個階段的痛點和解決方案。
2.1.原始階段關鍵詞:一路到底式、數據體量小、快速完成需求開發
原始時期,業務處于快速發展階段,公司絕大多數的精力在業務上,用戶的取數看數分析數訴求基本依賴數據部門排期開發的報表,為滿足這種大量的數據需求,全部數據開發資源投入業務需求,進行一路到底式的報表開發,從收集解析日志、ETL、導數、寫報表平台前後端等,如下圖所示。
這種方式屬于初級階段,還談不上平台建設,雖能以快速滿足業務需求為目的但也暴露出很多問題:
總結後我們發現,業務的快速發展不是借口,這種方式并不快而是痛苦,亟需明确分工,通過平台建設将大量堆積的數據需求轉化成用戶部分自助。
2.2.發展階段
關鍵詞:分工明确、部分自助
随着業務和數據團隊的發展,數據倉庫和數據平台建設同樣重要,從此分化兩個方向,一個是偏向于業務數據的團隊,可以将更多的精力放在業務和數據本身以及數倉模型建設上;另一個是偏向于數據平台的團隊,将報表、權限等等系統重構并專門負責,有利于将數據平台建設得更加易用,提升用戶取數看數分析數效率。因此此階段除了重構報表系統将報表的配置工作交給用戶外,還搭建了自助數據分析系統和 OLAP 系統,進一步提升取數看數分析數的自助率。
2.2.1.報表系統 V2如下圖的界面功能是從 SQL 語法中抽象而來,用戶隻需點選即可自助完成常規的聚合查詢分析。
2.2.2.2.整體架構
結合實際痛點分析出有以下必要的訴求點:
針對同時查離線和實時數據的訴求,首先得有個統一的查詢入口,然後對億級别以内量級的數據做數據分析要保障效率,由此可以想到 Impala Kudu 和 Impala HDFS( Parquet )組合( Kudu 隻存當天的實時數據,離線數據從原有的 HDFS 上讀取)。這個方案相對把兩類數據都導入到某個其他引擎中,從存儲和實現成本上是較小的。
Apache Kudu 是介于 Hadoop 和 Hbase 之間的,既能滿足高吞吐量的數據分析需求又能滿足快速的數據随機讀寫需求。基于Impala和Kudu的系統架構圖如下:
數據寫入過程
數據讀取過程
業務上出現了兩個典型的 OLAP 場景,一個是收益團隊需要對曆史全量訂單,億級别的數據量進行全維度分析後制定策略,待策略上線後,再進行實時監控成單收益效果,通過多維分析定位到具體哪個渠道、城市、星級等等維度效果不佳,指導及時調整策略。
另一個是酒店業務團隊,我們知道用戶預定酒店的過程中涉及搜索、列表頁、詳情頁、預定頁、成單等主要環節,需要針對各個階段的業務系統進行實時順暢度監控,就是将用戶每次請求在各個階段的順暢度情況實時收集,這個數據量是億級别的,然後進行多維統計分析和實時監控,有問題能夠及時告警甚至需要阻斷發布和自動報故障,輔助業務團隊定位問題解決問題,提升用戶在預定酒店過程的體驗感受。
從這些場景中可以提煉出一些關鍵點:數據實時性要求高,數據量為億級别,維度指标上百個,數據存儲适合大寬表,查詢要秒級響應。
2.2.3.1.計算引擎
為滿足上述訴求OLAP引擎的選擇是關鍵,我們對比當時常用的引擎如下:
通過多種維度的比較,我們最終選擇了能支撐億級别數據量、支持實時數據、在近百個維度指标情況下查詢性能依然很高的Apache Druid,來支撐這類實時 OLAP 場景。
2.2.3.2.數據可視化數據可視化方面選擇開源的 Superset ,主要原因是其深度支持 Apache Druid,并支持其他衆多數據源,能很好的兼容曆史數據。Superset 具有較強的數據分析能力,且有豐富的可視化圖表類型,另外也支持将圖表配置成數據看闆,将固化的分析口徑以報表的形式呈現。
至此 OLAP 解決方案如下:
在此階段通過明确的分工,将特定資源集中在數據平台建設上,解決了用戶大部分取數看數分析數場景的訴求,包括報表配置、自助數據分析、實時 OLAP 等,用戶能夠通過工具自助獲取,不再完全依賴數據開發同學,效率相對有很大的提升;數據開發同學也大大減少了臨時性瑣碎的取數需求,把更多的精力放到業務本身和數倉建設上。
然而我們面對用戶多種多樣的訴求,不斷投入專門的資源來滿足,不斷推翻叠代造成資源浪費,這就引發了接下來的BI平台體系化建設。
2.3.體系建設階段關鍵詞:多元化、個性化、标準化、體系化
用戶的訴求是多樣化的,但又不可能都得開發相應的系統來對應滿足,伴随以下痛點我們當前需要統籌思考、整體設計、一勞永逸,做體系化建設。
經曆之前兩個階段後 BI 平台雛形已現,下圖中展示了當前階段 BI 平台的整體架構概略設計,本文将着重介紹本階段的建設和實踐,接下來分場景模塊來介紹。
2.3.1.即席查詢與自助郵件報表
即席查詢在之前基本通過登錄客戶機或開源的 HUE 來寫 SQL 取數,這種方式會面臨很多問題,例如權限控制無法很好地保障有數據安全風險、SQL 腳本無法管理随着人員流失就流失掉了、寫 SQL 用到的日期變量沒有靈活的支持等等個性化需求,因此結合業務訴求搭建了即席查詢與自助郵件報表系統。
數據報表模塊是叠代的第三個版本,除了貼合業務需求外,我們在重構前需要思考第三版能用多久,帶着這個問題提煉出以下原則:
作為數據平台開發同學,以平台建設思維,一次性搭建,将圖表組件化。
作為數據開發同學,開發維護好數據模型,基于此可支撐各種口徑各種類型圖表的配置。
作為産品運營等同學,不必寫SQL,通過拖拽,所見即所得。
業務内部管理權限以及數據看闆等繁雜事務,完全自助。
2.3.2.1.架構設計
離線數據支持從 MySQL 、離線數倉以及指标系統中同步,也支持業務系統的監控數據同步;
實時數據從實時數倉提供的 Kafka 接入,基本是 DWD 層數據;
專門的導數平台,支持離線和實時數據導入到各種存儲中;
離線數據導數任務完成後會進行數據校驗,失敗則告警給導數任務的開發同學以及引用本數據源的圖表負責人;
實時數據由 Kafka 導入 ClickHouse 或 Apache Druid 。
根據不同場景選擇不同的存儲,離線結果數據推薦 PostgreSQL ,數據量大推薦 GP ;實時統計數據存入 Druid ,多維數據分析場景存入 ClickHouse ;
為提升查詢效率,離線導數任務成功後,觸發引用當前數據源的圖表數據刷入緩存中,另外用戶自主查詢後的結果也都存入臨時性緩存;
基于導入的底層數據表,設置維度、指标定義數據模型,根據業務需求抽象合理的模型,這是數據報表模塊的核心,也是數據開發同學工作的重點;
可視化圖表,提供了常用圖表模闆近十種類型,基于數據模型可以自由拖拽維度指标;最上層将多圖表組成數據看闆用于報表展示,支持常用的上卷下鑽;對于實時數據大屏場景,通過拖拽也可高效完成。
針對可視化圖表,由前端實現拖拽效果,用戶在前端的所有拖拽和配置信息構建成一個 Json 形式的 Config 中,傳到後端存儲;打開可視化圖表時前端獲取 Json 形式的 Config ,解析後渲染展示。
自由拖拽實際上是降低了圖表配置門檻,提升了配置效率。原報表系統 V2 配置步驟繁雜,大部分還是由數據開發同學配置的,開發工期長。為提升整體效率,首先将此模塊抽象成四部分,存儲/引擎、數據模型、可視化圖表、看闆/大屏,上一節已詳細介紹過。
其次明确分工,數據開發同學主要做的事情是,根據需求場景将數據引入到合适的存儲/引擎中,根據需求内容抽象合理的數據模型,剩下的配置可視化圖表和看闆皆由産品、運營等自助拖拽完成。
2.3.2.3.業務自主管理
各業務整合後面對的用戶涉及全司全業務,各業務對報表在組織和權限管理方面差異很大,希望能夠獨立自主管理,因此我們加入了 BU 的概念,按 BU 從邏輯上完全隔離開,包括導入後的存儲和引擎、數據模型、可視化圖表、數據看闆,以及在權限系統中所有相關的資源。
2.3.2.4.亮點功能
作為數據報表系統,除了常規的功能例如看闆/大屏、上卷下鑽、同環比等之外,還重點支持了以下幾個重要的功能點。
多指标計算
對于已有指标 PV、UV,需要二次計算 PV/UV 得出人均浏覽次數這種新指标。
監控告警
針對某個特定(或一批)維度,對任意多個指标設置組合規則進行報警,支持發送報警信息到 Qunar 内部即時通訊 QTalk 和企業微信。
血緣信息
用戶在看闆中可對某個指标或某個圖表,查看上遊的血緣信息,包括底表生産信息、底表質檢信息、底表接入信息,做到了血緣信息一目了然,提升了數據可信度。數據有問題也方便定位,提升了問題解決效率。
2.3.4.OLAP模塊
2.3.4.1.需求場景基于原實時 OLAP 模塊的升級,以酒店 CRM 系統數據部分為例。每逢節日做活動,運營、銷售、管理層等角色的用戶,需要在活動期間實時分析所負責酒店在各種維度下的各種數據指标,以便做策略調整和決策。
具體形式如上所示(截取了部分),針對酒店用戶任意勾選二十多個維度、近百個指标,要求 3 秒内出結果展示圖表。通過對需求的詳細分析歸納,得出以下技術挑戰點:
引擎選型調研 ES、Presto、Kylin 在前面對比過結論是不适用當前場景,本次選型主要對比了在用的 Apache Druid、Impala 和新增的 Apache Doris、ClickHouse。
對 Impala、Doris、ClickHouse 三種引擎做 Benchmark ,保證相同的數據表(需求相關的真實數據和量級)和相同的 SQL(按需求實際需要編寫),在各個引擎上做了簡單的測試(Impala 用 Parquet,ClickHouse 用 MergeTree 表引擎),查詢多次取均值結果如下:
通過直觀的性能對比結果,ClickHouse 的查詢性能表現很好,另外實際測試發現随着查詢指标數量的增多對 ClickHouse 的性能影響也并不是很大,再結合我們的實際場景需求(主寬表查詢,帶小表 Join )、硬件條件、開發成本以及業界經驗綜合對比,ClickHouse 成為了不錯的選擇。
2.3.4.3.架構設計
數據寫入
離線數據通過導數平台的 Waterdrop 從 Hive 中導入ClickHouse;實時數據通過導數平台 ClickHouse 的 Kafka Engine從Kafka 中實時消費,再由物化視圖将數據實時寫入 MergeTree 的單機表,然後基于此建分布式表。
數據讀取用戶在頁面上任意勾選想要看的維度和指标,提交查詢到數據查詢服務,然後解析、拼裝查詢 SQL ,提交到 ClickHouse 執行 SQL ,最後拿到結果數據返回到前端頁面展示成圖表。
2.3.4.4.場景應用和優化
整個集群部署如上圖,訪問入口由 Nginx 做負載均衡, CHProxy 代理用于管理集群用戶、限制并發、設置請求超時等,而集群的大部分分布式功能,則需要通過 ZooKeeper 來完成。結合 CRM 項目本身訴求以及性能要求設計了兩種表,整體原則是充分利用 ClickHouse 的單機計算性能強的優勢。
第一種分布式表,通常用來存儲指标數據和關聯用的維度字段(如日期及酒店維度字段加到訂單流量數據),這種表通常數據量很大( TB 甚至 PB 級别),需要用多台機器分散存儲。分布式表需要設置 Sharding Key 來決定,由于涉及到查詢優化,Sharding Key 最好是對應場景中出現頻率最高的查詢維度(比如日期),這樣能夠保證 Group By 的時候同一組維度數據一定在同一台物理機上,然後通過修改配置 distributed_group_by_no_merge=1 将所有的聚合轉成本地操作,避免了額外的網絡開銷,提升查詢性能。
第二種單機表,通常用來存儲非靜态的維表,這類維表包含随時間更新的維度(比如酒店星級,HOS 分等),需要在查詢的時候取維表數據和主表進行 Join 操作。通過設置一表多備的方式,我們讓每一台機器都持有全量且一緻的維表數據,這樣在Join的時候就可以将 Shuffle Join 優化成 Local Join (因為每一個 Join Key 對應的右表全量數據一定都在本地)來提升查詢的整體性能。
2.3.5.标準化指标
基于 OneData 方法論,數倉建模通過指标系統最終産出的是标準化指标,定義和統一口徑,數倉同學為标準化指标數據負責。QBI 各個模塊從指标系統中獲取标準化數據,或分析或展示,以保障所有人看到同一個指标時數據是一緻的,從根源上進一步提升了數據可信度。具體關系的細節如下圖所示。
2.3.5.1.數據分析場景
數據分析模塊引入指标系統管理的 DIM 表、DWD 表明細數據,獲取指标系統構建的原子指标、複合指标、派生指标信息,用戶在進行事件分析時可自由選擇來自指标系統的标準化指标,實際查詢相應底層的明細表進行分析,使用效果如下圖所示。
2.3.5.2.數據報表場景
指标系統産出的标準化ADS表,通過導數平台導入數據報表模塊,然後根據指标系統裡定義的維度指标自動生成數據模型,基于此可實現自由拖拽可視化報表配置看闆,相反在看闆的圖表裡可以查看底表和指标的來源信息,使用效果如下圖所示。
2.3.6.互聯互通
QBI 已形成多個模塊的全場景數據消費形态,但模塊之間并不是割裂的反而是互聯互通的,而且關系非常緊密,圍繞标準化的指标系統為核心如下圖所示。
3.QBI總結
QBI 目前服務于 Qunar 全司十幾條業務線,整體 MAU 三千,現已形成較為完善的産品矩陣,包括以下場景:
基于公司自研 IM 工具,支持訂閱數據看闆、交互式數據分析、業務指标監控告警等,随時随地關注業務數據動态。
4.2.QBI各層整合抽象QBI 各個模塊由實際業務需要從曆史發展而來,目前雖已形成體系但從抽象的角度來看數據接入層、引擎層、查詢層可以合并同類項,抽象出公共的組件化服務,降低維護成本。
4.3.數據分析場景豐富目前數據分析模塊對事件分析和漏鬥分析的支持已比較完善,後續可擴展更多的用戶分析場景,例如留存分析、歸因分析、分布分析、用戶路徑分析等等,支撐全業務各種細分場景需求,助力業務決策。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!