本文首發於 泊浮目的簡書: https://www.jianshu.com/u/204...
版本 | 日期 | 備註 |
---|---|---|
1.0 | 2021.5.9 | 文章首發 |
這是個人學習筆記,大量摘抄網上、書本里的內容,將我本身認爲關聯度較高的內容呈現上來。html
商業智能(Business Intelligence)誕生在上個世紀 90 年代,它是將企業已有的數據轉化爲知識,幫助企業作出經營分析決策。前端
好比在零售行業的門店管理中,如何使得單個門店的利潤最大化,咱們就須要分析每一個商品的銷售數據和庫存信息,爲每一個商品制定合理的銷售採購計劃,有的商品存在滯銷,應該降價促銷,有的商品比較暢銷,須要根據對將來銷售數據的預測,進行提早採購,這些都離不開大量的數據分析。算法
而數據分析須要聚合多個業務系統的數據,好比須要集成交易系統的數據,須要集成倉儲系統的數據等等,同時須要保存歷史數據,進行大數據量的範圍查詢。傳統數據庫面向單一業務系統,主要實現的是面向事務的增刪改查,已經不能知足數據分析的場景,這促使數據倉庫概念的出現。數據庫
舉個電商的例子,在電商場景中,有一個數據庫專門存放訂單的數據,另一個數據庫存放會員相關的數據。構建數據倉庫,首先要把不一樣業務系統的數據同步到一個統一的數據倉庫中,而後按照主題域方式組織數據。後端
主題域是業務過程的一個高層次的抽象,像商品、交易、用戶、流量都能做爲一個主題域,你能夠把它理解爲數據倉庫的一個目錄。數據倉庫中的數據通常是按照時間進行分區存放,通常會保留 5 年以上,每一個時間分區內的數據都是追加寫的方式,對於某條記錄是不可更新的。緩存
進入互聯網時代,有兩個最重要的變化。安全
因此,數據規模和數據類型的限制,致使傳統數據倉庫沒法支撐互聯網時代的商業智能。服務器
05年的時候,Hadoop誕生了。 Hadoop 相比傳統數據倉庫主要有兩個優點:網絡
隨着Hadoop的成熟,數據湖的概念在10年被提出:數據湖(Data Lake)是一個以原始格式存儲數據的存儲庫或系統。架構
對於一個數據開發,在完成一項需求時,常見的一個流程是首先要把數據導入到大數據平臺中,而後按照需求進行數據開發。開發完成之後要進行數據驗證比對,確認是否符合預期。接下來是把數據發佈上線,提交調度。最後是平常的任務運維,確保任務每日可以正常產出數據。
這時,業界提出大數據平臺的概念,就是爲了提升數據研發的效率,下降數據研發的門檻,讓數據可以在一個設備流水線上快速地完成加工。
大規模數據的應用,也逐漸暴露出現一些問題。
業務發展前期,爲了快速實現業務的需求,煙囪式的開發致使企業不一樣業務線,甚至相同業務線的不一樣應用之間,數據都是割裂的。兩個數據應用的相同指標,展現的結果不一致,致使運營對數據的信任度降低。若是你是運營,當你想看一下商品的銷售額,發現兩個報表上,都叫銷售額的指標出現了兩個值,你的感覺如何? 你第一反應確定是數據算錯了,你不敢繼續使用這個數據了。
數據割裂的另一個問題,就是大量的重複計算、開發,致使的研發效率的浪費,計算、存儲資源的浪費,大數據的應用成本愈來愈高。
這些問題的根源在於,數據沒法共享。2016 年,阿里巴巴率先提出了「數據中臺」的口號。數據中臺的核心,是避免數據的重複計算,經過數據服務化,提升數據的共享能力,賦能數據應用。以前,數據是要啥沒啥,中間數據難於共享,沒法積累。如今建設數據中臺以後,要啥有啥,數據應用的研發速度再也不受限於數據開發的速度,一晚上之間,咱們就能夠根據場景,孵化出不少數據應用,這些應用讓數據產生價值。
在建設中臺的過程當中,通常強調這樣幾個重點:
那麼接下來就看一下阿里巴巴對於數據中臺的實踐。
正如上述提到的數據只加工一次是建設數據中臺的核心,本質上是要實現公共計算邏輯的下沉和複用
。阿里數據中臺提到了各類one
思想,如:
數據服務主旨是爲了將數據暴露出去,若是沒有數據服務,則是直接將數據導給對方,這樣很低效,也不安全。
在長期的實踐中,阿里分別經歷了四個階段:
很是的簡單粗暴,就是將業務方對數據的需求經過 SOA 服務的方式暴露出去。由需求驅動,一個需求開發一個或者幾個接口,編寫接口文檔,開放給業務方調用。
業務需求當然很重要,可是若是不以技術端作了一個抓手,長期來看維護成本會極高——街口多,複用率低;且一個接口從需求開發到測試上線,整個流程走完至少也要一天,但有時需求僅僅是增長1、兩個字段屬性,也要走一套流程,效率較低。
DWSOA階段存在的明顯問題,就是煙囪式開發,致使接口衆多很差維護,所以須要想辦法下降接口的數量。當時阿里內部對這些需求作了調研分析,發現實現邏輯基本上就是從DB取數,而後封裝結果暴露服務,而且不少接口實際上是能夠合併的。
OpenAPI就是數據服務的第二個階段。具體的作法就是將數據按照其統計粒度進行聚合,一樣維度的數據,造成一張邏輯表,採用一樣的接口描述。以會員維度爲例:把全部以會員爲中心的數據作成一張邏輯寬表,只要是查詢會員粒度的數據。僅須要調用會員接口便可。經過段時間的實施,結果代表這種方式有效地收斂了接口數量。
然而,數據的維度並無開發們想象的那麼可控, 隨着時間的推移,你們對數據的深度使用,分析數據的維度也愈來愈多,當時OpenAPI生產已有近 100 個接口:同時也帶來大量對象關係映射的維護工做量。
因而阿里的同窗給予OpenAPI上,又加了一層類SQL的DSL。將全部的簡單查詢服務都變成了一個接口。至此,全部的簡單 查詢服務減小到只有一 個接口 ,這大大下降 了數據服務的維護成本。傳統的方式查問題須要翻源碼,確認邏輯:而SmartDQ只須要檢查 SQL 的工做量,而且能夠開放給業務方經過寫 SQL 的方式對外提供服務,由服務提供者本身來維護SQL ,也算是服務走向 DevOps的 一 個里程碑吧 。
邏輯表雖然在 OpenAPI 階段就已經存在,可是在 SmartDQ階段講更合適,由於 SmartDQ 把邏輯表的 做用真正發揮出來了。SQL 提供者只 需關心邏輯 表 的結構,不須要關心底層由多少物理表 組成,甚至不須要 關心這些物 理表是 HBase 仍是 MySQL 的,是單表還 是分庫分表,由於 SmartDQ 已經封裝了跨異構數據源和分佈式查詢功能。此外,數據部門字段的變動相對比較頻繁 ,這種底層變動對應用層來講應該算是最糟糕的變動之一了 。而邏輯表層的設計很好地規避了這個痛點,只變動邏輯表中物理字段的映射關係,而且即刻生效,對調用方來講徹底無感知。
接口易上難下,即便一個接口也會綁定一批人(業務方、接口開發維護人員、調用方)。因此對外提 供的數據服務接口必定要儘可 能抽象,接口的數量要儘量收斂,最後在保障服務質量的狀況下,儘量減小維 護工做量。如今SmartDQ 提供 300多個 SQL 模板每條 SQL 承擔多個接口的需求,而咱們只用1位同窗來維護SmartDQ 。
第四階段是統一的數據服務層(即 OneService )。
你們內心可能會有疑問:SQL並不能解決複雜的業 務邏輯啊。確實SmartDQ 其實只知足了簡單的查 詢服務需求。咱們遇到的場景還有這麼幾類:個性 化 的垂直業務場景、 實時數據推送服務 、定時任務服務。 因此OneService主要是提供多種服務 類型來知足用戶需求,分別是 OneService-SmartDQ OneService-Lego、OneService-iPush、OneService-uTiming 。
技術細節
SmartDO
SmartDQ的元數據模型, 簡單來講, 就是邏輯表到物理表的映射。自底向上分別是:
主處理模塊。 一 次查詢從開始到結果返回, 通常會通過以下幾步:
IPush
Push應用產品是一個面向TT、MetaQ等不一樣消息源,經過定製過濾規則,向Web、無線等終端推送消息的中間件平臺。iPush核心服務器端基於高性能異步事件驅動模型的網絡通訊框架Netty 4實現,結合使用Guava緩存實現本地註冊信息的存儲,Filter與Server之間的通訊採用Thrift異步調用高效服務實現,消息基於Disruptor高性能的異步處理框架(能夠認爲是最快的消息框架)的消息隊列,在服務器運行中Zookeeper實時監控服務器狀態,以及經過Diamond做爲統一的控制觸發中心。
Lego
Lego被設計成一個面向中度和高度定製化數據查詢需求、支持插件機制的服務容器。它自己只提供日誌、服務註冊、Diamond配置監聽、鑑權、數據源管理等一系列基礎設施,具體的數據服務則由服務插件提供。基於Lego的插件框架能夠快速實現個性化需求併發布上線。
Lego採用輕量級的Node.JS技術棧實現,適合處理高併發、低延遲的IO密集型場景,目前主要支撐用戶識別發碼、用戶識別、用戶畫像、人羣透視和人羣圈選等在線服務。底層根據需求特色分別選用Tair、HBase、ADS存儲數據。
uTiming
uTiming是基於在雲端的任務調度應用,提供批量數據處理服務。uTiming-scheduler負責調度執行SQL或特定配置的離線任務,但並不直接對用戶暴露任務調度接口。用戶使用數據超市工具或Lego API創建任務。
面對爆炸式增加的數據,如何建設高效的數據模型和體系,對這些 數據進行有序和有結構地分類組織和存儲,避免重複建設和數據不一致 性,保證數據的規範性, 一直是大數據系統建設不斷追求的方向。
OneData 便是阿里巴巴內部進行數據 整合及管理的方法體系和工具。阿里巴巴的大數據工程師在這一體系下,構建統一 、規範、可共享 的全域數據體系,避免數據的冗餘和重複建設,規避數據煙囪和不一致 性,充分發揮阿里巴巴在大數據海量、多樣性方面的獨特優點。藉助這 一統一化數據整合及管理的方法體系,阿里的同窗構建了阿里巴巴的數據公共 層,並能夠幫助類似的大數據項目快速落地實現。因爲篇幅緣由,下面重點介紹OneData的模型設計。
阿里巴巴集團數據公共層設計理念遵循維度建模思想, 可參考Star Schema- The Complete Reference
和The Dαtα Warehouse Toolkit-The Definitive Guide to Dimensional Modeling
。數據模型的維度設計主要以維度建模理論爲基礎,基於維度數據模型總線架構,構建一致性的維度和事實。
阿里巴巴的數據團隊把表數據模型分爲三層
操做數據層(ODS,Operational Data Store):把操做系統數據幾乎無處理地存放在數據倉庫系統中。
公共維度模型層(CDM,Common Data Model):存放明細事實數據、維表數據及公共指標彙總數據,其中明細事實數據、維表數據通常根據 ODS 層數據加工生成;公共指標彙總數據通常根 據維表數據和明細事實數據加工生成。
CDM 層又細分爲明細數據層( DWD,Data Warehouse Detail)層和 彙總數據層(DWS,Data Warehouse Summary),採用維度模型方法做爲理論基 礎,更多地採用一些維度退化手法,將維度退化至事實表中,減小事實表和維表的關聯 ,提升明細數據表的易用性:同時在彙總數據層,增強指標的維度退化,採起更多的寬表化手段構建公共指標數據層,主要功能以下:
應用數據層(ADS,Application Data Store):存放數據產品個性化的 統計指標數據,根據CDM層與ODS層加工生成。
數據調用服務優先使用公共維度模型層(CDM)數據,當公共層沒有數據時,需評估是否須要建立公共層數據,當不須要建設公用的公共層時,方可直接使用操做數據層(ODS)數據。應用數據層(ADS)做爲產品特有的個性化數據通常不對外提供數據服務,可是ADS做爲被服務方也須要遵照這個約定。
實時數倉和離線數倉很是的像,誕生的背景主要是近幾年企業對於數據服務的實時性需求日益增多。裏面的數據模型也會像中臺同樣分好幾層:ODS 、CDM、ADS。但總體對於實時性要求極高,所以通常存儲會考慮採用Kafka這種log base的MQ,而計算引擎會採用FLink、Storm這種流計算引擎。