Apache Kylin查詢性能優(yōu)化

作者:周倚平

編輯:Sammi

Apache Kylin?是一個(gè)開源的分布式分析引擎,提供Hadoop之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規(guī)模數(shù)據(jù),最初由eBay Inc. 開發(fā)并貢獻(xiàn)至開源社區(qū)颊咬,可在亞秒內(nèi)查詢巨大的Hive表霉囚。

在Apache Kylin的實(shí)際部署過程中,SQL查詢有時(shí)并不能如預(yù)期在很短的時(shí)間內(nèi)完成抛腕,需要開發(fā)人員進(jìn)行有針對(duì)性的分析和優(yōu)化堤尾。

在進(jìn)行分析肝劲、優(yōu)化之前,我們需要先了解Apache Kylin查詢的整個(gè)生命周期哀峻。這一周期主要分為三個(gè)階段:第一階段的SQL解析階段涡相,第二階段的SQL查詢階段,以及第三階段的數(shù)據(jù)集中和聚合階段剩蟀。接下來(lái),我們將分階段為大家解析應(yīng)如何分析和優(yōu)化Apache Kylin的查詢性能切威。

第一階段:SQL解析

在收到SQL請(qǐng)求后育特,Kylin Query Server會(huì)調(diào)用Calcite對(duì)SQL語(yǔ)句進(jìn)行解析,Calcite的工作流程如下圖先朦。

首先缰冤,Calcite會(huì)將SQL語(yǔ)句通過范式編譯器解析為一顆抽象語(yǔ)義樹(AST)。

然后Calcite對(duì)這棵AST樹進(jìn)行優(yōu)化喳魏,將Project(select部分)和Filter(where部分)Push down至Hadoop集群棉浸。

接著定義implement plan,共有兩種方式:HepPlanner(啟發(fā)式優(yōu)化)和VolcanoPlanner(基于代價(jià)的優(yōu)化)刺彩。目前Kylin只啟用了一些必要的HepPlanner規(guī)則迷郑,大部分使用的是VolcanoPlanner。

第二階段:SQL查詢

針對(duì)子查詢创倔,UNION等場(chǎng)景嗡害,Calcite將SQL分解為多個(gè)OLAPContext,同時(shí)執(zhí)行Filter Pushdown和Limit Pushdown等優(yōu)化手段畦攘,然后提交到HBase上執(zhí)行。

第三階段:數(shù)據(jù)集中和聚合

HBase上的查詢?nèi)蝿?wù)執(zhí)行完成后知押,數(shù)據(jù)返回至Kylin Query Server端叹螟,由Calcite聚合多個(gè)OLAP Context的查詢結(jié)果后鹃骂,最后返回給前端BI。在了解Apache Kylin的查詢生命周期以后罢绽,碰到一些查詢速度較慢的情況畏线,就能夠有針對(duì)性地進(jìn)行分析和優(yōu)化了。

1有缆、從模型設(shè)計(jì)角度象踊,需要合理調(diào)整RowKey中維度的排列順序,原則是把過濾字段(例如PART_DT等日期型字段)和高基維(例如BUYER_ID棚壁,SELLER_ID等客戶字段)放在Rowkey的前列杯矩,這樣能夠顯著提升【第二階段SQL查詢】在HBase上數(shù)據(jù)掃描和I/O讀取的效率。

2袖外、Kylin遵循的是“Scatter and gather”模式史隆,而有的時(shí)候在【第二階段SQL查詢】時(shí)無(wú)法實(shí)現(xiàn)Filter Pushdown和Limit Pushdown等優(yōu)化手段,需要等待數(shù)據(jù)集中返回Kylin后再篩選數(shù)據(jù)曼验,這樣數(shù)據(jù)吞吐量會(huì)很大泌射,影響查詢性能。優(yōu)化方法是重寫SQL語(yǔ)句鬓照。

例如熔酷,該SQL查詢的篩選條件(斜體加粗部分)放在子查詢中,因此無(wú)法實(shí)現(xiàn)Filter Pushdown豺裆。

select KYLIN_SALES.PART_DT, sum(KYLIN_SALES.PRICE)

from KYLIN_SALES

inner join (select ACCOUNT_ID, ACCOUNT_BUYER_LEVEL from KYLIN_ACCOUNT whereACCOUNT_COUNTRY = 'US' ) as TT

on KYLIN_SALES.BUYER_ID = TT.ACCOUNT_ID

group by KYLIN_SALES.PART_DT

正確的寫法應(yīng)該是:

select KYLIN_SALES.PART_DT, sum(KYLIN_SALES.PRICE)

from KYLIN_SALES

inner join KYLIN_ACCOUNT as TT on KYLIN_SALES.BUYER_ID = TT.ACCOUNT_ID

where TT.ACCOUNT_COUNTRY = 'US'

group by KYLIN_SALES.PART_DT

如下圖所示拒秘,可以在日志中查看Filter Pushdown是否成功。

3臭猜、查看后臺(tái)日志躺酒,如果查詢擊中了Base Cuboid,則【第三階段數(shù)據(jù)集中和聚合】將會(huì)花費(fèi)大量時(shí)間蔑歌,優(yōu)化方法是調(diào)整模型中聚合組羹应,聯(lián)合維度,必要維度的設(shè)計(jì)次屠。

相關(guān)優(yōu)化方法可以參考以下技術(shù)文章:

Apache Kylin高級(jí)設(shè)置:聚合組(Aggregation Group)原理解析

Apache Kylin高級(jí)設(shè)置:聯(lián)合維度(Joint Dimension)原理解析

Apache Kylin高級(jí)設(shè)置:必要維度 (Mandatory Dimension)原理解析

在日志中可以看到查詢擊中的Cuboid組合园匹,如下圖紅框中的131071,將其轉(zhuǎn)換為二進(jìn)制數(shù)值是0x1 1111 1111 1111 1111帅矗,從右至左偎肃,共有17個(gè)1,表示該Cuboid中包含了17個(gè)維度(這里從右至左指代的維度的對(duì)應(yīng)順序是Cube模型中Rowkey中自下而上定義的維度)浑此,而Cube模型中所有維度的數(shù)量是17累颂,說(shuō)明擊中了Base Cuboid。

4、從Kylin Query Server處理效率角度紊馏,需要實(shí)時(shí)監(jiān)控Kylin節(jié)點(diǎn)的CPU占有率和內(nèi)存消耗料饥,如果兩者很高的話可能導(dǎo)致【第一階段SQL解析】的效率下降,優(yōu)化方法是增加Kylin節(jié)點(diǎn)CPU和JVM配置朱监。

具體方法是修改setenv.sh中的KYLIN_JVM_SETTINGS配置項(xiàng)岸啡。

5、監(jiān)控BI前端赫编,Kylin Query Server節(jié)點(diǎn)和Hadoop集群之間的網(wǎng)絡(luò)通信狀態(tài)巡蘸,大數(shù)據(jù)集傳輸可能引起網(wǎng)絡(luò)堵塞,尤其是在多并發(fā)查詢的情況下更容易發(fā)生網(wǎng)絡(luò)堵塞擂送,進(jìn)而對(duì)查詢性能產(chǎn)生顯著影響悦荒。優(yōu)化方法是確保BI前端、Kylin節(jié)點(diǎn)嘹吨、Hadoop集群之間的網(wǎng)絡(luò)通暢搬味,一個(gè)簡(jiǎn)單的方法是用PING命令查看網(wǎng)絡(luò)之間的延遲。

6蟀拷、對(duì)于一些復(fù)雜的SQL語(yǔ)句碰纬,如果包含子查詢的話,盡量避免Left Join操作问芬,尤其是Join的兩個(gè)數(shù)據(jù)集都較大的情況下悦析,會(huì)對(duì)查詢性能有顯著的影響。建議將SQL的數(shù)據(jù)處理邏輯放在ETL階段此衅,而前端SQL邏輯保持簡(jiǎn)單明了她按。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炕柔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媒佣,老刑警劉巖匕累,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異默伍,居然都是意外死亡欢嘿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門也糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炼蹦,“玉大人,你說(shuō)我怎么就攤上這事狸剃∑” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虑省。 經(jīng)常有香客問我匿刮,道長(zhǎng),這世上最難降的妖魔是什么探颈? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任熟丸,我火速辦了婚禮,結(jié)果婚禮上伪节,老公的妹妹穿的比我還像新娘光羞。我一直安慰自己,他們只是感情好怀大,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布纱兑。 她就那樣靜靜地躺著,像睡著了一般叉寂。 火紅的嫁衣襯著肌膚如雪萍启。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天屏鳍,我揣著相機(jī)與錄音勘纯,去河邊找鬼。 笑死钓瞭,一個(gè)胖子當(dāng)著我的面吹牛驳遵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播山涡,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼堤结,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鸭丛?” 一聲冷哼從身側(cè)響起竞穷,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳞溉,沒想到半個(gè)月后瘾带,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熟菲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年看政,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抄罕。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡允蚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呆贿,到底是詐尸還是另有隱情嚷兔,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站谴垫,受9級(jí)特大地震影響章母,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翩剪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一乳怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧前弯,春花似錦蚪缀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浙巫,卻和暖如春金蜀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背的畴。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工渊抄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丧裁。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓护桦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親煎娇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子二庵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容