上一篇:
本文主要介紹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 能夠擁有很好的快速查詢和高併發能力,具體工作過程如下:
- 指定數據模型(Model),定義維度(Dimensions)和度量(Measure);
- 預計算 Cube,計算所有 Cuboid 並保存為物化視圖;
- 執行查詢時(Restful API/JDBC/ODBC),讀取 Cuboid,運算,產生查詢結果。
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 表中。
離線構建
離線構建的主要步驟:
- 數據源在左側,目前主要是 Hadoop Hive,保存著待分析的用戶數據;
- 根據元數據的定義,下方構建引擎從數據源抽取數據,並構建 Cube;
- 數據以關係表的形式輸入,且必須符合星形模型(2.0 開始已經支持星型模型);
- MapReduce 是當前主要的構建技術(2.5 開始 Spark 是主要的構建技術);
- 構建後的 Cube 保存在右側的存儲引擎中,一般選用 HBase 作為存儲。
在線查詢
- 用戶可以從上方查詢系統(Rest API、JDBC/ODBC)發送 SQL 進行查詢分析;
- 無論從哪個接口進入,SQL 最終都會來到 Rest 服務層,再轉交給查詢引擎進行處理;
- 查詢引擎解析 SQL,生成基於關係表的邏輯執行計劃;
- 然後將其轉譯為基於 Cube 的物理執行計劃;
- 最後查詢預計算生成的 Cube 併產生結果。
可擴展架構
可擴展指 Kylin 可以對其主要依賴的三個模塊做任意的擴展和替換,Kylin 的三大依賴模塊分別是數據源(Hive)、構建引擎(MR)和存儲引擎(HBase)。
可擴展架構帶來了額外的靈活性,比如,它可以允許多個引擎同時並存。例如 Kylin 可以同時對接 Hive、Kafka 和其他第三方數據源;抑或用戶可以為不同的 Cube 指定不同的構建引擎或存儲引擎,以期達到最極致的性能和功能定製。
喜歡的朋友請繼續關注,後續持續更新中。。。
閱讀更多 休閒挨踢男 的文章