牟宇航:百度OLAP數(shù)據(jù)庫——Palo

專家視野 | 牟宇航:百度OLAP數(shù)據(jù)庫——Palo

https://mp.weixin.qq.com/s/q8_kdDPdCPwIjI2BCETPZw

3月28日,在工業(yè)和信息化部的指導(dǎo)下,為期兩天的“2017大數(shù)據(jù)產(chǎn)業(yè)峰會”在北京國際會議中心召開。本次會議由中國信息通信研究院和中國通信標(biāo)準(zhǔn)化協(xié)會共同主辦,數(shù)據(jù)中心聯(lián)盟大數(shù)據(jù)發(fā)展促進(jìn)委員會承辦。

百度研發(fā)經(jīng)理牟宇航在29日上午大數(shù)據(jù)產(chǎn)品和應(yīng)用創(chuàng)新論壇上發(fā)表了題為《百度OLAP數(shù)據(jù)庫——Palo》的演講。



以下是內(nèi)容實(shí)錄:

大家好,我叫牟宇航,來自百度大數(shù)據(jù)部?,F(xiàn)在負(fù)責(zé)百度大數(shù)據(jù)部在線系統(tǒng)的研發(fā)管理,在線系統(tǒng)簡單來說就是大家用的數(shù)據(jù)庫。今天來這里給大家分享一個(gè)在云上售賣了一年,而且準(zhǔn)備開源的數(shù)據(jù)庫。



在講數(shù)據(jù)庫之前先給大家講一下我們面向的場景,第一個(gè)是百度統(tǒng)計(jì),是為其他第三方站長提供流量分析的工具。它的形式是提供一個(gè)腳本,其他的站長嵌入到自己的網(wǎng)站代碼里面,最后百度會通過這個(gè)腳本獲取第三方網(wǎng)站的用戶行為,然后出第三方網(wǎng)站的分析報(bào)表。這個(gè)產(chǎn)品量非常大,首先有450W網(wǎng)站站長去使用它,它的查詢頻率非常大,基本上峰值OPS會到2000以上。數(shù)據(jù)量也非常大,我們初步統(tǒng)計(jì)了一下每天結(jié)構(gòu)化的數(shù)據(jù)會到1-2T。


這種場景是在線報(bào)表場景,可以看到左側(cè)欄是主題,右側(cè)欄包括了指標(biāo)列和過濾條件,比如說可以根據(jù)時(shí)間過濾,可以根據(jù)其他方式過濾,每個(gè)主題是不一樣的。


第二個(gè)場景是我們經(jīng)常在業(yè)務(wù)上會出現(xiàn)的一個(gè)場景,就是數(shù)據(jù)集市。數(shù)據(jù)集市一般面向業(yè)務(wù)為主題,這里舉例是百度糯米的數(shù)據(jù)集市,它是集運(yùn)營、業(yè)務(wù)分析、訂單管理、會員管理、客戶關(guān)系、管理等一體的綜合數(shù)據(jù)平臺。這種數(shù)據(jù)集市場景多樣化,一方面剛剛提到的在線報(bào)表,比如說渠道人員想看一下幾個(gè)渠道的運(yùn)維情況,這有一個(gè)報(bào)表。再有產(chǎn)品經(jīng)理想多維分析下產(chǎn)品傳單的情況。比如說新上線一個(gè)活動,運(yùn)維人員想看一下新上線活動的情況,它的查詢非常靈活。

在這種數(shù)據(jù)集市里面除了場景比較復(fù)雜,另外使用它的角色很多,所以這個(gè)里面涉及到多租戶的管理。


這里拿了另外一個(gè)多維分析系統(tǒng),初步看它的樣子跟在線報(bào)表比較像,如果仔細(xì)看會不一樣。它的左側(cè)欄是個(gè)維度,包括像操作系統(tǒng)、時(shí)間瀏覽器維度,這些維度可以下展很多級別。右邊這些欄首先是查詢指標(biāo),另外是過濾維度的條件。



這種場景是典型的在線多維分析場景,以上三種場景就是今天要講的數(shù)據(jù)庫Palo的主要場景,在線報(bào)表、多維分析、機(jī)器查詢。這個(gè)名字很好記,當(dāng)時(shí)想這個(gè)名字就是面向多維分析的數(shù)據(jù)庫,用一句話形容Palo就是A:MPP-based Interactive Data Analysis SQL DB。面向數(shù)據(jù)量是百TB到PB級別。

講了這么多的OLAP,OLAP概念分為兩個(gè)維度,第一個(gè)是中間的A,A相當(dāng)于Transactional Processing。第二個(gè)維度是Online相當(dāng)于Offline,下面列了一張圖但凡所有的大數(shù)據(jù)應(yīng)用和面向C端B端的架構(gòu)都是這樣的架構(gòu),首先前端是客戶端,后面是服務(wù)端。



App Client加上App Server再加上Transaction,在大數(shù)據(jù)時(shí)代產(chǎn)生了很多數(shù)據(jù),我們希望把這些數(shù)據(jù)提取出來,挖掘其中的價(jià)值,這就是AP角色的事情,它可以做很多的事情,可以做轉(zhuǎn)換,可以做數(shù)據(jù)挖掘,這都是廣義的概念。在大數(shù)據(jù)時(shí)代,AP變得越來越重要,變得越來越龐大。TP核心價(jià)值在于業(yè)務(wù)邏輯,AP核心邏輯在數(shù)據(jù)本身,我們要從數(shù)據(jù)本身挖掘更多的價(jià)值。OLAP是面向AP的,這個(gè)里面也提了在線概念。拿購物舉例,離線像倉庫的概念,在線像小超市的概念。離線面向數(shù)據(jù)開發(fā)人員和數(shù)據(jù)建設(shè)者,在線面向數(shù)據(jù)消費(fèi)者,比如說產(chǎn)品經(jīng)理、管理者、營銷人員、運(yùn)維人員,可能他不太懂?dāng)?shù)據(jù)怎么玩,但是用了這個(gè)系統(tǒng)就會玩了。我們看到在大數(shù)據(jù)時(shí)代越來越多人使用數(shù)據(jù),在線這一部分的重要性變得越來越重要。



這個(gè)里面詳細(xì)列舉了一下OLAP和OLTP的區(qū)別,OLAP的場景比如說分析一個(gè)全量的歷史數(shù)據(jù),這個(gè)歷史數(shù)據(jù)可能涉及一年可能涉及很多,它的數(shù)據(jù)量會非常大,數(shù)據(jù)量大也就導(dǎo)致很多不一樣,比如說導(dǎo)入方式、側(cè)重點(diǎn),我們評估OLAP性能的方式不太一樣。最后是數(shù)據(jù)組織,一般來講OLTP是完全遵循三范式的,而OLAP就不一樣,它是五范式的。



剛才提到AP在大數(shù)據(jù)時(shí)代變得越來越重要,在2000年之后整個(gè)業(yè)界在AP領(lǐng)域涌現(xiàn)出來了知名的數(shù)據(jù)廠商和數(shù)據(jù)產(chǎn)業(yè)。


在開源界大概在2010年左右發(fā)力,這里介紹了Palo的區(qū)別和定位。首先,最顯著的區(qū)別是Palo的成本比較低,那些看到的開源產(chǎn)品基本是在百萬美元的量級,一套產(chǎn)品就這么貴。而Palo用的是普通的X86服務(wù)器,百度統(tǒng)計(jì)的業(yè)務(wù)也不過用了60臺,大家可以算一下這個(gè)成本很大的。



第二個(gè)是Palo的高可用和異用性,還有高性能,這是我們和其他競品最核心的區(qū)別。







在講Palo之前,我們先看Palo是怎么用的?長什么樣子?首先我們在MySQL 的選擇上語句不同,包括會增加一些在MySQL 比較有用的語句。這些增加的語句怎么用呢?我們通過直接輸入XP就能看到語句包括參數(shù)怎么使用。上面是Palo,因?yàn)榧嫒軲ySQL協(xié)議。



言歸正傳,看一下Palo的架構(gòu)。首先說一下Palo的設(shè)計(jì)理念,Palo的設(shè)計(jì)理念強(qiáng)調(diào)要優(yōu)雅、簡潔,這個(gè)里面大家看我們的架構(gòu)很簡單,每個(gè)顏色代表一個(gè)進(jìn)程,藍(lán)色是客戶端,不是Palo內(nèi)部的東西。在這里面我們部署時(shí)前端和后端是分離的,在部署時(shí)一臺機(jī)器上只需要部屬一個(gè)進(jìn)程就可以了,部署非常簡單。前端首先負(fù)責(zé)源數(shù)據(jù)的管理,前端還可以負(fù)責(zé)接收產(chǎn)品請求,包括建表、建數(shù)據(jù)庫,包括數(shù)據(jù)導(dǎo)入、管理,包括復(fù)本管理,數(shù)據(jù)請求。包括查詢界定都是在前端完成的。比方說,前端是Palo的大腦,后端是Palo的軀干,可以干活。一般來講前端節(jié)點(diǎn)稍微少一點(diǎn),后端節(jié)點(diǎn)比較多。

為什么前端節(jié)點(diǎn)有3-10個(gè)呢?為什么不是10個(gè)呢?相當(dāng)于元數(shù)據(jù)的架構(gòu),這個(gè)里面列了元數(shù)據(jù)的管理架構(gòu)。



第一個(gè)是中心架構(gòu),最典型的代表最近開源很火的,它的優(yōu)點(diǎn):第一,實(shí)現(xiàn)很簡單,這是中心架構(gòu)。跟它對應(yīng)的是對稱架構(gòu),它的優(yōu)點(diǎn)是可靠性比較好,缺點(diǎn)是當(dāng)元數(shù)據(jù)更新頻率高的話,如果Palo采用這種數(shù)據(jù)元數(shù)據(jù)更新比較高時(shí),網(wǎng)絡(luò)容易成為瓶頸。



Palo的元數(shù)據(jù)管理分三類,一個(gè)是Leader,一個(gè)是Follower,一個(gè)是Observer,Leader和Follower會參與主節(jié)點(diǎn)的競選。參與選舉,讓大家去選,這會帶來一個(gè)問題,在元數(shù)據(jù)更新時(shí)要求大量的元數(shù)據(jù)同時(shí)更新,當(dāng)你元數(shù)據(jù)很多時(shí),性能會出現(xiàn)瓶頸,所以我們增加了Observer,它只負(fù)責(zé)接受元數(shù)據(jù)更新,這種方式可以最大程度節(jié)省元數(shù)據(jù)更新所帶來的網(wǎng)絡(luò)瓶頸。這種結(jié)合了高可靠,高QPS和可動態(tài)的擴(kuò)縮容,支持頻繁的元數(shù)據(jù)屏障。

業(yè)界有些數(shù)據(jù)庫元數(shù)據(jù)直接存在類似于MySQL系統(tǒng)里面,為了對元數(shù)據(jù)的查詢和保證。但是對于Palo來講這種方案不太適合,在Palo第一版本時(shí)也是這種方案。但是在百度整個(gè)的數(shù)據(jù)量比較大前提下,整個(gè)的元數(shù)據(jù)訪問比較復(fù)雜,而且我們對比了一些復(fù)雜工具之后,會有變態(tài)的情況出現(xiàn)。比如說一個(gè)查詢語句、一個(gè)點(diǎn)擊查詢,會翻譯成成千上萬的語句。如果一下翻譯出來成千上萬語句時(shí),你把它都執(zhí)行完,可能訪問性會存在瓶頸。



我們的內(nèi)存如果BUG掉怎么辦?Checkpoint保證說如果內(nèi)存掛掉的話,還可以同步進(jìn)其他的內(nèi)存,這樣保證了元數(shù)據(jù)的可靠性。數(shù)據(jù)可靠性和元數(shù)據(jù)可靠性大同小異,在這里Palo也支持做副本,也可以自動修復(fù)。之前發(fā)現(xiàn)了一個(gè)用戶在導(dǎo)入數(shù)據(jù)時(shí)只測了一部分,他想導(dǎo)入更快一點(diǎn),占用存儲機(jī)更小一點(diǎn),等他把數(shù)據(jù)都導(dǎo)進(jìn)去時(shí),他擴(kuò)展成了三個(gè)副本,這都是利用Palo修復(fù)的功能,把單副本擴(kuò)展成三個(gè)副本。



這個(gè)是MPP,它是把查詢計(jì)劃與查詢執(zhí)行物理分離。我要說一下Palo的MPP架構(gòu)和OLTP MPP是不一樣的,我們?yōu)榱吮WC整個(gè)的查詢執(zhí)行不影響查詢計(jì)劃,所以把物理分離了。



很多同學(xué)會問我Palo底層用什么實(shí)現(xiàn)?Palo是一個(gè)高度集成系統(tǒng),是查詢與存儲一體的數(shù)據(jù)庫系統(tǒng)。在這里里面,它比較易于實(shí)現(xiàn)一致性保證。在一致性提到兩個(gè)維度,一個(gè)是單調(diào)一致性,還有Consistent View,它是高性能的,最后是易部署,易調(diào)試。像Palo去部署的話一天就部署好了,像一些大的開源系統(tǒng)依賴的環(huán)境和條件比較多,一旦花了幾個(gè)月做好,容易出問題,出了問題去定位比較復(fù)雜。


整體的架構(gòu)是這樣的,下面我講一下后端節(jié)點(diǎn)存儲結(jié)構(gòu)是什么樣的?



首先是列存,這個(gè)概念大家都很熟悉,我不會講太多。只講一點(diǎn)OLTP都是行存的,OLAP可能是對全量數(shù)據(jù)的某幾列進(jìn)行分析,所以把它一列存在一起更好一點(diǎn)。列存的優(yōu)點(diǎn)很方便做壓縮很方便做索引。



這里著重講Palo很特色的地方,它可以支持很多的數(shù)據(jù)模型。數(shù)據(jù)模型建表時(shí)會考慮很多的列式,比如說多少列。在Palo建表時(shí)首先考慮一個(gè)問題,我的哪些列是指標(biāo)列,哪些是維度列。維度列是Time、Id、Country,而指標(biāo)列是Clids、Cost。我們的數(shù)據(jù)庫首先存在序列,然后進(jìn)行排序,Palo會做一個(gè)事情保證全局唯一。



首先已經(jīng)有這樣一份數(shù)據(jù)存在Palo里面,一共有三行,T是這樣的。又新來一份數(shù)據(jù),新來的數(shù)據(jù)第一行它的T列跟之前T列不一樣,它是20140101,1、US。存到T列之后首先把T列不一樣的單獨(dú)存一條,T列相同的把Value列進(jìn)行合并。



如果T列重復(fù)類很大,使用Palo之后其實(shí)存的數(shù)據(jù)量非常小。

查詢時(shí)會進(jìn)行很多的具體操作,這一部分操作在存儲過程中已經(jīng)做完了,也就是說這個(gè)數(shù)據(jù)模型可以極大提升做指標(biāo)維度列的表查詢。除了這個(gè)具體數(shù)據(jù)模型之外,我們也當(dāng)然支持非具體模型。



第二個(gè)是物化視圖,它有兩種優(yōu)化方式和優(yōu)化思路。第一個(gè)是物化視圖把這些表按照某些T進(jìn)行存儲。一個(gè)原始表可以對應(yīng)很多的物化視圖,查詢過程中具體應(yīng)用哪個(gè)物化視圖,這個(gè)是Palo進(jìn)行選擇的。物化視圖本身概念是時(shí)間換空間的技術(shù),然后講一下查詢的優(yōu)化。



第一個(gè)是向量化執(zhí)行,一個(gè)是LLVM。向量執(zhí)行是行式執(zhí)行引擎問題。但是LLVM有一個(gè)問題,它在編譯時(shí)有一個(gè)固定的編譯開銷,這個(gè)大概在百毫秒左右。



下面講一下存儲的小技巧,所有的分布式系統(tǒng)都會分片存儲,這樣有可能會導(dǎo)致某些分片會很大,無論是用哪個(gè)方式進(jìn)行分片,可能每個(gè)分片都很大。另外,做分片分列優(yōu)化時(shí)又會很麻煩,Palo用兩級分片解決的。通常出現(xiàn)用戶第一級分區(qū)是用一個(gè)月分區(qū),第二級分區(qū)是用SATA進(jìn)行分區(qū)。在兩級分區(qū)基礎(chǔ)上,我們?yōu)榱烁咝Ю糜布阅?,我們知道SSD數(shù)據(jù)非常好。



再講一下數(shù)據(jù)導(dǎo)入,剛才提到的OLTP和OLAP的區(qū)別,OLTP有一個(gè)很關(guān)鍵的指標(biāo)是每秒數(shù)據(jù)量。OLAP是講數(shù)據(jù)吞吐量。鑒于此Palo有兩種導(dǎo)入方式,一個(gè)是批量導(dǎo)入,一種是小批量導(dǎo)入。批量導(dǎo)入是利用Hadoop的系統(tǒng),先把批量梳理好再進(jìn)行導(dǎo)入。第二種是不批量導(dǎo)入,利用查詢執(zhí)行框架進(jìn)行導(dǎo)入,它的好處做的頻率好一點(diǎn),多導(dǎo)入事務(wù)提交。具體的運(yùn)行方式也和MySQL不一樣,這兩個(gè)命令都是異步的命令,因?yàn)榕繉?dǎo)入不可能馬上完成,異步命令有一個(gè)生效問題,因?yàn)镻alo在業(yè)務(wù)過程中有很多沒有對一致性要求,我們在一致性上做了很多改進(jìn)。比如說每一批導(dǎo)入都附上版本號,MySQL是不用的。再比方說我們導(dǎo)入的一個(gè)批次數(shù)據(jù),怎么往主版本里面去合?



這里面就給出了導(dǎo)入一個(gè)批次怎么往主版本合的?這里面列出了0-60,61、62都是導(dǎo)入的版本號。先假設(shè)主版本里面存的是0-60數(shù)據(jù),如果往主版本合的時(shí)候,首先想一下把主版本的數(shù)據(jù)讀出來,然后再寫進(jìn)去。通過版本合并可以極大減少數(shù)據(jù)量,但是版本合并的原則就是不能影響線路查詢。



最后是資源隔離,剛才提到Palo在百度內(nèi)部也應(yīng)用了200多個(gè)業(yè)務(wù),我們不可能建200多個(gè)集群。我們的大多數(shù)業(yè)務(wù)都是在一個(gè)共享集群里面,資源隔離有兩層概念。第一層是用戶之間建立的資源隔離,不同用戶不能相互影響。第二,同用戶之內(nèi)設(shè)資源優(yōu)先級隔離,可能我的分析類查詢要優(yōu)于Udhome查詢。



這是Palo的發(fā)布,Palo2013年10月份發(fā)布了第一個(gè)版本。2014年發(fā)布百度云OLAP引擎。2015年進(jìn)行了拍賣,實(shí)際上已經(jīng)面向上市了。



這是在云上的部署方式,類AWS redshift,

on-demand provisioning。這是在云上的一個(gè)界面,瀏覽器去進(jìn)行集群管理,增添的界面,很簡單,一共沒有幾步。



這里再說一下未來的Palo Road map,我們希望在這基礎(chǔ)上開源,希望有更多對數(shù)據(jù)庫感興趣的同學(xué)能夠跟我們一起開發(fā),一起活躍這個(gè)產(chǎn)品。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容