1. 程式人生 > >一文讀懂Apache Kylin

一文讀懂Apache Kylin

“麒麟出沒,必有祥瑞。”
                              —— 中國古諺語

Kylin思維導圖

前言

隨著移動網際網路、物聯網等技術的發展,近些年人類所積累的資料正在呈爆炸式的增長,大資料時代已經來臨。但是海量資料的收集只是大資料技術的第一步,如何讓資料產生價值才是大資料領域的終極目標。Hadoop的出現解決了資料儲存問題,但如何對海量資料進行OLAP查詢,卻一直令人十分頭疼。

企業中的查詢大致可分為即席查詢和定製查詢兩種。之前出現的很多OLAP引擎,包括Hive、Presto、SparkSQL等,雖然在很大程度上降低了資料分析的難度,但它們都只適用於即席查詢的場景。它們的優點是查詢靈活,但是隨著資料量和計算複雜度的增長,響應時間不能得到保證。而定製查詢多數情況下是對使用者的操作做出實時反應,Hive等查詢引擎動輒數分鐘甚至數十分鐘的響應時間顯然是不能滿足需求的。在很長一段時間裡,企業只能對資料倉庫中的資料進行提前計算,再將算好後的結果儲存在MySQL等關係型資料庫中,再提供給使用者進行查詢。但是當業務複雜度和資料量逐漸升高後,使用這套方案的開發成本和維護成本都顯著上升。因此,如何對已經固化下來的查詢進行亞秒級返回一直是企業應用中的一個痛點。

在這種情況下,Apache Kylin應運而生。不同於“大規模並行處理”(Massive Parallel Processing,MPP)架構的Hive、Presto等,Apache Kylin採用“預計算”的模式,使用者只需要提前定義好查詢維度,Kylin將幫助我們進行計算,並將結果儲存到HBase中,為海量資料的查詢和分析提供亞秒級返回,是一種典型的“空間換時間”的解決方案。Apache Kylin的出現不僅很好地解決了海量資料快速查詢的問題,也避免了手動開發和維護提前計算程式帶來的一系列麻煩。

Apache Kylin最初由eBay公司開發,並貢獻給Apache基金會,但是目前Apache Kylin的核心開發團隊已經自立門戶,建立了Kyligence公司。值得一提的是,Apache Kylin是第一個由中國人主導的Apache頂級專案(2017年4月19日,華為的 CarbonData成為Apache頂級專案,因此Apache Kylin不再是唯一由國人貢獻的Apache頂級專案)。由於網際網路技術和開源思想進入我國的時間較晚,開源軟體的世界一直是由西方國家主導,在資料領域也不例外。從Hadoop到Spark,再到最近大熱的機器學習平臺TenserFlow等,均是如此。但近些年來,我們很欣喜地看到以Apache Kylin為首的各種以國人主導的開源專案不斷地湧現出來,這些技術不斷縮小著我國與西方開源技術強國之間的差距,提升我國技術人員在國際開源社群的影響力。

一、核心概念

在瞭解Apache Kylin的使用以前,我們有必要先來了解一下在Apache Kylin中會出現的核心概念。

資料倉庫

Data Warehouse,簡稱DW,中文名資料倉庫,是商業智慧(BI)中的核心部分。主要是將不同資料來源的資料整合到一起,通過多維分析等方式為企業提供決策支援和報表生成。那麼它與我們熟悉的傳統關係型資料庫有什麼不同呢?

簡而言之,用途不同。資料庫面向事務,而資料倉庫面向分析。資料庫一般儲存線上的業務資料,需要對上層業務的改變做出實時反應,涉及到增刪查改等操作,所以需要遵循三大正規化,需要ACID。而資料倉庫中儲存的則主要是歷史資料,主要目的是為企業決策提供支援,所以可能存在大量資料冗餘,但利於多個維度查詢,為決策者提供更多觀察視角。

在傳統BI領域中,資料倉庫的資料同樣儲存在Oracle、MySQL等資料庫中,而在大資料領域中最常用的資料倉庫就是Apache Hive,Hive也是Apache Kylin預設的資料來源。

OLAP

OLAP(Online Analytical Process),聯機分析處理,以多維度的方式分析資料,一般帶有主觀的查詢需求,多應用在資料倉庫。與之對應的是OLTP(Online Transaction Process),聯機事務處理,側重於資料庫的增刪查改等常用業務操作。瞭解了上面資料庫與資料倉庫的區別後,OLAP與OLTP的區別就不難理解了。

維度和度量

維度和度量是資料分析領域中兩個常用的概念。

簡單地說,維度就是觀察資料的角度。比如感測器的採集資料,可以從時間的維度來觀察:

時間維度

也可以進一步細化,從時間和裝置兩個角度觀察:

時間和裝置維度

維度一般是離散的值,比如時間維度上的每一個獨立的日期,或者裝置維度上的每一個獨立的裝置。因此統計時可以把維度相同的記錄聚合在一起,然後應用聚合函式做累加、均值、最大值、最小值等聚合計算。

度量就是被聚合的統計值,也就是聚合運算的結果,它一般是連續的值,如以上兩個圖中的溫度值,或是其他測量點,比如溼度等等。通過對度量的比較和分析,我們就可以對資料做出評估,比如這個月裝置執行是否穩定,某個裝置的平均溫度是否明顯高於其他同類裝置等等。

Cube和Cuboid

瞭解了維度和度量之後,我們可以將資料模型上的所有欄位進行分類:它們要麼是維度,要麼是度量。根據定義好的維度和度量,我們就可以構建Cube了。

對於一個給定的資料模型,我們可以對其上的所有維度進行組合。對於N個維度來說,組合所有可能性共有2的N次方種。對於每一種維度的組合,將度量做聚合計算,然後將運算的結果儲存為一個物化檢視,稱為Cuboid。所有維度組合的Cuboid作為一個整體,被稱為Cube。

舉個例子。假設有一個電商的銷售資料集,其中維度包括時間(Time)、商品(Item)、地點(Location)和供應商(Supplier),度量為銷售額(GMV)。那麼所有維度的組合就有2的4次方,即16種,比如一維度(1D)的組合有[Time]、[Item]、[Location]、[Supplier]4種;二維度(2D)的組合有[Time Item]、[Time Location]、[Time Supplier]、[Item Location]、[Item Supplier]、[Location Supplier]6種;三維度(3D)的組合也有4種;最後零維度(0D)和四維度(4D)的組合各有1種,總共16種。

計算Cubiod,即按維度來聚合銷售額。如果用SQL語句來表達計算Cuboid [Time, Location],那麼SQL語句如下:

select Time, Location, Sum(GMV) as GMV from Sales group by Time, Location

將計算的結果儲存為物化檢視,所有Cuboid物化檢視的總稱就是Cube。

事實表和維度表

事實表(Fact Table)是指儲存有事實記錄的表,如系統日誌、銷售記錄、感測器數值等;事實表的記錄是動態增長的,所以它的體積通常遠大於維度表。

維度表(Dimension Table)或維表,也成為查詢表(Lookup Table),是與事實表相對應的一種表;它儲存了維度的屬性值,可以跟事實表做關聯;相當於將事實表上經常重複的屬性抽取、規範出來用一張表進行管理。常見的維度表有:日期表(儲存與日期對應的周、月、季度等屬性)、地區表(包含國家、省/州、城市等屬性)等。維度表的變化通常不會太大。使用維度表有許多好處:

  • 縮小了事實表的大小。

  • 便於維度的管理和維護,增加、刪除和修改維度的屬性,不必對事實表的大量記錄進行改動。

  • 維度表可以為多個事實表重用。

星形模型

星形模型(Star Schema)是資料探勘中常用的幾種多維資料模型之一。它的特點是隻有一張事實表,以及零到多個維度表,事實表與維度表通過主外來鍵相關聯,維度表之間沒有關聯,就像許多小星星圍繞在一顆恆星周圍,所以名為星形模型。

另一種常用的模型是雪花模型(SnowFlake Schema),就是將星形模型中的某些維表抽取成更細粒度的維表,然後讓維表之間也進行關聯,這種形狀酷似雪花的的模型稱為雪花模型。

還有一種各位複雜的模型,具有多個事實表,維表可以在不同事實表之間公用,這種模型被稱為星座模型。

不過,Kylin目前只支援星形模型。

二、Apache Kylin的技術架構

Apache Kylin系統主要可以分為線上查詢和離線構建兩部分,具體架構圖如下:

Kylin架構圖,圖片來源於官網首頁

首先來看離線構建部分。從圖中可以看出,左側為資料來源,目前Kylin預設的資料來源是Apache Hive,儲存著待分析的使用者資料。根據元資料的定義,構建引擎從資料來源抽取資料,並構建Cube。資料以關係表的形式輸入,並且必須符合星形模型。構建技術主要為MapReduce(Spark目前在beta版本)。構建後的Cube儲存在右側儲存引擎中,目前Kylin預設的儲存為Apache HBase。

完成離線構建後,使用者可以從上方的查詢系統傳送SQL進行查詢分析。Kylin提供了RESTful API、JDBC/ODBC介面供使用者呼叫。無論從哪個介面進入,SQL最終都會來到REST服務層,再轉交給查詢引擎進行處理。查詢引擎解析SQL,生成基於關係表的邏輯執行計劃,然後將其轉譯為基於Cube的物理執行計劃,最後查詢預計算生成的Cube併產生結果。整個過程不會訪問原始資料來源。如果使用者提交的查詢語句未在Kylin中預先定義,Kylin會返回一個錯誤。

值得一提的是,Kylin對資料來源、執行引擎和Cube儲存三個核心模組提取出了抽象層,這意味著這三個模組可以被任意地擴充套件和替換。比如可以使用Spark替代MapReduce作為Cube的構建引擎,使用Cassandra替代HBase作為Cube計算後資料的儲存等。良好的擴充套件性使得Kylin可以在這個技術發展日新月異的時代方便地使用更先進的技術替代現有技術,做到與時俱進,也使使用者可以針對自己的業務特點對Kylin進行深度定製。

Apache Kylin的這種架構使得它擁有許多非常棒的特性:

  • SQL介面:
    Kylin主要的對外介面就是以SQL的形式提供的。SQL簡單易用的特性極大地降低了Kylin的學習成本,不論是資料分析師還是Web開發程式設計師都能從中收益。

  • 支援海量資料集
    不論是Hive、SparkSQL,還是Impala、Presto,都改變不了這樣一個事實:查詢時間隨著資料量的增長而線性增長。而Apache Kylin使用預計算技術打破了這一點。Kylin在資料集規模上的侷限性主要取決於維度的個數和基數,而不是資料集的大小,所以Kylin能更好地支援海量資料集的查詢。

  • 亞秒級響應
    同樣受益於預計算技術,Kylin的查詢速度非常快,因為複雜的連線、聚合等操作都在Cube的構建過程中已經完成了。

  • 水平擴充套件
    Apache Kylin同樣可以使用叢集部署方式進行水平擴充套件。但部署多個節點只能提高Kylin處理查詢的能力,而不能提升它的預計算能力。

  • 視覺化整合
    Apache Kylin提供了ODBC/JDBC介面和RESTful API,可以很方便地與Tableau等資料視覺化工具整合。資料團隊也可以在開放的API上進行二次開發。

三、Apache Kylin的安裝與使用

關於Apache Kylin的安裝,官網上有詳細的教程:

在此就不再贅述了。但有兩處問題官網不曾提及:

  1. Apache Kylin依賴於Hadoop,但使用Standalone模式部署Hadoop可能會造成構建Cube出現問題,推薦大家使用虛擬機器叢集搭建Hadoop和Kylin。

  2. Hadoop除了需要開啟HDFS和YARN,還需要開啟jobhistoryserver,啟動命令為:sbin/mr-jobhistory-daemon.sh start historyserver

部署成功後,可以使用Kylin官方自帶的quick start教程來驗證一下Kylin是否安裝正確。

接下來我們來談談Cube構建。Apache Kylin的Cube構建分為三種,分別為全量構建、增量構建、流式構建。最簡單的是全量構建,就是每次構建都對Hive表進行全表構建。但是全量構建在實際環境中並不常用,因為大多數業務場景下,事實資料都在不斷地增長中,所以最常使用的構建方式其實是增量構建。

增量構建可以使Cube每次只構建Hive表中新增部分的資料,而不是全部資料,因此大大降低了構建的成本。為了實現增量構建,Apache Kylin將Cube分為多個Segment,每個Segment用起始時間和結束時間來標識。關於Cube的構建,可以參考官網文件:

  1. 建立Model時在第五步(Settings)需要指定 Partition Date Column,用日期欄位來對Cube進行分割。

  2. 建立Cube時在第四步(Refresh Setting)需要指定 Partition Start Date,即Cube預設的第一個Segment的起始時間。

增量構建的方式解決了業務資料動態增長的問題。但卻仍然不能滿足分鐘級的近實時返回結果的需求,因為增量構建與全量構建一樣,使用Hive作為資料來源,而Hive中的資料一般是經過ETL定時匯入的(比如每天一次)。資料的時效性對於資料價值的重要性不言而喻,為了滿足實時資料更新這一普遍需求,Apache Kylin給出了流式構建方案。

不同於前兩種使用Hive做為資料來源的構建方式,流式構建使用Kafka做為資料來源,構建引擎定時從Kafka中拉取資料進行構建,這一設計與Spark-Streaming的微批次(Micro-Batch)思想非常像。官網上同樣給出瞭如何使用流式構建的文件:Build Cube with Streaming Data,需要注意的一點是,Apache Kylin現在的流式構建方式是v1.6後才存在的,之前的版本可能會出現構建方式不同或不存在流式構建方式等情況。

Apache Kylin除了可以在Web UI介面進行構建和查詢,還為Cube的構建提供了RESTful API,為資料的查詢提供了RESTful API和JDBC/ODBC介面,使用者可以根據自身情況選擇合適的構建和查詢方式。另外,Kylin還支援使用第三方資料分析工具來對Kylin中計算好的資料進行分析,如Apache Zeppelin、Tableau等。

四、企業應用案例

Apache Kylin雖然還很年輕,但已經在多個企業的生產專案中得到了應用。下面我們來看一看Kylin在國內兩個著名企業內的應用。

百度地圖

百度地圖資料智慧組是國內最早的一批在生產環境中使用Apache Kylin的技術團隊。在2014年末,百度地圖團隊正要搭建一套完整的OLAP資料分析平臺,用來提供百億行級資料單條SQL毫秒到秒級的多維分析查詢服務。在技術選型的過程中,百度地圖團隊參考了Apache Drill、Presto、Impala、Spark SQL、Apache Kylin等技術。當時Apache Drill和Presto因生產環境案例較少,而Impala和Spark SQL則主要基於記憶體計算,對機器資源要求較高,互動頁面通常含有多條SQL查詢請求,在超大規模的資料集下,動態計算亦難以滿足要求。
最終,百度地圖團隊關注到了基於MapReduce預計算生成Cube並提供低延遲查詢的Apache Kylin解決方案,他們在Apache Kylin叢集上跑了多個Cube測試,結果表明它能夠有效解決大資料計算分析的3大痛點:
痛點一:百億級海量資料多維指標動態計算耗時問題,Apache Kylin通過預計算生成Cube結果資料集並存儲到HBase的方式解決。
痛點二:複雜條件篩選問題,使用者查詢時,Apache Kylin利用router查詢演算法及優化的HBase Coprocessor解決;
痛點三:跨月、季度、年等大時間區間查詢問題,對於預計算結果的儲存,Apache Kylin利用Cube的Data Segment分割槽儲存管理解決。

這3個痛點的解決,使百度地圖在百億級大資料規模下,且資料模型確定的具體多維分析產品中,達到單條SQL毫秒級響應。

京東雲海

京東雲海是由京東和ISV(與京東雲合作的第三方服務廠商)共同合作的模式對商家提供服務。雲海提供基礎的京東POP(商家開放平臺)資料,包括商品、商家、客服績效、品牌、行業等主題資料。ISV通過商家授權可以獲取商家基礎資料,ISV通過JOS的API介面上傳相關維表資料,資料上傳到資料倉庫後,ISV可以在雲海開放平臺上開發相關的Hive SQL對上傳資料和商家基礎資料進行關聯計算,計算結果可以通過資料開放API查詢,ISV獲取到資料後通過應用展現給商家使用。
JOS開放接近500個API,每天呼叫量在7億次左右。針對API的呼叫情況進行多維分析,分析查詢延遲要求達到秒級,並使用BI工具進行分析展現。JOS的API訪問日誌資料通過定時抓取儲存在Hive資料倉庫中。所以需要一種能夠在大資料量情況下進行互動式多維分析的SQL on Hadoop引擎,並且要支援和BI工具的整合,提供標準的JDBC、ODBC介面。
雖然開源社群各種優秀的SQL on Hadoop引擎不斷湧現,比如Impala,SparkSQL等。但是針對於以上場景的考慮:大資料量情況下秒級多維分析、支援與傳統BI工具無縫整合、在大資料量基礎上使用標準SQL查詢小資料量結果集能夠達到毫秒級、完全基於Hadoop生態系統、支援水平擴充套件等。最終京東雲海選擇了了Apache Kylin。

五、進一步學習

  • 官方文件:
    學習一個開源軟體最好的途徑永遠是官方文件。官網地址:http://kylin.apache.org/

  • 《Apache Kylin權威指南》

圖片來源於豆瓣

 

這本《Apache Kylin權威指南》由Apache Kylin的核心開發團隊所作,基本涵蓋了Apache Kylin的方方面面,結合官網閱讀效果拔群。美中不足的就是這本書是基於v1.5,而在v1.6中,流式構建進行了徹底的重寫。但瑕不掩瑜,這本書依然是除了官網之外最好的入門書,本文在成文的過程中也大量地參考了這本書中的內容。

六、總結

Apache Kylin的出現,填補了OLAP on Hadoop解決方案的空白,相比於市面上其他預計算系統,Apache Kylin具有更強的易用性(使用過Druid的人會對這一點深有體會)。Apache Kylin已經在eBay、百度、京東、美團等著名網際網路公司得到應用,在實際生產環境中證明了自己。對預計算系統有需求的同學們可以踴躍嘗試Apache Kylin。

七、參考