Apache Kylin Cube構建演算法

2021-08-14 17:33:58 字數 1240 閱讀 9250

在介紹快速cube演算法之前,我們先簡單回顧一下現有的演算法,也稱之為「逐層演算法」(by layer cubing)。

我們知道,乙個n維的完全cube,是由:1個n維子立方體(cuboid), n個(n-1)維cuboid, n*(n-1)/2個(n-2)維cuboid …, n個1維cuboid, 1個0維cuboid,總共2^n個子立方體組成的;在「逐層演算法」中,按維度數逐漸減少來計算,每個層級的計算(除了第一層,它是從原始資料聚合而來),是基於它上一層級的結果來計算的。

舉例子來說,[group by a, b]的結果,可以基於[group by a, b, c]的結果,通過去掉c後聚合得來的;這樣可以減少重複計算;當 0維度cuboid計算出來的時候,整個cube的計算也就完成了。

圖1展示了用該演算法計算乙個四維cube的流程。

圖1 逐層演算法

每一輪的計算都是乙個mapreduce任務,且序列執行; 乙個n維的cube,至少需要n次mapreduce job。

快速cube演算法(fast cubing)是麒麟團隊對新演算法的乙個統稱,它還被稱作「逐段」(by segment) 或「逐塊」(by split) 演算法。

圖2逐塊cube演算法

與舊演算法相比,快速演算法主要有兩點不同:

一輪mapreduce便會完成所有層次的計算,減少hadoop任務的調配。

採用dfs,是為了兼顧cpu和記憶體:

圖3子立方體生成樹的遍歷

圖3是乙個四維cube的完整生成樹;按照dfs的次序,在0維cuboid 輸出前的計算次序是 abcd -> bcd -> cd -> d -> *, abcd, bcd, cd和d需要被暫存;在*被輸出後,d可被輸出,記憶體得到釋放;在c被計算並輸出後,cd就可以被輸出; abcd最後被輸出。

0000 

0001[d0]

0001[d1]

....

0010[c0]

0010[c1]

....

0011[c0][d0]

0011[c0][d1]

....

....

1111[a0][b0][c0][d0]

....

注: 這裡[d0]代表d維度的最小值,[d1]代表次小值,以此類推。

b) cube中使用了"distinct count" (hyperloglog會占用較大記憶體);

c) cube的維度較多,導致生成樹較深;

下面我們對快速cube演算法做乙個總結。

Apache Kylin Cube 的構建過程

不多說,直接上乾貨!1 cube的物理模型 cube物理模型 如上圖所示,乙個常用的3維立方體,包含 時間 地點 產品。假如data cell 中存放的是產量,則我們可以根據時間 地點 產品來確定產量,同時也可以根據時間 地點來確定所有產品的總產量等。apache kylin就將所有 時間 地點 產...

C Builder構建算二十四點小遊戲

所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...

C Builder構建算二十四點小遊戲

所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...