Apache Kylin 入門系列目錄
- Apache Kylin 入門 1 - 基本概念
- Apache Kylin 入門 2 - 原理與架構
- Apache Kylin 入門 3 - 安裝配置引數詳解
- Apache Kylin 入門 4 - 構建 Model
- Apache Kylin 入門 5 - 構建 Cube
- Apache Kylin 入門 6 - 優化 Cube
- 基於 ELKB 構建 Kylin 查詢時間監控頁面
工作原理
簡單來說,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 指定不同的構建引擎或儲存引擎,以期達到最極致的效能和功能定製。
構建演算法
Layered Cubing
這個四維 Cube 需要五輪的 MapReduce 來完成:第一輪 MR 的輸入是源資料,這一步會對維度列的值進行編碼,並計算 ABCD 組合的結果。接下來的 MR 以上一輪的輸出結果為輸入,向上聚合計算三個維度的組合:ABC、BCD、ABD和ACD;依此類推,直到算出所有的維度組合。
Layered Cubing 的特點:
- 演算法比較簡單;
- 演算法的穩定性非常高;
- 計算量或者資料量大的時候並不能充分利用系統的資源;
- 沒有充分利用記憶體(快取中間計算結果)。
Fast Cubing
最大化利用 Mapper 端的 CPU 和記憶體,對分配的資料塊,將需要的組合全都做計算後再輸出給 Reducer;由 Reducer 再做一次合併(Merge),從而計算出完整資料的所有組合。如此,經過一輪 MapReduce 就完成了以前需要 N 輪的 Cube 計算。
Fast Cubing 的特點:最大限度地把計算髮生在 Mapper 這一端,一方面減少 shuffle 的資料量,另一方面減少 Reducer 端的計算量。
第一步會計算 Base Cuboid(所有維度都有的組合),再基於它計算減少一個維度的組合。基於 parent 節點計算 child 節點,可以重用之前的計算結果;當計算 child 節點時,需要 parent 節點的值儘可能留在記憶體中;如果 child 節點還有 child,那麼遞迴向下,所以它是一個深度優先遍歷。當有一個節點沒有 child,或者它的所有 child 都已經計算完,這時候它就可以被輸出,佔用的記憶體就可以釋放。
Any Code,Code Any!
掃碼關注『AnyCode』,程式設計路上,一起前行。