Apache Kylin原理學習之Cube構建

Apache Kylin原理簡介

Apache Kylin是一個開源的、基於Hadoop生態系統的OLAP查詢引擎,能夠通過SQL接口對十億、甚至百億行的超大數據集實現秒級的多維分析查詢。
Kylin通過預計算實現超大數據集的秒級多維分析查詢。對於超大數據集的複雜查詢,既然現場計算需要花費較長時間,那麼根據空間換時間的原理,我們就可以提前將所有可能的計算結果計算並存儲下來,從而實現超大數據集的秒級多維分析查詢。Kylin將數據源Hive表中的數據按照指定的維度和指標 由計算引擎MapReduce離線計算出所有可能的查詢結果(即Cube)存儲到HBase中。

Cube是一種典型的多維數據分析技術,一個Cube可以有多個事實表,多個維表構成。如果您還不瞭解這些概念,建議您搜索下數據倉庫、OLAP、Cube、星型模型、事實表、維度表等等。比如一個簡單例子,分析網站流量的Cube,包含一個事實表和四個維度表:

事實表可能有以下字段:

天、來源ID、瀏覽器ID、操作系統ID、PV、PageNumber等等;

其中,小時、來源ID、瀏覽器ID、操作系統ID 爲維度;

PV、PageNumber爲指標;

一般事實表中的維度都採用外鍵ID的形式,一來可以節省存儲,也可以很好的適用於其他分析工具;

維度表包括:

時間維表:年、月、日,其中天爲最細粒度,也爲該表主鍵;

訪問來源維表:來源ID、來源名稱;

瀏覽器維表:瀏覽器ID、瀏覽器名稱、etc.

操作系統維表:操作系統ID、操作系統名稱、etc.

事實表中的維度,分別與這四張維度表,通過主外鍵的方式關聯。

Kylin中的Cube亦是這種模型。

關於維度組合Cuboid

Kylin中Cube的Build過程,其實是將所有的維度組合事先計算,存儲於HBase中,以空間換時間,HTable對應的RowKey,就是各種維度組合,指標存在Column中,這樣,將不同維度組合查詢SQL,轉換成基於RowKey的範圍掃描,然後對指標進行彙總計算。

理論上來說,一個N維的Cube,便有2的N次方種維度組合,參考網上的一個例子,一個Cube包含time, item, location, supplier四個維度,那麼組合(Cuboid)便有16種:

kylin

一個Cube中,當維度數量N超過一定數量後,空間以及計算消耗將會非常大,Kylin在定義Cube時候,可以將維度拆分成多個聚合組(Aggregation Groups),只在組內計算Cube,聚合組內查詢效率高,跨組查詢效率較差,所以需要根據業務場景,將常用的維度組合定義到一個聚合組中,提高查詢性能,這也是Kylin中查詢性能優化的一個重要方面。

Build Cube的過程

定義好Cube之後,Apache Kylin通過MapReduce,將存儲在Hive中的事實表和維度表,轉換成Cube,存儲在HBase中,以實現快速分析查詢,整個過程如下圖所示:

kylin

STEP1. 根據Cube定義的事實表和維度,在Hive中生成一張中間表;

Create Intermediate Flat Hive Table;

STEP2. 使用MapReduce,從事實表中抽取維度的Distinct值,並以字典樹的方式壓縮編碼,同時也對所有維度表進行壓縮編碼,生成維度字典;

Extract Fact Table Distinct Columns

Build Dimension Dictionary

STEP3. 計算和統計所有的維度組合,並保存,其中,每一種維度組合,稱爲一個Cuboid,後面會詳細介紹。

Save Cuboid Statistics

STEP4. 創建HBase Table;

Create HTable

STEP5. 利用step1中間表的數據,使用MapReduce,生成每一種維度組合(Cuboid)的數據;

Build Base Cuboid Data;

Build N-Dimension Cuboid Data : 7-Dimension;

Build N-Dimension Cuboid Data : 6-Dimension;

。。。。。。

Build N-Dimension Cuboid Data : 2-Dimension;

Build Cube;

STEP6. 將Cuboid數據轉換成HFile,並導入到HBase Table中:

Convert Cuboid Data to HFile;

Load HFile to HBase Table;

STEP7. 更新Cube信息,清理中間表:

Update Cube Info;

Garbage Collection;

 

整個Build過程結束。

Cuboid 的維度和指標如何轉換爲HBase的KV結構

簡單的說Cuboid的維度會映射爲HBase的Rowkey,Cuboid的指標會映射爲HBase的Value。如下圖所示:
cube-kv.png-356.2kB

如上圖原始表所示:Hive表有兩個維度列yearcity,有一個指標列price

如上圖預聚合表所示:我們具體要計算的是yearcity這兩個維度所有維度組合(即4個cuboid)下的sum(priece)指標,這個指標的具體計算過程就是由MapReduce完成的。

如上圖字典編碼所示:爲了節省存儲資源,Kylin對維度值進行了字典編碼。圖中將beijingshanghai依次編碼爲0和1。

如上圖HBase KV存儲所示:在計算cuboid過程中,會將Hive表的數據轉化爲HBase的KV形式。Rowkey的具體格式是cuboid id + 具體的維度值(最新的Rowkey中爲了併發查詢還加入了ShardKey),以預聚合表內容的第2行爲例,其維度組合是(year,city),所以cuboid id就是00000011,cuboid是8位,具體維度值是1994和shanghai,所以編碼後的維度值對應上圖的字典編碼也是11,所以HBase的Rowkey就是0000001111,對應的HBase Value就是sum(priece)的具體值。

所有的cuboid計算完成後,會將cuboid轉化爲HBase的KeyValue格式生成HBase的HFile,最後將HFile load進cube對應的HBase表中。

SQL查詢是如何轉化爲HBase的Scan操作的

還是以圖2舉例,假設查詢SQL如下:

    select year, sum(price)
    from table
    where city = "beijing"
    group by year

這個SQL涉及維度yearcity,所以其對應的cuboid是00000011,又因爲city的值是確定的beijing,所以在Scan HBase時就會Scan Rowkey以00000011開頭且city的值是beijing的行,取到對應指標sum(price)的值,返回給用戶。

總結

本文主要通過綜合整理兩篇Kylin原理介紹博文,記錄和分析了Kylin原理及構建Cube的過程,希望對大家有幫助。

參考及轉載博客:

  1. https://blog.bcmeng.com/post/kylin-cube.html
  2. lxw的大數據田地 » Apache Kylin原理學習之Cube的創建與Build
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章