Apache Kylin 入門 6 - 優化 Cube

Apache Kylin 入門系列目錄算法

本文從各個角度總結一些 Kylin 實踐相關的最佳實踐,不必定很是準確,歡迎批評指正。編程

1、維度表與事實表

一、維度表

  1. 要具備數據一致性,主鍵值必須是惟一的(不然 Kylin 構建過程會報錯);
  2. 維度表越小越好,由於 Kylin 會將維度表加載到內存中供查詢,過大的表不適合做爲維度表,默認的閾值是 300MB;
  3. 改變頻率低,Kylin 會在每次構建中試圖重用維度表的快照(Snapshot),若是維度表常常改變的話,重用就會失效,這就會致使要常常對維度表建立快照;
  4. 維度表最好不要是 Hive 視圖(View),由於每次都須要將視圖進行物化,從而致使額外的時間開銷。

二、事實表

  1. 移除不參與 Cube 構建的字段,能夠提高構建速度,下降 Cube 構建結果的大小;
  2. 儘量將事實表進行維度拆分,提取公用的維度;
  3. 保證維度表與事實表的映射關係,過濾沒法映射的記錄。

若是維度與事實表沒法映射,某些字段(數據類型爲 number 系列)會遇到構建失敗的問題(numberFormatException('\N')\N 是爲 Hive 中 NULL 的實際存儲內容);此外,在進行 Left Join 的時候會產生大量的 NULL,這些 NULL 值在真正查詢中根本沒有任何做用。架構

三、分區表

Hive 表支持多分區(Partition),簡單地說,一個分區就是一個文件目錄,存儲了特定的數據文件。當有新的數據生成的時候,能夠將數據加載到指定的分區,讀取數據的時候也能夠指定分區。對於 SQL 查詢,若是查詢中指定了分區列的屬性條件,則 Hive 會智能地選擇特定分區(也就是目錄),從而避免全量數據的掃描,減小讀寫操做對集羣的壓力。app

Kylin 支持增量的 Cube 構建,一般是按時間屬性來增量地從 Hive 表中抽取數據。若是 Hive 表正好是按此時間屬性作分區的話,那麼就能夠利用到 Hive 分區的好處,每次在 Hive 構建的時候均可以直接跳過不相干日期的數據,節省 Cube 構建的時間。這樣的列在 Kylin 裏也稱爲分割時間列(Partition Time Column),一般它應該也是 Hive 表的分區列。oop

2、Cube 構建優化

一、維度優化

  1. 分析查詢條件,不參與 Group By 或者 Where 過濾的條件維度必定不要勾選;
  2. 通常而言,Left Join 右側表裏面的字段都可以做爲 Derived (衍生)維度;
  3. 必需維度、層級維度、聯合維度、衍生維度四種維度優化方案;
  4. 聚合組進一步對維度組合進行優化。

必需維度、層級維度、聯合維度、衍生維度以及聚合組能夠參看 Apache Kylin 入門 5 一文的詳細說明。post

二、其餘優化

  1. RowKeys 順序:Mandatory 維度、where 過濾條件中出現頻率較多的維度、高基數維度、低基數維度;
  2. ShardBy 設置:建議選擇基數較大的列做爲 ShardBy 列,以使得數據能夠均勻分佈;
  3. 數據壓縮:Kylin 針對維度字典以及維度錶快照採用了特殊的壓縮算法,對於 HBase 中的聚合計算數據利用了 Hadoop 的 LZO 或者是 Snappy 等壓縮算法,從而保證存儲在 HBase 以及內存中的數據儘量地小;
  4. 對於大的事實表能夠採用分區來增量構建,而後設置按期自動合併(Merge)操做;
  5. 事實表中日期數據類型爲儘量設置爲 date;
  6. ShardBy 字段有助於所有數據分散分佈在各個 Region 中,有助於防止出現數據傾斜等問題;
  7. ShardBy 字段爲 True 後,同一個值的數據會存儲在一塊兒,便於批量撈取數據。

3、注意事項

一、哪些維度參與了 Cuboid 構建?

不少人會誤覺得只有聚合組 Includes 裏面被選擇的維度才參與 Cube 構建的計算,其實真正參與計算是 Dimensions 設置界面選擇爲 Default 的那些維度,還有 Left Join 的字段(若是其 Derived 字段被勾選)。優化

簡單來講,在 RowKeys 排序界面看到的維度都會參與 Cuboid 的構建,若是在 RowKeys 看到不想參與計算的維度,能夠到 Dimensions 設置界面進行修改。code

二、結合業務設置層級維度

層級維度在設置的時候必定要深入理解業務,例如:企業到底歸屬到行業類型下仍是歸屬到區域類型下?從層級結構的角度來說都是能夠的,深層次挖掘業務需求後咱們會發現,凡是查詢企業的時候均附帶有區域的過濾條件,所以將企業歸屬到區域的層級下比歸屬到行業類型下更加有效。orm

三、善於嘗試

在實踐中,可能會遇到各類不肯定的思路,最佳的作法是去實踐,多創建 Model 和 Cube,從不一樣層次去優化,去嘗試,在實踐中不斷總結經驗。cdn


Any Code,Code Any!

掃碼關注『AnyCode』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索