Kylin的學習與介紹

Kylin 簡介

1.1 Kylin定義

Apache Kylin是一個開源的分佈式分析引擎,提供Hadoop/Spark之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規模數據,最初由eBay Inc開發並貢獻至開源社區。它能在亞秒內查詢巨大的Hive表。

1.2 Kylin特點

Kylin的主要特點包括支持SQL接口、支持超大規模數據集、亞秒級響應、可伸縮性、高吞吐率、BI工具集成等。
1)標準SQL接口:Kylin是以標準的SQL作爲對外服務的接口。
2)支持超大數據集:Kylin對於大數據的支撐能力可能是目前所有技術中最爲領先的。早在2015年eBay的生產環境中就能支持百億記錄的秒級查詢,之後在移動的應用場景中又有了千億記錄秒級查詢的案例。
3)亞秒級響應:Kylin擁有優異的查詢相應速度,這點得益於預計算,很多複雜的計算,比如連接、聚合,在離線的預計算過程中就已經完成,這大大降低了查詢時刻所需的計算量,提高了響應速度。
4)可伸縮性和高吞吐率:單節點Kylin可實現每秒70個查詢,還可以搭建Kylin的集羣。
5)BI工具集成
Kylin可以與現有的BI工具集成,具體包括如下內容。
ODBC:與Tableau、Excel、PowerBI等工具集成
JDBC:與Saiku、BIRT等Java工具集成
RestAPI:與JavaScript、Web網頁集成
Kylin開發團隊還貢獻了Zepplin的插件,也可以使用Zepplin來訪問Kylin服務。

1.3 Kylin架構

在這裏插入圖片描述
1)REST Server
REST Server是一套面向應用程序開發的入口點,旨在實現針對Kylin平臺的應用開發工作。 此類應用程序可以提供查詢、獲取結果、觸發Cube構建任務、獲取元數據以及獲取用戶權限等等。另外可以通過Restful接口實現SQL查詢。
2)查詢引擎(Query Engine)
當Cube準備就緒後,查詢引擎就能夠獲取並解析用戶查詢。它隨後會與系統中的其它組件進行交互,從而向用戶返回對應的結果。
3)Routing
負責將解析的SQL生成的執行計劃轉換成Cube緩存的查詢,Cube是通過預計算緩存在hbase中,這部分查詢可以在秒級設置毫秒級完成,而且還有一些操作使用過的查詢原始數據(存儲在Hadoop的HDFS中通過Hive查詢)。這部分查詢延遲較高。
4)元數據管理工具(Metadata)
Kylin是一款元數據驅動型應用程序。元數據管理工具是一大關鍵性組件,用於對保存在Kylin當中的所有元數據進行管理,其中包括最爲重要的Cube元數據。其它全部組件的正常運作都需以元數據管理工具爲基礎。Kylin的元數據存儲在hbase中。
5)任務引擎(Cube Build Engine)
這套引擎的設計目的在於處理所有離線任務,其中包括Shell腳本、Java API以及Map Reduce任務等等。任務引擎對Kylin當中的全部任務加以管理與協調,從而確保每一項任務都能得到切實執行並解決其間出現的故障。

1.4 Kylin工作原理

Apache Kylin的工作原理本質上是MOLAP(Multidimension On-Line Analysis Processing)Cube,也就是多維立方體分析。是數據分析中非常經典的理論,下面對其做簡要介紹。
1.4.1 維度和度量
維度:即觀察數據的角度。比如員工數據,可以從性別角度來分析,也可以更加細化,從入職時間或者地區的維度來觀察。維度是一組離散的值,比如說性別中的男和女,或者時間維度上的每一個獨立的日期。因此在統計時可以將維度值相同的記錄聚合在一起,然後應用聚合函數做累加、平均、最大和最小值等聚合計算。
度量:即被聚合(觀察)的統計值,也就是聚合運算的結果。比如說員工數據中不同性別員工的人數,又或者說在同一年入職的員工有多少。
1.4.2 Cube和Cuboid
有了維度跟度量,一個數據表或者數據模型上的所有字段就可以分類了,它們要麼是維度,要麼是度量(可以被聚合)。於是就有了根據維度和度量做預計算的Cube理論。
給定一個數據模型,我們可以對其上的所有維度進行聚合,對於N個維度來說,組合的所有可能性共有2n種。對於每一種維度的組合,將度量值做聚合計算,然後將結果保存爲一個物化視圖,稱爲Cuboid。所有維度組合的Cuboid作爲一個整體,稱爲Cube。
下面舉一個簡單的例子說明,假設有一個電商的銷售數據集,其中維度包括時間[time]、商品[item]、地區[location]和供應商[supplier],度量爲銷售額。那麼所有維度的組合就有24 = 16種,如下圖所示:
在這裏插入圖片描述

一維度(1D)的組合有:[time]、[item]、[location]和[supplier]4種;
二維度(2D)的組合有:[time, item]、[time, location]、[time, supplier]、[item, location]、[item, supplier]、[location, supplier]3種;
三維度(3D)的組合也有4種;
最後還有零維度(0D)和四維度(4D)各有一種,總共16種。
注意:每一種維度組合就是一個Cuboid,16個Cuboid整體就是一個Cube。

1.4.3 核心算法

Kylin的工作原理就是對數據模型做Cube預計算,並利用計算的結果加速查詢:
1)指定數據模型,定義維度和度量;
2)預計算Cube,計算所有Cuboid並保存爲物化視圖;
預計算過程是Kylin從Hive中讀取原始數據,按照我們選定的維度進行計算,並將結果集保存到Hbase中,默認的計算引擎爲MapReduce,可以選擇Spark作爲計算引擎。一次build的結果,我們稱爲一個Segment。構建過程中會涉及多個Cuboid的創建,具體創建過程由kylin.Cube.algorithm參數決定,參數值可選 auto,layer 和 inmem, 默認值爲 auto,即 Kylin 會通過採集數據動態地選擇一個算法 (layer or inmem),如果用戶很瞭解 Kylin 和自身的數據、集羣,可以直接設置喜歡的算法。
3)執行查詢,讀取Cuboid,運行,產生查詢結果。

1.4.3.1 逐層構建算法(layer)

在這裏插入圖片描述
我們知道,一個N維的Cube,是由1個N維子立方體、N個(N-1)維子立方體、N*(N-1)/2個(N-2)維子立方體、…、N個1維子立方體和1個0維子立方體構成,總共有2^N個子立方體組成,在逐層算法中,按維度數逐層減少來計算,每個層級的計算**(除了第一層,它是從原始數據聚合而來)**,是基於它上一層級的結果來計算的。比如,[Group by A, B]的結果,可以基於[Group by A, B, C]的結果,通過去掉C後聚合得來的;這樣可以減少重複計算;當 0維度Cuboid計算出來的時候,整個Cube的計算也就完成了。
每一輪的計算都是一個MapReduce任務,且串行執行;一個N維的Cube,至少需要N+1次MapReduce Job。
算法優點:
1)此算法充分利用了MapReduce的能力,處理了中間複雜的排序和洗牌工作,故而算法代碼清晰簡單,易於維護;
2)受益於Hadoop的日趨成熟,此算法對集羣要求低,運行穩定;在內部維護Kylin的過程中,很少遇到在這幾步出錯的情況;即便是在Hadoop集羣比較繁忙的時候,任務也能完成。
算法缺點:
1)當Cube有比較多維度的時候,所需要的MapReduce任務也相應增加;由於Hadoop的任務調度需要耗費額外資源,特別是集羣較龐大的時候,反覆遞交任務造成的額外開銷會相當可觀;
2)此算法會對Hadoop MapReduce輸出較多數據; 雖然已經使用了Combiner來減少從Mapper端到Reducer端的數據傳輸,所有數據依然需要通過Hadoop MapReduce來排序和組合才能被聚合,無形之中增加了集羣的壓力;
3)對HDFS的讀寫操作較多:由於每一層計算的輸出會用做下一層計算的輸入,這些Key-Value需要寫到HDFS上;當所有計算都完成後,Kylin還需要額外的一輪任務將這些文件轉成HBase的HFile格式,以導入到HBase中去;
總體而言,該算法的效率較低,尤其是當Cube維度數較大的時候。

1.4.3.2 快速構建算法(inmem)

也被稱作“逐段”(By Segment) 或“逐塊”(By Split) 算法,從1.5.x開始引入該算法,利用Mapper端計算先完成大部分聚合,再將聚合後的結果交給Reducer,從而降低對網絡瓶頸的壓力。該算法的主要思想是,對Mapper所分配的數據塊,將它計算成一個完整的小Cube 段(包含所有Cuboid);每個Mapper將計算完的Cube段輸出給Reducer做合併,生成大Cube,也就是最終結果;如圖所示解釋了此流程。
在這裏插入圖片描述
與舊算法相比,快速算法主要有兩點不同:
1) Mapper會利用內存做預聚合,算出所有組合;Mapper輸出的每個Key都是不同的,這樣會減少輸出到Hadoop MapReduce的數據量;
2)一輪MapReduce便會完成所有層次的計算,減少Hadoop任務的調配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章