Apache Kylin 入門 2 - 原理與架構

Apache Kylin 入門系列目錄算法

工做原理

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

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

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

可擴展架構

構建算法

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 計算。oop

Fast Cubing 基本思想

Fast Cubing 的特色:最大限度地把計算髮生在 Mapper 這一端,一方面減小 shuffle 的數據量,另外一方面減小 Reducer 端的計算量。

第一步會計算 Base Cuboid(全部維度都有的組合),再基於它計算減小一個維度的組合。基於 parent 節點計算 child 節點,能夠重用以前的計算結果;當計算 child 節點時,須要 parent 節點的值儘量留在內存中;若是 child 節點還有 child,那麼遞歸向下,因此它是一個深度優先遍歷。當有一個節點沒有 child,或者它的全部 child 都已經計算完,這時候它就能夠被輸出,佔用的內存就能夠釋放。

Fast Cubing 案例


Any Code,Code Any!

掃碼關注『AnyCode』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索