Apache Kylin 入門 2 - 原理與架構

rochy_he發表於2018-10-15

Apache Kylin 入門系列目錄

工作原理

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

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

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

體系架構

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

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 指定不同的構建引擎或儲存引擎,以期達到最極致的效能和功能定製。

可擴充套件架構

構建演算法

Layered Cubing

這個四維 Cube 需要五輪的 MapReduce 來完成:第一輪 MR 的輸入是源資料,這一步會對維度列的值進行編碼,並計算 ABCD 組合的結果。接下來的 MR 以上一輪的輸出結果為輸入,向上聚合計算三個維度的組合:ABC、BCD、ABD和ACD;依此類推,直到算出所有的維度組合。

Layered Cubing 的特點:

  • 演算法比較簡單;
  • 演算法的穩定性非常高;
  • 計算量或者資料量大的時候並不能充分利用系統的資源;
  • 沒有充分利用記憶體(快取中間計算結果)。

Layered Cubing 案例

Fast Cubing

最大化利用 Mapper 端的 CPU 和記憶體,對分配的資料塊,將需要的組合全都做計算後再輸出給 Reducer;由 Reducer 再做一次合併(Merge),從而計算出完整資料的所有組合。如此,經過一輪 MapReduce 就完成了以前需要 N 輪的 Cube 計算。

Fast Cubing 基本思想

Fast Cubing 的特點:最大限度地把計算髮生在 Mapper 這一端,一方面減少 shuffle 的資料量,另一方面減少 Reducer 端的計算量。

第一步會計算 Base Cuboid(所有維度都有的組合),再基於它計算減少一個維度的組合。基於 parent 節點計算 child 節點,可以重用之前的計算結果;當計算 child 節點時,需要 parent 節點的值儘可能留在記憶體中;如果 child 節點還有 child,那麼遞迴向下,所以它是一個深度優先遍歷。當有一個節點沒有 child,或者它的所有 child 都已經計算完,這時候它就可以被輸出,佔用的記憶體就可以釋放。

Fast Cubing 案例


Any Code,Code Any!

掃碼關注『AnyCode』,程式設計路上,一起前行。

Apache Kylin 入門 2 - 原理與架構

相關文章