上一章中講了怎麼創建cube,最後演示了一個cube怎麼執行的,這一章來說說kylin到底是怎麼來構建cube的。
點擊我們的cube的最右邊的箭頭,頁面右邊展示了整個cube構建的詳細步驟,查看每個步驟的log,顯示詳細構建過程。
1.構建中間表。
拿第二章的例子來說,就是構建由員工和部門組成的寬表。日誌如下:
2.將中間表的數據均勻分配到不同的文件。
因爲後面的程序是從中間表讀取並運行mr程序的,如果你的中間表數據不均勻會造成後續的mr程序數據傾斜,降低效率。所以非常有必要將數據均勻分配。
我們來看看kylin到底是怎麼均勻分配的。首先它會計算表中總共有多少行數據(total input rows),然後它默認每個文件1000000行數據(一百萬行數據差不多不會超過hdfs一個塊大小,也就是128M),然後計算有多少個文件(多少個reduce),total input rows/1000000。我們這裏只有1個文件。然後設定reduce任務的個數,用distribute by重新將這些數據分配到不同的文件中。
3.創建維度字典表。
比如job,可能有很多值,去重後,每個值按照0到N,一一映射保存到各個維度表中,這樣做便於以後查詢效率高,下面你就能感受到這種設計的巧妙之處了。
job value hiredate value dname value
java 0 2019-10-01 0 partA 0
c++ 1 2019-05-01 1 partB 1
python 2
4.多維度構建cube。
我這裏爲了省時就只寫三個維度了,數據量也只寫了4條。*代表無數據,也就是全體的意思,比如第二行表示了2019-05-01入職的C++的所有開發員工的薪水是30000。第三行代表了所有python員工的工資是200000。從一維到多維構建所有的情況,總共有2^n-1種情況,n表示維度。
job hiredate dname sal
java 2019-10-01 partA 10000
c++ 2019-05-01 * 30000
python * * 200000
* * partB 70000
5.Hbase K-V映射。
按照步驟3,4一一構建映射。rowkey是由維度id+維度值組成的。比如第一行 java,2019-10-01,partA,10000這條數據,每一維都有數據,所以每一維都記1,就是111,然後對照步驟3,維度值是000,結果就是111000。再舉個例子,比如第二行,c++ ,2019-05-01, * , 30000。只有前面兩維有數據,所以是110,對照步驟3,維度值就是11,結果就是11011(注意,維度值是0就省略掉)。最終步驟4構建如下所示。(爲了方便大家看,rowkey中寫了‘+’,其實是沒有‘+’)現在看看,數據全部都是數字存儲,是不是簡便了很多了。等會查詢的時候你也會發現查詢的效率也很高。
RowKey value
111+000 10000
110+11 30000
100+2 200000
001+1 70000
6.將cube data轉成HFile格式並導入HBase。
步驟5的結果實際上是以sequence格式保存在hive中,現在將hive中結果導入HBase中。