深入 Apache Kylin Cube 与查询优化
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
近幾年,Apache Kylin作為一個(gè)高速的開源分布式大數(shù)據(jù)查詢引擎正在迅速崛起。它充分發(fā)揮Hadoop、Spark、HBase等技術(shù)的優(yōu)勢(shì),通過對(duì)超大規(guī)模數(shù)據(jù)集進(jìn)行預(yù)計(jì)算,實(shí)現(xiàn)秒級(jí)甚至亞秒級(jí)的查詢響應(yīng)時(shí)間,同時(shí)提供標(biāo)準(zhǔn)SQL接口。目前,Apache Kylin已在全球范圍得到了廣泛應(yīng)用,如百度、美團(tuán)、今日頭條、eBay等,支撐著單個(gè)業(yè)務(wù)上萬億規(guī)模的數(shù)據(jù)查詢業(yè)務(wù)。在超高性能的背后,Cube是至關(guān)重要的核心。一個(gè)優(yōu)化得當(dāng)?shù)腃ube既能滿足高速查詢的需要,又能節(jié)省集群資源。本文將從多個(gè)方面入手,介紹如何通過優(yōu)化Cube提升系統(tǒng)性能。
1、Cube基本原理
在傳統(tǒng)多維分析就有多維立方體(OLAP Cube)的概念。Apache Kylin在大數(shù)據(jù)領(lǐng)域?qū)ube進(jìn)行了擴(kuò)展,通過執(zhí)行 MapReduce/Spark任務(wù)構(gòu)建Cube,對(duì)業(yè)務(wù)所需的維度組合和度量進(jìn)行預(yù)聚合,當(dāng)查詢到達(dá)時(shí)直接訪問預(yù)計(jì)算聚合結(jié)果,省去對(duì)大數(shù)據(jù)的掃描和運(yùn)算,這就是Apache Kylin高性能查詢的基本實(shí)現(xiàn)原理。
如圖1所示,Apache Kylin會(huì)對(duì)SQL的查詢計(jì)劃進(jìn)行改寫,把源表掃描、多表連接、指標(biāo)聚合等在線計(jì)算轉(zhuǎn)換成對(duì)預(yù)計(jì)算結(jié)果的讀取,極大減少了在線計(jì)算和I/O讀寫的代價(jià)。 而查詢所訪問的預(yù)計(jì)算結(jié)果保存在Cuboid當(dāng)中(見圖1紅色方框),Cuboid大小只和維度列的基數(shù)有關(guān),和源數(shù)據(jù)行數(shù)無關(guān),這使得查詢的時(shí)間復(fù)雜度可以取得一個(gè)量級(jí)的提升。
圖 - 1預(yù)計(jì)算查詢計(jì)劃
一個(gè)Cuboid對(duì)應(yīng)著一組分析的維度,并保存了度量的聚合結(jié)果。Cube就是所有Cuboid的集合,如圖2所示,每個(gè)節(jié)點(diǎn)代表一個(gè)Cuboid。當(dāng)查詢到達(dá),Apache Kylin會(huì)根據(jù)SQL所使用的維度列在Cube中選擇最合適的Cuboid,最大程度地節(jié)省查詢時(shí)間。
圖 - 2 Cube示意圖
2、Cube優(yōu)化案例
社區(qū)不乏一些使用Apache Kylin的成功案例分享,但經(jīng)常還會(huì)看到很多朋友遇到性能問題,例如SQL查詢過慢、Cube構(gòu)建時(shí)間過長(zhǎng)甚至失敗、Cube膨脹率過高等等。究其原因,大多數(shù)問題都是由于Cube設(shè)計(jì)不當(dāng)造成的。因此,合理地進(jìn)行Cube優(yōu)化就顯得尤為重要。
這里先分享兩個(gè)社區(qū)用戶進(jìn)行優(yōu)化的案例:
案例1 – 提升Cube查詢效率
背景:某智能硬件企業(yè)使用Apache Kylin作為大數(shù)據(jù)平臺(tái)查詢引擎,對(duì)查詢性能有較高要求,希望提高查詢效率。
數(shù)據(jù):
- 9個(gè)維度,其中1個(gè)維度基數(shù)是千萬級(jí),1個(gè)維度基數(shù)是百萬級(jí),其他維度基數(shù)是10w以內(nèi)
- 單月原始數(shù)據(jù)6億條
優(yōu)化方案:
- 數(shù)據(jù)清理:將時(shí)間戳字段轉(zhuǎn)換成日期,降低維度的基數(shù)
- 調(diào)整聚合組:不會(huì)同時(shí)在查詢中出現(xiàn)的維度分別包含在不同聚合組(如崩潰時(shí)間、上傳時(shí)間等)
- 設(shè)置必須維度:把某些超低基數(shù)維度設(shè)為必須維度
優(yōu)化成果:
- 查詢性能:提升5倍
- 構(gòu)建時(shí)間:縮短30%
- Cube大小:減小74%
案例二 – 提升Cube構(gòu)建效率
背景:某金融企業(yè)使用Apache Kylin作為報(bào)表分析引擎,發(fā)現(xiàn)Cube膨脹率多大、構(gòu)建時(shí)間過長(zhǎng),希望對(duì)這一情況進(jìn)行改善。
硬件:20臺(tái)高配置PC服務(wù)器
數(shù)據(jù):事實(shí)表有100多萬條記錄,度量是某些列的平均值
優(yōu)化方案:
- 維度精簡(jiǎn):去除查詢中不會(huì)出現(xiàn)的維度
- 調(diào)整聚合組:設(shè)置多個(gè)聚合組,每個(gè)聚合組內(nèi)設(shè)置多組聯(lián)合維度
優(yōu)化成果:
3、Cube優(yōu)化原理
從以上案例可以看出,通過Cube調(diào)優(yōu)可以顯著改善Apache Kylin的構(gòu)建性能、查詢性能及Cube膨脹率。那么這些改進(jìn)的背后究竟是什么原理呢?
為了深入理解Cube,首先要先了解Cuboid生成樹。如圖3所示,在Cube中,所有的Cuboid組成一個(gè)樹形結(jié)構(gòu),根節(jié)點(diǎn)是全維度的Base Cuboid,再依次逐層聚合掉每個(gè)維度生成子Cuboid,直到出現(xiàn)0個(gè)維度時(shí)結(jié)束。圖3中綠色部分就是一條完整的Cuboid生成路徑。預(yù)計(jì)算的過程實(shí)際就是按照這個(gè)流程構(gòu)建所有的Cuboid。
圖 - 3 Cuboid生成樹
通過這顆Cuboid生成樹,我們不難發(fā)現(xiàn):當(dāng)維度數(shù)量過多,就會(huì)導(dǎo)致Cuboid數(shù)量以指數(shù)級(jí)膨脹;如果維度基數(shù)過大,還會(huì)使所在的Cuboid結(jié)果集變大。這些都是影響Cube膨脹率和構(gòu)建時(shí)間的重要因素。
但是,所有的Cuboid都是必要的嗎?實(shí)際上,在多數(shù)情況下,我們并不需要這里的每一個(gè)Cuboid,因此需要對(duì)Cuboid生成樹做剪枝。剪枝可以從兩個(gè)方面入手:數(shù)據(jù)特性、查詢需求。首先介紹數(shù)據(jù)特性,考慮下圖的兩個(gè)Cuboid,左側(cè)Cuboid包含4個(gè)維度(ABCD),右側(cè)Cuboid包含3個(gè)維度(ABC),而兩個(gè)Cuboid都包含相同(或極度相近)行數(shù)的記錄,說明讀取兩個(gè)Cuboid結(jié)果的代價(jià)是一樣的,同時(shí)左側(cè)Cuboid除了具有右側(cè)Cuboid的查詢支持能力外,還能支持帶有維度D的查詢,因此右側(cè)Cuboid就可以被去除。
圖 - 4 去除冗余Cuboid
再考慮查詢需求,在報(bào)表或多維分析場(chǎng)景中,有些維度是每次查詢都會(huì)出現(xiàn)的,如年份;有些維度總是一起出現(xiàn)的,如開始時(shí)間、結(jié)束時(shí)間;有些維度間是有層級(jí)關(guān)系的,如商品分類或地理信息。充分利用查詢的這些實(shí)際需求也能去除不需要的Cuboid,例如:如果年份是必要的,那么所有不包含年份維度的Cuboid都可以被去除;如果兩個(gè)維度總是同時(shí)出現(xiàn),那么這這些維度單獨(dú)出現(xiàn)的Cuboid就可以被去除。
在Apache Kylin中,可以通過設(shè)置Cube的維度組合規(guī)則來去除無用的Cuboid。首先,可以通過定義(1)聚合組對(duì)維度分組,只在每個(gè)聚合組內(nèi)生成Cuboid。此外,在單個(gè)聚合組內(nèi)部,還可以設(shè)置維度組合規(guī)則,如:(2)必須維度用于定義一定出現(xiàn)的維度、(3)聯(lián)合維度用于定義一組同時(shí)出現(xiàn)的維度、(4)層級(jí)維度用于定義一組有層級(jí)關(guān)系的維度,詳細(xì)的Cuboid生成規(guī)則如下圖所示:
圖 - 5聚合組規(guī)則
(5)衍生維度
維表中可以由主鍵推導(dǎo)出值的列可以作為衍?維度。使用場(chǎng)景:以星型模型接入時(shí)。例如用戶維表可以從userid推導(dǎo)出用戶的姓名,年齡,性別。優(yōu)化效果:維度表的N個(gè)維度組合成的cuboid個(gè)數(shù)會(huì)從2的N次方降為2。
(1)聚集組
聚集組:用來控制哪些cuboid需要計(jì)算。
適用場(chǎng)景:不是只需要計(jì)算base cuboid的情況下,都需要聚集組。
注意事項(xiàng):一個(gè)維度可以出現(xiàn)在多個(gè)聚集組中,但是build期間只會(huì)計(jì)算一次。
如果不設(shè)置聚集組,默認(rèn)情況下只會(huì)計(jì)算 base cuboid。
聚集組不宜太多。
(2)強(qiáng)制維度
強(qiáng)制維度:所有cuboid必須包含的維度,不會(huì)計(jì)算不包含強(qiáng)制維度的cuboid。
適用場(chǎng)景:可以將確定在查詢時(shí)一定會(huì)使用的維度設(shè)為強(qiáng)制維度。例如,時(shí)間維度。
優(yōu)化效果:將一個(gè)維度設(shè)為強(qiáng)制維度,則cuboid個(gè)數(shù)直接減半。
(3)聯(lián)合維度
聯(lián)合維度:將幾個(gè)維度視為一個(gè)維度。
適用場(chǎng)景: 1 可以將確定在查詢時(shí)一定會(huì)同時(shí)使用的幾個(gè)維度設(shè)為一個(gè)聯(lián)合維度。
2 可以將基數(shù)很小的幾個(gè)維度設(shè)為一個(gè)聯(lián)合維度。
3 可以將查詢時(shí)很少使用的幾個(gè)維度設(shè)為一個(gè)聯(lián)合維度。
優(yōu)化效果:將N個(gè)維度設(shè)置為聯(lián)合維度,則這N個(gè)維度組合成的cuboid個(gè)數(shù)會(huì)從2的N次方減少到1。
(4)層次維度
層次維度:具有一定層次關(guān)系的維度。
使用場(chǎng)景:像年,月,日;國(guó)家,省份,城市這類具有層次關(guān)系的維度。
優(yōu)化效果:將N個(gè)維度設(shè)置為層次維度,則這N個(gè)維度組合成的cuboid個(gè)數(shù)會(huì)從2的N次方減少到N+1。
(6)Extended Column
在OLAP分析場(chǎng)景中,經(jīng)常存在對(duì)某個(gè)id進(jìn)行過濾,但查詢結(jié)果要展示為name的情況,比如user_id和user_name。這類問題通常有三種解決方式:
a. 將ID和Name都設(shè)置為維度,查詢語句類似select name, count(*) from table where id = 1 group by id,name。這種方式的問題是會(huì)導(dǎo)致維度增多,導(dǎo)致預(yù)計(jì)算結(jié)果膨脹;
b. 將id和name都設(shè)置為維度,并且將兩者設(shè)置為聯(lián)合。這種方式的好處是保持維度組合數(shù)不會(huì)增加,但限制了維度的其它優(yōu)化,比如ID不能再被設(shè)置為強(qiáng)制維度或者層次維度;
c. 將ID設(shè)置為維度,Name設(shè)置為特殊的Measure,類型為Extended Column。這種方式既能保證過濾id且查詢name的需求,同時(shí)也不影響id維度的進(jìn)一步優(yōu)化。
所以此類需求我們推薦使用 Extended Column。
(7)HBase Rowkey順序
簡(jiǎn)單的講,查詢頻率越高的維度在Rowkey中的順序需要越靠前。
(8)調(diào)整Cube并發(fā)粒度
當(dāng)Segment中某個(gè)Cuboid的大小超出一定的閾值時(shí),系統(tǒng)會(huì)將該Cuboid的數(shù)據(jù)分片到多個(gè)Hbase Region Server,從而實(shí)現(xiàn)Cuboid數(shù)據(jù)讀取的并行化,優(yōu)化Cube的查詢速度。
kylin的默認(rèn)設(shè)置中
kylin.storage.hbase.min-region-count=1,
kylin.storage.hbase.max-region-count=500,?
kylin.storage.hbase.region-cut-gb=5
在實(shí)際應(yīng)用中(根據(jù)實(shí)際數(shù)據(jù)量調(diào)整),可以將
kylin.storage.hbase.min-region-count=2,
kylin.storage.hbase.max-region-count=100,
kylin.storage.hbase.region-cut-gb=1
上面設(shè)置為最小為2個(gè)分區(qū),每個(gè)分區(qū)大小為1G,最多設(shè)置100個(gè)region分區(qū)。
Refer:
[1]?Apache Kylin 深入Cube和查詢優(yōu)化
http://geek.csdn.net/news/detail/199615
[2]?Apache Kylin 維度優(yōu)化指南
http://bit.ly/2llpR69
[3]?【技術(shù)帖】Apache Kylin Cube優(yōu)化方式
http://bit.ly/2DqB8tg
轉(zhuǎn)載于:https://my.oschina.net/leejun2005/blog/79113
總結(jié)
以上是生活随笔為你收集整理的深入 Apache Kylin Cube 与查询优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#非泛型集合类-使用HashTable
- 下一篇: mongodb replicaset s