一款高性能的OLAP分析工具-Apache Kylin 研究 (一)

上一篇:

本文主要介紹Apache Kylin的基本概念和原理。

基本概念

1、事實表(Fact Table)

事實表(Fact Table)是指存儲有事實記錄的表,如系統日誌、銷售記錄等;事實表的記錄在不斷地動態增長,所以它的體積通常遠大於其他表。

2、維度表(Dimension Table)

維度表或維表,有時也稱查找表(Lookup Table),是與事實表相對應的一種表。它保存了維度的屬性值,可以跟事實表做關聯;相當於將事實表上經常重複出現的屬性抽取、規範出來用一張表進行管理。維度表有以下幾個優點:

  • 縮小了事實表的大小;
  • 便於維度的管理和維護,不必對事實表進行改動;
  • 維度表可以為多個事實表重用,以減少重複工作。

3、維度(Dimension)

維度是觀察數據的角度,一般是一組離散的值;因此統計時可以把維度值相同的記錄聚合在一起,然後進行聚合計算。

在 Kylin Cube 構建中,維度可以分為以下幾種類型:

  • Mandatory:必需維度,查詢中總是出現在 where 條件中的維度;如果一個維度被標記為 “Mandatory”,會認為所有的查詢都會包含此維度,所有不含此維度的組合,在 Cube 構建時都會被剪枝(不計算);
  • Hierarchy:層級維度,如果多個維度之間有層級(或包含)的關係,通過設置為 “Hierarchy”,那些不滿足層級的組合會被剪枝;如果A, B, C是層級,並且A>B>C,那麼只需要計算組合A, AB, ABC; 其它組合如B, C, BC, AC將不做預計算;
  • Joint:聯合維度,有些維度往往一起出現,或者它們的基數非常接近(有 1:1 映射關係),例如 “用戶 ID”總是對應唯一的 “用戶名”;
  • Derived:衍生維度:維度表的列值,可以從它的主鍵值衍生而來,那麼通過將這些列定義為衍生維度,可以僅將主鍵加入到 Cube 的預計算來,而在運行時通過使用維度表的快照,衍生出非主鍵列的值,從而起到降維的效果。

4、度量(Measure)

度量是被聚合的統計值,也是聚合運算的結果,它一般是連續的值。

5、OLAP(Online Analytical Process)

OLAP(Online Analytical Process),聯機分析處理,以多維度的方式分析數據,而且能夠彈性地提供上卷(Roll-up)、下鑽(Drill-down)和透視分析(Pivot)等操作,它是呈現集成性決策信息的方法,多用於決策支持系統、商務智能或數據倉庫。其主要的功能在於方便大規模數據分析及統計計算,可對決策提供參考和支持。

與之相區別的是聯機交易處理(OLTP),聯機交易處理,更側重於基本的、日常的事務處理,包括數據的增刪改查。

6、星型模型

星型模型是一種多維的數據關係,它由一個事實表和一組維表組成。每個維表都有一個維作為主鍵,所有這些維的主鍵組合成事實表的主鍵。強調的是對維度進行預處理,將多個維度集合到一個事實表,形成一個寬表。

這也是我們在使用 Hive 時,經常會看到一些大寬表的原因,大寬表一般都是事實表,包含了維度關聯的主鍵和一些度量信息,而維度表則是事實表裡面維度的具體信息,使用時候一般通過 Join 來組合數據,相對來說對 OLAP 的分析比較方便。

7、雪花模型

當有一個或多個維表沒有直接連接到事實表上,而是通過其他維表連接到事實表上時,其圖解就像多個雪花連接在一起,故稱雪花模型。

雪花模型是對星型模型的擴展,它對星型模型的維表進一步層次化,原有的各維表可能被擴展為小的事實表,形成一些局部的"層次"區域,這些被分解的表都連接到主維度表而不是事實表。

雪花模型更加符合數據庫範式,減少數據冗餘,但是在分析數據的時候,操作比較複雜,需要 Join 的表比較多所以其性能並不一定比星型模型高。

8、數據立方體(Data Cube)

數據立方體允許多維對數據建模和觀察,它由維和事實定義,它是對多維模型的一個形象的說法。

從表方面看,數據立方體是三維的,但是多維模型不僅限於三維模型,可以組合更多的模型,比如四維、五維等等,比如我們根據時間、地域、產品和產品型號這四個維度,統計銷售量等指標。

對於每一種維度的組合,將度量做聚合運算,然後將運算的結果保存為一個物化視圖,稱為 Cuboid。所有維度組合的 Cuboid 作為一個整體,被稱為 Cube。所以簡單來說,一個 Cube 就是許多按維度聚合的物化視圖的集合。

Cube Segment 是指針對源數據中的某一個片段,計算出來的 Cube 數據。通常數據倉庫中的數據數量會隨著時間的增長而增長,而 Cube Segment 也是按時間順序來構建的。

Cuboid 示例:Cuboid[Time, Locatio] = select Time, Location, sum(GMV) as GMV from T group by Time, Location

9、Cube 構建常見概念

Table - 表, 是 Cube 的數據源;在創建 Cube 之前,需要從數據源(通常為 Hive)同步表的元數據,包含表名、列名、列屬性等。

Data Model - 數據模型,定義了由若干張表的一個連接關係。支持星型模型的多維分析;在創建Cube之前,用戶需定義這麼一個數據模型。

Cube

- 數據立方體,是一種多維分析的技術,通過預計算,將計算結果存儲在某多個維度值所映射的空間中;在運行時通過對 Cube 的再處理而快速獲取結果。

Partition - 分區,用戶可以定義一個分區日期或時間列,隨後對 Cub e的構建按此列的值範圍而進行,從而將 Cube 分成多個 Segment。

Cube Segment - 每個 Cube Segment 是對特定時間範圍的數據計算而成的 Cube,每個 Segment 對應一張 HBase 表。

Aggregation Group - 聚合組,每個聚合組是全部維度的一個子集;通過將很多個維度分組,並把常一起使用的維度放在一起,可以有效降低 Cube 的組合數。

原理

簡單來說,Kylin 的核心思想是預計算(利用空間換時間),即對多維分析可能用到的度量進行預計算,將計算好的結果保存成 Cube 並存在 HBase 中,供查詢時直接訪問。

把高複雜度的聚合運算、多表連接等操作轉換成對預計算結果的查詢,這決定了 Kylin 能夠擁有很好的快速查詢和高併發能力,具體工作過程如下:

  1. 指定數據模型(Model),定義維度(Dimensions)和度量(Measure);
  2. 預計算 Cube,計算所有 Cuboid 並保存為物化視圖;
  3. 執行查詢時(Restful API/JDBC/ODBC),讀取 Cuboid,運算,產生查詢結果。

Apache Kylin 系統可以分為在線查詢和離線構建兩部分,技術架構如圖所示,在線查詢的模塊主要處於上半區,而離線構建則處於下半區。


一款高性能的OLAP分析工具-Apache Kylin 研究 (一)

Kylin 的核心模塊

  • REST Server:提供 Restful 接口,例如創建、構建、刷新、合併等 Cube 相關操作,Kylin 的 Projects、Tables 等元數據管理,用戶訪問權限控制,SQL 的查詢等;
  • Query Engine:使用開源的 Apache Calcite 框架來實現 SQL 解析,可以理解為 SQL 引擎層;
  • Routing:負責將解析 SQL 生成的執行計劃轉換成 Cube 緩存的查詢,這部分查詢是可以在秒級甚至毫秒級完成;
  • Metadata:Kylin 中有大量的元數據信息,包括 Cube 的定義、星型模型的定義、Job 和執行 Job 的輸出信息、模型的維度信息等等,Kylin 的元數據和 Cube 都存儲在 HBase 中,存儲的格式是 json 字符串;
  • Cube Build Engine:所有模塊的基礎,它主要負責 Kylin 預計算中創建 Cube,創建的過程是首先通過 Hive 讀取原始數據,然後通過一些 MapReduce 或 Spark 計算生成 Htable,最後將數據 load 到 HBase 表中。

離線構建

離線構建的主要步驟:

  1. 數據源在左側,目前主要是 Hadoop Hive,保存著待分析的用戶數據;
  2. 根據元數據的定義,下方構建引擎從數據源抽取數據,並構建 Cube;
  3. 數據以關係表的形式輸入,且必須符合星形模型(2.0 開始已經支持星型模型);
  4. MapReduce 是當前主要的構建技術(2.5 開始 Spark 是主要的構建技術);
  5. 構建後的 Cube 保存在右側的存儲引擎中,一般選用 HBase 作為存儲。

在線查詢

  1. 用戶可以從上方查詢系統(Rest API、JDBC/ODBC)發送 SQL 進行查詢分析;
  2. 無論從哪個接口進入,SQL 最終都會來到 Rest 服務層,再轉交給查詢引擎進行處理;
  3. 查詢引擎解析 SQL,生成基於關係表的邏輯執行計劃;
  4. 然後將其轉譯為基於 Cube 的物理執行計劃;
  5. 最後查詢預計算生成的 Cube 併產生結果。

可擴展架構

可擴展指 Kylin 可以對其主要依賴的三個模塊做任意的擴展和替換,Kylin 的三大依賴模塊分別是數據源(Hive)、構建引擎(MR)和存儲引擎(HBase)。

可擴展架構帶來了額外的靈活性,比如,它可以允許多個引擎同時並存。例如 Kylin 可以同時對接 Hive、Kafka 和其他第三方數據源;抑或用戶可以為不同的 Cube 指定不同的構建引擎或存儲引擎,以期達到最極致的性能和功能定製。


一款高性能的OLAP分析工具-Apache Kylin 研究 (一)

喜歡的朋友請繼續關注,後續持續更新中。。。


分享到:


相關文章: