編者注:Kyligence的聯(lián)合創(chuàng)始人兼CEO Luke Han在2017年5月22-25日舉行的Strata Data倫敦大會(huì)上做題為“Apache Kylin在中國的使用案例”的演講。
基于Hadoop的SQL一直在被持續(xù)地改進(jìn)掌呜,但是一個(gè)查詢等幾分鐘到幾小時(shí)還是非常正常缀皱。在這篇博文里,將會(huì)介紹開源的分布式分析引擎Apache Kylin虫啥,尤其會(huì)重點(diǎn)介紹它是如何以數(shù)量級加速大數(shù)據(jù)查詢爵嗅,以及在2.0版里面為交互式BI所提供的新特性慢睡,包括對雪花模型的支持和流式建立數(shù)據(jù)立方枢泰。
Apache Kylin****是什么描融?
Kylin是一個(gè)在Hadoop上的OLAP引擎。如圖1所示衡蚂,Kylin位于Hadoop之上窿克,向上層的應(yīng)用提供了基于標(biāo)準(zhǔn)SQL接口的關(guān)系型數(shù)據(jù)。
圖1 Apache Kylin的位置毛甲。圖片由Yang Li友情提供
Kylin可以處理大數(shù)據(jù)集年叮,從查詢延遲上講是很快的,這也是它和其他基于Hadoop的SQL的區(qū)別玻募。比如只损,我們所知道的使用Kylin的最大的生產(chǎn)系統(tǒng)實(shí)例是在今日頭條,一個(gè)中國的新聞推送應(yīng)用七咧。頭條有一個(gè)包含3萬億條記錄的表改执,Kylin對它的平均查詢響應(yīng)時(shí)間低于1秒。下一節(jié)我們會(huì)討論Kylin是怎么實(shí)現(xiàn)這么快的查詢坑雅。
Kylin引擎的另一個(gè)特點(diǎn)是它可以支持復(fù)雜的數(shù)據(jù)模型。例如衬横,太平洋保險(xiǎn)(CPIC裹粤,中國的一個(gè)保險(xiǎn)集團(tuán)公司)有一個(gè)多達(dá)60維的模型。 Kylin提供標(biāo)準(zhǔn)的JDBC / ODBC / RestAPI接口,可實(shí)現(xiàn)與任何SQL應(yīng)用程序的連接遥诉。
Kyligence還開發(fā)了一個(gè)在線演示(http://kapdemo.chinaeast.cloudapp.chinacloudapi.cn:8080/ )拇泣,展示了使用10億條航班記錄的BI體驗(yàn)。你可以查看這里來了解矮锈。比如霉翔,在舊金山國際機(jī)場過去20年里延誤最久的航班是哪個(gè)。(使用用戶名“analyst”和密碼“analyst”登錄苞笨,選擇“airline_cube”债朵,拖放維度和事實(shí)數(shù)據(jù)來查詢這個(gè)數(shù)據(jù)集)
一個(gè)零售業(yè)場景:展示****Kylin****的速度
Kylin比傳統(tǒng)的基于Hadoop的SQL要快,是因?yàn)樗捎昧祟A(yù)計(jì)算來在SQL執(zhí)行前先行一步瀑凝。例如序芦,設(shè)想一個(gè)零售業(yè)務(wù)場景,你需要處理非常多的訂單粤咪,每個(gè)訂單包含多個(gè)商品谚中。如果想知道訂單取消和退貨造成的影響,一個(gè)分析人員可能需要寫一個(gè)查詢來在某個(gè)時(shí)間段內(nèi)按照“returnflas(退貨標(biāo)記)”和“orderstatus(訂單狀態(tài))”來匯總收入進(jìn)行匯報(bào)寥枝,如圖2 所示宪塔。圖里面顯示了這個(gè)查詢被編譯成的關(guān)系表達(dá)式,也叫執(zhí)行計(jì)劃囊拜。
圖2 一個(gè)典型的OLAP查詢的時(shí)間復(fù)雜度某筐。圖片由Yang Li友情提供
從這個(gè)執(zhí)行計(jì)劃可以很容易地看出,這個(gè)執(zhí)行的時(shí)間復(fù)雜度至少是O(N)艾疟,這里N是表里的總行數(shù)来吩,因?yàn)槊啃卸家辽俦辉L問一次。同時(shí)我們假定要關(guān)聯(lián)的表都已經(jīng)很好地被分區(qū)和索引過了蔽莱,因此花費(fèi)比較大的關(guān)聯(lián)操作也可以在線性的時(shí)間復(fù)雜度上完成弟疆,但在實(shí)際場景里這種情況是不大可能的。
這個(gè)O(N)的時(shí)間復(fù)雜度并不好盗冷,因?yàn)檫@意味著如果數(shù)據(jù)量增長十倍怠苔,則查詢時(shí)間也會(huì)慢10倍。現(xiàn)在一個(gè)查詢需要花1秒鐘仪糖,那么以后隨著數(shù)據(jù)的增長柑司,這個(gè)時(shí)間會(huì)變成10秒甚至是100秒。我們想要的是無論數(shù)據(jù)量大小锅劝,這個(gè)查詢時(shí)間都是固定不變的攒驰。
Kylin的解決方法是預(yù)計(jì)算。整體思路是故爵,如果我們提前知道查詢的模式玻粪,我們就能預(yù)先計(jì)算出整個(gè)執(zhí)行的一部分。在上面這個(gè)例子里,就是預(yù)先計(jì)算Aggregate劲室、Join和表掃描操作伦仍。生成的結(jié)果是一個(gè)立方體理論里的數(shù)據(jù)立方(或者可以把它叫做“實(shí)例化的總結(jié)表”,如果這樣聽起來覺得更好的話)很洋。
如圖3所示充蓝,最初的執(zhí)行計(jì)劃就被轉(zhuǎn)換成了基于數(shù)據(jù)立方之上。這個(gè)數(shù)據(jù)立方體包含了按照“returnflag(退貨標(biāo)記)”喉磁、“orderstatus(訂單狀態(tài))”和“date(日期)”進(jìn)行匯總的記錄谓苟。因?yàn)橥素洏?biāo)記和訂單狀態(tài)是一個(gè)固定的數(shù)量,而日期范圍被限定在3年(大概1000天)线定。這就意味著這個(gè)數(shù)據(jù)立方體里的行數(shù)最多就是“標(biāo)記數(shù)×狀態(tài)數(shù)×天數(shù)”娜谊,對O定義的時(shí)間復(fù)雜度來說就是一個(gè)常量。這個(gè)新的執(zhí)行計(jì)劃將會(huì)保證不管源數(shù)據(jù)有多大都有一個(gè)固定的執(zhí)行時(shí)間斤讥。這就我們想要的效果纱皆!
圖3 通過預(yù)計(jì)算實(shí)現(xiàn)從O(N)到O(1)。圖片由Yang Li友情提供
Kylin****的架構(gòu)一覽
如我們所見芭商,Kylin是一個(gè)依賴于預(yù)計(jì)算的系統(tǒng)派草。其核心是基于經(jīng)典的立方體理論,并發(fā)展成一個(gè)大數(shù)據(jù)上的SQL解決方案(見圖4)铛楣。它使用模型和立方體概念來定義預(yù)計(jì)算的空間近迁。構(gòu)建引擎從數(shù)據(jù)源載入數(shù)據(jù),并在使用MapReduce或Spark的分布式系統(tǒng)上進(jìn)行預(yù)計(jì)算簸州。被計(jì)算出來的立方體被存儲在HBase里鉴竭。當(dāng)一個(gè)查詢來到時(shí),Kylin把它編譯成一個(gè)關(guān)系表達(dá)式岸浑,找到匹配的模型搏存,并基于預(yù)計(jì)算好的數(shù)據(jù)立方體而不是原始數(shù)據(jù)執(zhí)行這個(gè)表達(dá)式。
圖4 Apache Kylin的架構(gòu)矢洲。圖片由Yang Li友情提供
這里的關(guān)鍵就是建模璧眠。如果你對數(shù)據(jù)以及分析的需求有非常好的理解,你是可以用正確的模型和立方體定義來找到正確的預(yù)計(jì)算读虏。接著责静,絕大多數(shù)(如果不是全部)的查詢都可以被轉(zhuǎn)化成對此立方體的查詢淘菩。如圖5所示菩佑,執(zhí)行時(shí)間復(fù)雜度可以被降低到O(1),從而獲得非晨碛浚快的查詢速度揩徊,無論原始數(shù)據(jù)有多大睦焕。
圖5 O(N)和O(1)的對比藐握。圖片由Yang Li友情提供
(延展閱讀:一個(gè)展示Kylin在不同數(shù)據(jù)量級別上擁有一致的表現(xiàn)的星形模型基準(zhǔn)測試:https://github.com/Kyligence/ssb-kylin ) Kylin 2.0****的特性
對雪花模型的支持和****TPC-H****基準(zhǔn)測試
Kylin 2.0引入了對元數(shù)據(jù)建模的增強(qiáng),并且可以支持開箱即用的雪花模型垃喊。為了演示建模和SQL能力上的改進(jìn),我們進(jìn)行了用Kylin 2.0運(yùn)行TPC-H查詢的基準(zhǔn)測試袜炕。
需要注意的是本谜,這里的目標(biāo)并不是想與其他人的TPC-H結(jié)果進(jìn)行比較。一方面偎窘,根據(jù)TPC-H規(guī)范乌助,不允許在表之間進(jìn)行預(yù)先計(jì)算,因此在這個(gè)意義上陌知,Kylin不能算是有效的TPC-H系統(tǒng)他托。另一方面,我們還沒有對這些查詢進(jìn)行性能調(diào)優(yōu)仆葡。改善的空間還是很大的赏参。
根據(jù)相同的零售場景,讓我們快速查看一些有趣的TPC-H查詢沿盅。圖6是TPC-H查詢07把篓。SQL里面的字太小,可能看不清楚腰涧,但它給出了查詢的復(fù)雜性的粗略感覺韧掩。該圖是執(zhí)行計(jì)劃,強(qiáng)調(diào)了預(yù)計(jì)算(白色)與在線計(jì)算(藍(lán)色)的部分窖铡。很容易看出疗锐,大部分關(guān)系運(yùn)算符是預(yù)先計(jì)算的。剩下的Sort / Proj / Filter在很少的記錄上工作费彼,因此查詢可以超快滑臊。在相同的硬件和相同的數(shù)據(jù)集上,Kylin用了0.17秒完成敌买,而Hive + Tez對此查詢運(yùn)行了35.23秒简珠。這顯示了預(yù)計(jì)算所帶來的差異。
圖6 TPC-H的查詢07虹钮。圖片由Yang Li友情提供
圖7所示的TPC-H查詢11是另一個(gè)例子聋庵。這個(gè)查詢有四個(gè)子查詢,比前一個(gè)更復(fù)雜芙粱。 其執(zhí)行計(jì)劃包括兩個(gè)分支祭玉,每個(gè)分支從預(yù)先計(jì)算的立方體載入數(shù)據(jù)。 分支結(jié)果再連接起來春畔,這是一個(gè)復(fù)雜的在線計(jì)算脱货。隨著在線計(jì)算部分的增加岛都,預(yù)計(jì)算的部分減少,Kylin的運(yùn)行時(shí)間更長:3.42秒振峻。 然而臼疫,完全在線計(jì)算的Hive + Tez仍然要慢一點(diǎn),運(yùn)行時(shí)間為15.87秒扣孟。
圖7 TPC-H的查詢11烫堤。圖片由Yang Li友情提供
(有關(guān)Kylin和TPC-H的更多詳細(xì)信息,請參閱此鏈接:https://github.com/Kyligence/kylin-tpch 此鏈接包含可以在你自己的環(huán)境中重復(fù)基準(zhǔn)測試的步驟凤价,以及我們在兩個(gè)不同Hadoop集群中測試的所有TPC-H查詢的性能結(jié)果鸽斟。)
為近實(shí)時(shí)分析準(zhǔn)備的流式立方體
預(yù)先計(jì)算給ETL流程增加了額外的時(shí)間,這在實(shí)時(shí)場景中會(huì)成為一個(gè)問題利诺。為了解決這個(gè)問題富蓄,Kylin現(xiàn)在支持增量加載新添加的數(shù)據(jù),而不會(huì)影響歷史數(shù)據(jù)慢逾。 已有RestAPI可用于自動(dòng)觸發(fā)增量構(gòu)建立倍。每日構(gòu)建一次是最常見的,現(xiàn)在更頻繁的數(shù)據(jù)加載也是可行的氛改。
從1.6版開始帐萎,Kylin可以直接從Kafka獲取數(shù)據(jù),并進(jìn)行近乎實(shí)時(shí)的數(shù)據(jù)分析胜卤。使用基于內(nèi)存的立方體算法疆导,微型增量構(gòu)建可以在幾分鐘內(nèi)完成。生成的結(jié)果是許多小的立方體分片葛躏,可以給查詢提供實(shí)時(shí)的結(jié)果澈段。
為了展示這個(gè)特性是如何運(yùn)作的,我們構(gòu)建了一個(gè)演示網(wǎng)站(http://hub.kyligence.io/twitter-demo/twitter/ )來實(shí)時(shí)分析Twitter消息舰攒。它運(yùn)行在一個(gè)八個(gè)節(jié)點(diǎn)的AWS集群上败富,有三個(gè)Kafka broker。輸入是一個(gè)Twitter樣本源摩窃,每秒有超過10K條消息兽叮。立方體的平均復(fù)雜度是:九個(gè)維度和三個(gè)測量數(shù)據(jù)。增量構(gòu)建是每兩分鐘觸發(fā)一次猾愿,并在三分鐘內(nèi)完成鹦聪。總體而言蒂秘,系統(tǒng)在實(shí)時(shí)性上有五分鐘的延遲泽本。
圖8 近實(shí)時(shí)的Twitter分析。圖片由Yang Li友情提供
該演示按照語言和設(shè)備維度顯示了Twitter消息的趨勢姻僧。在圖8中可以看到规丽,美國白天的英文消息量上升蒲牧,而亞洲語言的消息量在夜間下降。演示里還有一個(gè)標(biāo)簽云赌莺,用以顯示最新的熱門話題冰抢。在標(biāo)簽云下面是最熱門標(biāo)簽的趨勢。所有圖表都是實(shí)時(shí)到最近五分鐘艘狭。
總結(jié)
Apache Kylin是Hadoop上一個(gè)流行的OLAP引擎晒屎。通過使用預(yù)計(jì)算技術(shù),它可以使SQL對大數(shù)據(jù)的查詢速度有數(shù)量級的加快缓升,并使交互式BI和其他在線應(yīng)用程序能夠直接在大數(shù)據(jù)上運(yùn)行。
Kylin 2.0是最新版本蕴轨,可以在:http://kylin.apache.org/download/ 下載港谊。新版本的特性包括:Hadoop上的小于秒級的SQL延遲; 雪花模型的支持和成熟的SQL功能; 流式立方體用于近實(shí)時(shí)分析; 內(nèi)置時(shí)間/窗口/百分位數(shù)功能;和可以將構(gòu)建時(shí)間縮短一半的Spark構(gòu)建立方體橙弱。
相關(guān)資料:
Apache Kylin的星形模型基準(zhǔn)測試
Apache Kylin的TPC-H基準(zhǔn)測試
Kyligence的演示歧寺、交互式BI和Twitter流式分析
This article originally appeared in English: "Bringing interactive BI to big data".
Yang Li
Yang Li是Kyligence的聯(lián)合創(chuàng)始人兼CTO,以及Apache Kylin項(xiàng)目的聯(lián)合創(chuàng)立者和PMC成員棘脐。 作為Kylin的技術(shù)主管和架構(gòu)師斜筐,Yang專注于大數(shù)據(jù)分析、并行計(jì)算蛀缝、數(shù)據(jù)索引顷链、關(guān)系代數(shù)、近似算法等技術(shù)屈梁。他曾任eBay分析數(shù)據(jù)基礎(chǔ)設(shè)施部高級架構(gòu)師嗤练。他還是IBM InfoSphere BigInsights的技術(shù)領(lǐng)導(dǎo)者。在此期間在讶,他負(fù)責(zé)BigInsights這一基于Hadoop的開源平臺煞抬,并獲得了IBM杰出技術(shù)成就獎(jiǎng)。他曾經(jīng)是摩根士丹利的副總裁构哺,負(fù)責(zé)全球監(jiān)管報(bào)表基礎(chǔ)架構(gòu)革答。
(文章轉(zhuǎn)載自O(shè)ReillyData)