很少說,直接上乾貨!算法
如上圖所示,一個經常使用的3維立方體,包含:時間、地點、產品。假如data cell 中存放的是產量,則咱們能夠根據時間、地點、產品來肯定產量,同時也能夠根據時間、地點來肯定全部產品的總產量等。
Apache Kylin就將全部(時間、地點、產品)的各類組合實現算出來,data cell 中存放度量,其中每一種組合都稱爲cuboid。估n維的數據最多有2^n個cuboid,不過Kylin經過設定維度的種類,能夠減小cuboid的數目。app
咱們知道,一個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
算法缺點blog
快速Cube算法(Fast Cubing)是麒麟團隊對新算法的一個統稱,它還被稱做「逐段」(By Segment) 或「逐塊」(By Split) 算法。排序
該算法的主要思想是,對Mapper所分配的數據塊,將它計算成一個完整的小Cube 段(包含全部Cuboid);每一個Mapper將計算完的Cube段輸出給Reducer作合併,生成大Cube,也就是最終結果;圖2解釋了此流程。遞歸
與舊算法相比,快速算法主要有兩點不一樣ip
子立方體生成樹的遍歷
值得一提的還有一個改動,就是子立方體生成樹(Cuboid Spanning Tree)的遍歷次序;在舊算法中,Kylin按照層級,也就是廣度優先遍歷(Broad First Search)的次序計算出各個Cuboid;在快速Cube算法中,Mapper會按深度優先遍歷(Depth First Search)來計算各個Cuboid。深度優先遍歷是一個遞歸方法,將父Cuboid壓棧以計算子Cuboid,直到沒有子Cuboid須要計算時纔出棧並輸出給Hadoop;最多須要暫存N個Cuboid,N是Cube維度數。
採用DFS,是爲了兼顧CPU和內存:內存
上圖是一個四維Cube的完整生成樹;按照DFS的次序,在0維Cuboid 輸出前的計算次序是 ABCD -> BCD -> CD -> D -> , ABCD, BCD, CD和D須要被暫存;在被輸出後,D可被輸出,內存獲得釋放;在C被計算並輸出後,CD就能夠被輸出; ABCD最後被輸出。
主要步驟以下: