作為IT從業(yè)者抬吟,今天看到這邊篇文章,自己的想法還是挺多的统抬,轉(zhuǎn)載過來保存一下火本,方便自己后期閱讀吧危队。
美團(tuán)數(shù)據(jù)倉庫,在過去的兩年中钙畔,與我們的業(yè)務(wù)一起高速發(fā)展茫陆。在這一演進(jìn)過程中,有很多值得總結(jié)和沉淀的內(nèi)容擎析。這篇文檔回顧下美團(tuán)數(shù)據(jù)倉庫這兩年發(fā)展過程中遇到的各種問題簿盅,為什么選擇了現(xiàn)在的技術(shù)方案,每一個(gè)功能和模塊是在什么情況下產(chǎn)生的揍魂,解決的是什么問題,中間有過哪些彎路现斋。既可以作為大家熟悉美團(tuán)數(shù)據(jù)倉庫構(gòu)建過程的一篇文檔喜最,也可以作為初次建立數(shù)據(jù)倉庫的參考。
史前時(shí)代
在正式建設(shè)美團(tuán)數(shù)據(jù)倉庫之前庄蹋,數(shù)據(jù)組也為各部門提供數(shù)據(jù)支持瞬内,不過那個(gè)時(shí)候的數(shù)據(jù)需求還比較少,而且也相對(duì)簡(jiǎn)單限书。
通常的做法是:
工程師寫一段PHP或者Shell腳本虫蝶,從命令行輸入?yún)?shù)。
自己連接數(shù)據(jù)庫倦西,通常是一個(gè)業(yè)務(wù)數(shù)據(jù)庫的從庫能真,將需要的原始數(shù)據(jù)提取出來。
在內(nèi)存中計(jì)算數(shù)據(jù)扰柠。
然后將結(jié)果寫入一個(gè)專門存放統(tǒng)計(jì)結(jié)果的DB舟陆。
再寫一個(gè)PHP頁面作為報(bào)表提供給需求方。
這是簡(jiǎn)單明了的流程耻矮,但是隨著需求的增加和精細(xì)化,有一些問題變得很棘手忆谓,并嚴(yán)重影響的開發(fā)效率:
有很多重復(fù)勞動(dòng)和代碼裆装,比如連接數(shù)據(jù)庫的代碼,每個(gè)人都要寫倡缠,各種寫法不同哨免,分布在很多地方,如果哪個(gè)DB的連接方法變更了昙沦,需要更改很多地方琢唾。
中間數(shù)據(jù)缺失,中間計(jì)算結(jié)果不能共享盾饮。比如每個(gè)Deal每天的銷量采桃,不同的人寫報(bào)表懒熙,每人都可能要重算一次。
很難管理和維護(hù)普办,程序語言五花八門工扎,同一指標(biāo)可以寫多種統(tǒng)計(jì)方法,各種語言各種執(zhí)行方式衔蹲,缺少文檔肢娘,其他人很難接手維護(hù)。
數(shù)據(jù)的清洗和轉(zhuǎn)換沒有統(tǒng)一方法舆驶,比如橱健,哪天是每月第一天或每周第幾天這種需求,靠手工調(diào)用各種時(shí)間函數(shù)來計(jì)算沙廉,非常容易出錯(cuò)拘荡。
不同數(shù)據(jù)源的數(shù)據(jù)很難綜合使用, 比如一個(gè)數(shù) 據(jù)需要使用主站的數(shù)據(jù)和合同系統(tǒng)的數(shù)據(jù)蓝仲, 要把這些數(shù)據(jù)組織在一起就很麻煩
為了解決這些問題俱病,在2011年Q2初,數(shù)據(jù)組開始搭建美團(tuán)的數(shù)據(jù)倉庫袱结。
引入ETL
數(shù)據(jù)倉庫的學(xué)術(shù)定義有很多版本和特點(diǎn)亮隙,其中有幾個(gè)詞能概括這一段工作的特點(diǎn),規(guī)范和集成垢夹。
首先需要建立一個(gè)DB用于保存從各個(gè)數(shù)據(jù)源提取出來的數(shù)據(jù)溢吻。
第一,解決不同數(shù)據(jù)源的數(shù)據(jù)聯(lián)合使用的問題果元。
第二促王,因?yàn)槭仟?dú)立的DB,可以進(jìn)行復(fù)雜的計(jì)算而不用考慮會(huì)影響線上個(gè)系統(tǒng)的DB而晒。
第三蝇狼,可以保留大量需要重復(fù)使用的中間數(shù)據(jù)。
第四倡怎,數(shù)據(jù)在首次進(jìn)入數(shù)據(jù)倉庫時(shí)迅耘,就可以進(jìn)行清洗整理,去掉無效數(shù)據(jù)和臟數(shù)據(jù)监署,添加常用字段比如 datekey颤专。
這一時(shí)間的一個(gè)重要工作是,引入了一個(gè)工具——ETL钠乏。ETL是Extract(抽绕茱酢),Transform(轉(zhuǎn)換)晓避,Load(載入)的首字母組合簇捍。顧名思義只壳,ETL工具的功能就是抽取數(shù)據(jù),經(jīng)過加工后垦写,再載入到新的位置吕世。
ETL的優(yōu)點(diǎn)是:
封裝了到各個(gè)數(shù)據(jù)庫的連接,使得工程師只需要關(guān)注數(shù)據(jù)的抽取和轉(zhuǎn)換邏輯梯投,而不必處理各種數(shù)據(jù)庫的連接細(xì)節(jié)命辖。
將數(shù)據(jù)抽取和轉(zhuǎn)換統(tǒng)一使用SQL來表示,形式化的統(tǒng)一使得理解處理過程變的簡(jiǎn)單分蓖,便于不同的人協(xié)作開發(fā)尔艇,同時(shí),用SQL表示邏輯將各種復(fù)雜的統(tǒng)計(jì)交給關(guān)系數(shù)據(jù)庫來處理么鹤,也降低了出錯(cuò)的可能性终娃。數(shù)據(jù)抽取的過程中同時(shí)完成各種清洗和轉(zhuǎn)換,替換空值蒸甜,規(guī)范時(shí)間表示等棠耕。
這一時(shí)間也同時(shí)確定了很多規(guī)范:
用數(shù)據(jù)表示邏輯,典型例子是柠新,不再使用各種時(shí)間函數(shù)來計(jì)算時(shí)間窍荧,而是建立一個(gè)日期表,把某一天的各種信息屬性全部算出來存在一張表里恨憎,需要的時(shí)候只要連表就可以得到蕊退。大大降低了時(shí)間邏輯出錯(cuò)的可能性并簡(jiǎn)化了開發(fā)。
將數(shù)據(jù)分為維度數(shù)據(jù)憔恳,事實(shí)數(shù)據(jù)瓤荔,衍生數(shù)據(jù),聚合數(shù)據(jù)等類型钥组, 以及第一版的命名規(guī)范输硝。 為后續(xù)數(shù)據(jù)的組織和管理奠定了基礎(chǔ)。
數(shù)據(jù)倉庫的基礎(chǔ)數(shù)據(jù)建設(shè)程梦,一直是數(shù)據(jù)組的一個(gè)主要工作腔丧,直到2011年Q4,隨著各種數(shù)據(jù)需求的增加作烟,在如何使用數(shù)據(jù)上,有了一些新想法砾医。
嘗試OLAP
要做數(shù)據(jù)倉庫拿撩,而不是數(shù)據(jù)墳?zāi)梗瑪?shù)據(jù)如果不被使用如蚜,就毫無用處压恒。怎么能供各部門更好的使用這些數(shù)據(jù)呢影暴?我們要做平臺(tái),可供人去探索數(shù)據(jù)的平臺(tái)探赫。
2011年下半年型宙,隨著美團(tuán)業(yè)務(wù)的高速發(fā)展,用數(shù)據(jù)支撐運(yùn)營變得越來越重要伦吠,各種數(shù)據(jù)需求出現(xiàn)了一個(gè)井噴期妆兑,開發(fā)人手比較少,一時(shí)間有些捉襟見肘毛仪。
有沒有方法能讓需求方自助的獲取數(shù)據(jù)搁嗓,而不依賴RD呢,想到了一個(gè)非常流行的概念是OLAP——聯(lián)機(jī)分析處理(相對(duì)于OLTP——聯(lián)機(jī)事務(wù)處理)箱靴,目標(biāo)是做成一個(gè)自助探索工具的平臺(tái)腺逛。
從2011年Q4開始到2012Q1,數(shù)據(jù)組開始調(diào)研試用開源的OLAP工具套件衡怀。耗時(shí)較長(zhǎng)棍矛,從調(diào)研和最后試用的情況看,現(xiàn)有的OLAP系統(tǒng)不適合我們抛杨。
有幾個(gè)主要的問題:
開發(fā)和使用太復(fù)雜够委,成本太高。
產(chǎn)品成熟度較低蝶桶,很多數(shù)據(jù)需求沒法支持慨绳。
笨重,不太適應(yīng)互聯(lián)網(wǎng)公司快速靈活的節(jié)奏真竖。
因?yàn)樯鲜鲈蚱暄?012Q1, 放棄了OLAP的嘗試恢共。
同時(shí)在這個(gè)時(shí)間點(diǎn)上战秋,公司對(duì)數(shù)據(jù)需求的增長(zhǎng),暴露出了數(shù)據(jù)倉庫的很多問題讨韭,可以說是需求走在了技術(shù)的前面脂信,迫使我們集中力量做很多大規(guī)模的升級(jí)。
數(shù)據(jù)倉庫是一套完整的環(huán)境
2012Q1時(shí)透硝,數(shù)據(jù)倉庫出現(xiàn)了很多新的棘手的問題狰闪。
首先,有哪些流程在線我們不清楚濒生,什么時(shí)間執(zhí)行的埋泵,有沒有按時(shí)執(zhí)行不清楚。報(bào)表出了問題要查流程歷史記錄都很難查。
其次丽声,我們已經(jīng)有了幾百個(gè)ETL流程礁蔗,流程之間有執(zhí)行順序的依賴關(guān)系,但是沒有好的工具來管理雁社,靠crontab里設(shè)定執(zhí)行時(shí)間間隔浴井。經(jīng)常出現(xiàn)上游還沒有算完,下游就啟動(dòng)了霉撵,會(huì)出現(xiàn)臟數(shù)據(jù)磺浙。另一方面,并行開發(fā)太多喊巍,一個(gè)人的修改屠缭,不知道會(huì)不會(huì)影響別人,經(jīng)常出現(xiàn)沖突崭参。
第三呵曹,每次都用PHP手寫報(bào)表,重復(fù)工作太多何暮,開發(fā)上線都非常復(fù)雜奄喂。
第四,數(shù)據(jù)表和指標(biāo)很多海洼,命名不規(guī)范跨新,經(jīng)常會(huì)遇到兩個(gè)相近概念的比較問題,解釋起來非常麻煩坏逢,需要遍歷整個(gè)計(jì)算過程才能梳理清楚域帐。
針對(duì)這些問題,分別開發(fā)了相應(yīng)的工具是整。
第一個(gè)是流程的注冊(cè)肖揣,管理,查看的工具浮入,每個(gè)流程都有了戶口本和行為記錄龙优。
第二,寫工具分析流程之間的依賴關(guān)系事秀,畫出關(guān)系圖彤断。
第三,開發(fā)調(diào)度系統(tǒng)易迹,根據(jù)關(guān)系圖調(diào)度ETL流程執(zhí)行宰衙。
第四,抽象報(bào)表工具睹欲,屏蔽復(fù)雜的報(bào)表頁面開發(fā)供炼,將報(bào)表抽象為SQL和配置。
第五,建立數(shù)據(jù)字典劲蜻,解釋每個(gè)指標(biāo)和名詞的意思和計(jì)算過程。
通過這幾項(xiàng)主要工作考余,美團(tuán)數(shù)據(jù)倉庫發(fā)展到了一個(gè)比較成熟的階段先嬉。也正是經(jīng)歷了這樣一個(gè)過程,我們深刻體會(huì)到楚堤,數(shù)據(jù)倉庫不僅僅是一個(gè)“數(shù)據(jù)存儲(chǔ)的工具”疫蔓, 數(shù)據(jù)倉庫應(yīng)該是一套完整的軟件環(huán)境,它應(yīng)該包括:數(shù)據(jù)抽取身冬,計(jì)算衅胀,存儲(chǔ),查詢酥筝,展示滚躯,以及管理這些過程的工具。
協(xié)作開放
美團(tuán)的數(shù)據(jù)需求發(fā)展非澈俑瑁快掸掏,這體現(xiàn)在數(shù)據(jù)規(guī)模的增長(zhǎng),數(shù)據(jù)分析人員的增長(zhǎng)宙帝,數(shù)據(jù)分析復(fù)雜程度的增長(zhǎng)丧凤。2012年下半年,快速發(fā)展的數(shù)據(jù)需求讓原有的數(shù)據(jù)倉庫架構(gòu)達(dá)到了瓶頸步脓。無論是DB的計(jì)算和存儲(chǔ)能力愿待,還是開發(fā)人員的精力,都達(dá)到了很高的負(fù)荷靴患。而且由于開發(fā)流程和提取數(shù)據(jù)的重復(fù)勞動(dòng)很多仍侥,團(tuán)隊(duì)士氣也比較低落。這一時(shí)間的迫切工作是蚁廓,如何能讓需求方自助獲取數(shù)據(jù)并分析访圃,如何能讓數(shù)據(jù)的計(jì)算和存儲(chǔ)方便的擴(kuò)展。
從2012年中開始相嵌,重點(diǎn)推進(jìn)了幾項(xiàng)工作以解決上述問題:
第一腿时,建設(shè)主題表,將各種數(shù)據(jù)按照常用的維度展開成寬達(dá)幾十列上百列的表饭宾,使得查數(shù)據(jù)非常的容易批糟。比如,將一個(gè)城市一天的幾百個(gè)指標(biāo)放在一行看铆,以城市id和日期作為主鍵徽鼎,不用任何連表,使用簡(jiǎn)單的語法就能獲取關(guān)于城市的各個(gè)角度的數(shù)據(jù)。類似的主題表還有用戶否淤,訂單悄但,Deal等角度。豐富的主題表不但簡(jiǎn)化了報(bào)表開發(fā)石抡, 也為非技術(shù)人員能夠自助查詢數(shù)據(jù)提供了方便檐嚣。
第二,開發(fā)自助查詢工具啰扛,培訓(xùn)使用嚎京,讓各個(gè)部門的人都能在數(shù)據(jù)倉庫上查自己需求的數(shù)據(jù),培訓(xùn)大家使用SQL隐解,自助完成需求鞍帝。
第三,建立數(shù)據(jù)集市煞茫,按業(yè)務(wù)拆分帕涌,將部分?jǐn)?shù)據(jù)導(dǎo)入到各個(gè)不同的DB,供業(yè)務(wù)部門更靈活的數(shù)據(jù)需求溜嗜。
第四宵膨,將數(shù)據(jù)的存儲(chǔ)和計(jì)算,向Hadoop/Hive 分布式平臺(tái)遷移炸宵,已達(dá)到線性擴(kuò)展計(jì)算和存儲(chǔ)能力的需求辟躏。
第五啄寡,開放數(shù)據(jù)的存儲(chǔ)和計(jì)算環(huán)境拦止,讓ETL流程的編寫和部署Web化,讓其它組有能力的RD叉庐,可以自己在數(shù)據(jù)倉庫上部署計(jì)算流程裹匙,計(jì)算自己需要的數(shù)據(jù)瑞凑。
這幾個(gè)工作的周期都比較長(zhǎng),現(xiàn)在也在進(jìn)行中概页,效果也十分明顯籽御,終于有和需求并肩走在一起,沒有落后的壓迫感了惰匙。但還沒有走在需求前面技掏。
還有很多挑戰(zhàn)
美團(tuán)的成長(zhǎng)速度非常快项鬼,數(shù)據(jù)的規(guī)模和復(fù)雜度還將十倍百倍的增長(zhǎng)哑梳;業(yè)務(wù)多樣且變化迅速。如何能夠在海量數(shù)據(jù)基礎(chǔ)上進(jìn)行數(shù)據(jù)的管理绘盟、加工鸠真、分析以支持快速成長(zhǎng)的業(yè)務(wù)悯仙,后續(xù)還面臨很多挑戰(zhàn)。
我們期待對(duì)數(shù)據(jù)敏感吠卷、對(duì)管理海量復(fù)雜數(shù)據(jù)锡垄、對(duì)建設(shè)大型互聯(lián)網(wǎng)電商數(shù)據(jù)倉庫有興趣的朋友們,加入美團(tuán)數(shù)據(jù)倉庫團(tuán)隊(duì)祭隔!歡迎投遞簡(jiǎn)歷到 diaoshihan(#)meituan.com