cubo構建流程

Bulid操作是構建一個Cube指定的時間區間的數據,Kylin是基於預計算獲得高效的查詢速度,因此需要通過Bulid,將原始數據(比如HIVE)轉化爲目標數據(比如HBASE)。我們選擇上一節中的JOB進行整個流程分析。

Step1:生成中間臨時數據(Create Intermediate Flat Hive Table)

根據Cube定義生成的原始數據,會新創建一個HIVE外部表,然後根據Cube定義的星型模型,查詢出維度(Derived類型的維度是使用的外鍵)和度量的值插入到新創建的表中。

  • 創建外部表

表名根據Cube名稱和segment的uuid(增量cube爲時間範圍)生成的

  • 插入數據

此步選擇出事實表和維度表按照Join方式之後出現在維度或者度量參數中的列,然後再加上用戶設置的where條件和partition時間條件

Step2:重新分配(Redistribute intermediate table)

經過上一個步驟之後,Hive會在HDFS的目錄中生成一些數據文件,但是一些文件可能會很大,而另外一些文件可能會很小甚至是空的。文件大小分佈的不均衡也會導致後續的MR任務執行的不平衡:一些mapper任務會執行的很快,而其他的mapper可能會執行的很慢。爲了使這些數據分佈的更均勻一些,Kylin增加了該步驟用來重新分配各個數據文件中的數據。

Step3:創建事實表的Distinct Columns文件(Extract Fact Table Distinct Columns)

計算出現在表中每一個維度和度量的Distinct值,如果某一個維度列的distinct值比較大,那麼可能導致MR任務OOM。所以如果此步驟不能在合理的時間內完成,請重新對cube進行設計,因爲真正的build過程會花費更長的時間。

Step4:構建維度詞典(Build Dimension Dictionary)

根據上一步中已經獲得了所有維度列的distinct值的文件,接着Kylin將會在內存中構建詞典。詞典是爲了節約存儲而設計的,用於將一個成員值的編碼成一個整數類型並且可以通過整數值獲取到原始成員的值。每一個cuboid成員是以key-value存儲在hbase中,但是key一般是string,將它轉爲整數值可以減少內存佔用。通常這一步會很快,但是如果distinct值的集合很大,Kylin可能會報錯,例如,“Too high cardinality is not suitable for dictionary”。

Step5:保存Cuboid統計信息(Save Cuboid Statistics)

Step6:創建HTable(Create HTable)

Step7:計算生成 base cuboid數據文件(Build Base Cuboid)

首先清楚Base Cuboid是什麼:假如一個Cube有四個維度A,B,C,D 那麼這四種維度的所有可能組合就是Base Cuboid,類似於在查詢中select count(1) from table group by A,B,C,D 這個查詢結果的個數就是Base Cuboid的成員數。也是通過MR任務完成的,輸入的是第一步中的輸出文件。

Step8:計算第N層的Cuboid文件(Build N-Dimension Cuboid)

該流程是由多個步驟組成,逐層算法的處理過程,步驟的數量是根據維度組合的Cuboid總數決定的。每一步都使用前一步的輸出作爲輸入,然後去除某個維度進行聚合,生成一個子cuboid。例如,對於cuboid ABCD,去除維度A可以獲得cuboid BCD,去除維度B可以獲得cuboid ACD等。

我們可以看一下該流程生成的HDFS數據文件:

Step9:基於內存構建Cube(Build Cube In-Mem)

如果聚合都在Reduce端,那麼通過Shuffle傳輸到Reduce端會造成很大的網絡壓力。那麼可不可以把聚合放到Map端來做呢?Reduce端再做最後的聚合。這樣Reduce收到的數據就會變小,網絡壓力得以減輕。

該步驟在執行的時候會使用“conf/kylin_job_conf_inmem.xml”中的相關配置項,我們會發現增大了Mapper端的內存,因爲部分聚合放到了Mapper端。

Step10:將Cuboid轉爲HFile(Convert Cuboid Data to HFile)

將Cuboid數據轉化爲HFile。輸入數據包括所有的cuboid文件,輸出hfile文件。

Step11:將HFile導入到HBASE表中(Load HFile to HBase Table)

這一步使用了HBase API將HFile導入到HBase的region中,這一步很簡單,也很快。

Step12:更新Cube信息(Update Cube Info)

將數據導入Hbase中之後,Kylin會將新生成的segment在元數據中的狀態修改爲ready。

Step13:清理中間表 (Hive Cleanup)

將之前生成的臨時中間表刪除。

https://blog.csdn.net/skyyws/article/details/54923630 構建流程優化


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章