Apache Kylin Cube 的構建過程

 

 

  很少說,直接上乾貨!算法

 

 

 

 

一、 Cube的物理模型


                        Cube物理模型


  如上圖所示,一個經常使用的3維立方體,包含:時間、地點、產品。假如data cell 中存放的是產量,則咱們能夠根據時間、地點、產品來肯定產量,同時也能夠根據時間、地點來肯定全部產品的總產量等。
  Apache Kylin就將全部(時間、地點、產品)的各類組合實現算出來,data cell 中存放度量,其中每一種組合都稱爲cuboid。估n維的數據最多有2^n個cuboid,不過Kylin經過設定維度的種類,能夠減小cuboid的數目。app



 
 

2 、Cube構建算法介紹

2.1 逐層算法(Layer Cubing)

  咱們知道,一個N維的Cube,是由1個N維子立方體、N個(N-1)維子立方體、N*(N-1)/2個(N-2)維子立方體、......、N個1維子立方體和1個0維子立方體構成,總共有2^N個子立方體組成,在逐層算法中,按維度數逐層減小來計算,每一個層級的計算(除了第一層,它是從原始數據聚合而來),是基於它上一層級的結果來計算的。
好比,[Group by A, B]的結果,能夠基於[Group by A, B, C]的結果,經過去掉C後聚合得來的;這樣能夠減小重複計算;當 0維度Cuboid計算出來的時候,整個Cube的計算也就完成了。oop

            
                            逐層算法


  如上圖所示,展現了一個4維的Cube構建過程。
  此算法的Mapper和Reducer都比較簡單。Mapper以上一層Cuboid的結果(Key-Value對)做爲輸入。因爲Key是由各維度值拼接在一塊兒,從其中找出要聚合的維度,去掉它的值成新的Key,並對Value進行操做,而後把新Key和Value輸出,進而Hadoop MapReduce對全部新Key進行排序、洗牌(shuffle)、再送到Reducer處;Reducer的輸入會是一組有相同Key的Value集合,對這些Value作聚合計算,再結合Key輸出就完成了一輪計算。
  每一輪的計算都是一個MapReduce任務,且串行執行; 一個N維的Cube,至少須要N次MapReduce Job。編碼

 

算法優勢spa

  • 此算法充分利用了MapReduce的能力,處理了中間複雜的排序和洗牌工做,故而算法代碼清晰簡單,易於維護;
  • 受益於Hadoop的日趨成熟,此算法對集羣要求低,運行穩定;在內部維護Kylin的過程當中,不多遇到在這幾步出錯的狀況;即使是在Hadoop集羣比較繁忙的時候,任務也能完成。

 

算法缺點blog

  • 當Cube有比較多維度的時候,所須要的MapReduce任務也相應增長;因爲Hadoop的任務調度須要耗費額外資源,特別是集羣較龐大的時候,反覆遞交任務形成的額外開銷會至關可觀;
  • 因爲Mapper不作預聚合,此算法會對Hadoop MapReduce輸出較多數據; 雖然已經使用了Combiner來減小從Mapper端到Reducer端的數據傳輸,全部數據依然須要經過Hadoop MapReduce來排序和組合才能被聚合,無形之中增長了集羣的壓力;
  • 對HDFS的讀寫操做較多:因爲每一層計算的輸出會用作下一層計算的輸入,這些Key-Value須要寫到HDFS上;當全部計算都完成後,Kylin還須要額外的一輪任務將這些文件轉成HBase的HFile格式,以導入到HBase中去;
  • 整體而言,該算法的效率較低,尤爲是當Cube維度數較大的時候;時常有用戶問,是否能改進Cube算法,縮短期。




 
 
 

2 .2 快速Cube算法(Fast Cubing)

  快速Cube算法(Fast Cubing)是麒麟團隊對新算法的一個統稱,它還被稱做「逐段」(By Segment) 或「逐塊」(By Split) 算法。排序

  該算法的主要思想是,對Mapper所分配的數據塊,將它計算成一個完整的小Cube 段(包含全部Cuboid);每一個Mapper將計算完的Cube段輸出給Reducer作合併,生成大Cube,也就是最終結果;圖2解釋了此流程。遞歸

            
                          快速Cube算法

 

 


與舊算法相比,快速算法主要有兩點不一樣ip

  • Mapper會利用內存作預聚合,算出全部組合;Mapper輸出的每一個Key都是不一樣的,這樣會減小輸出到Hadoop MapReduce的數據量,Combiner也再也不須要;
  • 一輪MapReduce便會完成全部層次的計算,減小Hadoop任務的調配。

 

 

 

子立方體生成樹的遍歷
  值得一提的還有一個改動,就是子立方體生成樹(Cuboid Spanning Tree)的遍歷次序;在舊算法中,Kylin按照層級,也就是廣度優先遍歷(Broad First Search)的次序計算出各個Cuboid;在快速Cube算法中,Mapper會按深度優先遍歷(Depth First Search)來計算各個Cuboid。深度優先遍歷是一個遞歸方法,將父Cuboid壓棧以計算子Cuboid,直到沒有子Cuboid須要計算時纔出棧並輸出給Hadoop;最多須要暫存N個Cuboid,N是Cube維度數。
採用DFS,是爲了兼顧CPU和內存:內存

  • 從父Cuboid計算子Cuboid,避免重複計算;
  • 只壓棧當前計算的Cuboid的父Cuboid,減小內存佔用。
                
                •            立方體生成數的遍歷過程
                   
                   
                   

  上圖是一個四維Cube的完整生成樹;按照DFS的次序,在0維Cuboid 輸出前的計算次序是 ABCD -> BCD -> CD -> D -> , ABCD, BCD, CD和D須要被暫存;在被輸出後,D可被輸出,內存獲得釋放;在C被計算並輸出後,CD就能夠被輸出; ABCD最後被輸出。




 
 
 
 

4.3 、Cube構建流程


                        
                                Cube構建流程圖
 
 
 
 
 
 

主要步驟以下:

  1. 構建一箇中間平表(Hive Table):將Model中的fact表和look up表構建成一個大的Flat Hive Table。
  2. 從新分配Flat Hive Tables。
  3. 從事實表中抽取維度的Distinct值。
  4. 對全部維度表進行壓縮編碼,生成維度字典。
  5. 計算和統計全部的維度組合,並保存,其中,每一種維度組合,稱爲一個Cuboid。
  6. 建立HTable。
  7. 構建最基礎的Cuboid數據。
  8. 利用算法構建N維到0維的Cuboid數據。
  9. 構建Cube。
  10. 將Cuboid數據轉換成HFile。
  11. 將HFile直接加載到HBase Table中。
  12. 更新Cube信息。
  13. 清理Hive。
相關文章
相關標籤/搜索