Apache Kylin 入門 6 - 優化 Cube

rochy_he發表於2018-11-06

Apache Kylin 入門系列目錄

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

一、維度表與事實表

1、維度表

  1. 要具有資料一致性,主鍵值必須是唯一的(否則 Kylin 構建過程會報錯);
  2. 維度表越小越好,因為 Kylin 會將維度表載入到記憶體中供查詢,過大的表不適合作為維度表,預設的閾值是 300MB;
  3. 改變頻率低,Kylin 會在每次構建中試圖重用維度表的快照(Snapshot),如果維度表經常改變的話,重用就會失效,這就會導致要經常對維度表建立快照;
  4. 維度表最好不要是 Hive 檢視(View),因為每次都需要將檢視進行物化,從而導致額外的時間開銷。

2、事實表

  1. 移除不參與 Cube 構建的欄位,可以提升構建速度,降低 Cube 構建結果的大小;
  2. 儘可能將事實表進行維度拆分,提取公用的維度;
  3. 保證維度表與事實表的對映關係,過濾無法對映的記錄。

如果維度與事實表無法對映,某些欄位(資料型別為 number 系列)會遇到構建失敗的問題(numberFormatException('\N')\N 是為 Hive 中 NULL 的實際儲存內容);此外,在進行 Left Join 的時候會產生大量的 NULL,這些 NULL 值在真正查詢中根本沒有任何作用。

3、分割槽表

Hive 表支援多分割槽(Partition),簡單地說,一個分割槽就是一個檔案目錄,儲存了特定的資料檔案。當有新的資料生成的時候,可以將資料載入到指定的分割槽,讀取資料的時候也可以指定分割槽。對於 SQL 查詢,如果查詢中指定了分割槽列的屬性條件,則 Hive 會智慧地選擇特定分割槽(也就是目錄),從而避免全量資料的掃描,減少讀寫操作對叢集的壓力。

Kylin 支援增量的 Cube 構建,通常是按時間屬性來增量地從 Hive 表中抽取資料。如果 Hive 表正好是按此時間屬性做分割槽的話,那麼就可以利用到 Hive 分割槽的好處,每次在 Hive 構建的時候都可以直接跳過不相干日期的資料,節省 Cube 構建的時間。這樣的列在 Kylin 裡也稱為分割時間列(Partition Time Column),通常它應該也是 Hive 表的分割槽列。

二、Cube 構建優化

1、維度優化

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

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

2、其他優化

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

三、注意事項

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

很多人會誤以為只有聚合組 Includes 裡面被選擇的維度才參與 Cube 構建的計算,其實真正參與計算是 Dimensions 設定介面選擇為 Default 的那些維度,還有 Left Join 的欄位(如果其 Derived 欄位被勾選)。

簡單來說,在 RowKeys 排序介面看到的維度都會參與 Cuboid 的構建,如果在 RowKeys 看到不想參與計算的維度,可以到 Dimensions 設定介面進行修改。

2、結合業務設定層級維度

層級維度在設定的時候一定要深刻理解業務,例如:企業到底歸屬到行業型別下還是歸屬到區域型別下?從層級結構的角度來講都是可以的,深層次挖掘業務需求後我們會發現,凡是查詢企業的時候均附帶有區域的過濾條件,因此將企業歸屬到區域的層級下比歸屬到行業型別下更加有效。

3、善於嘗試

在實踐中,可能會遇到各種不確定的思路,最佳的做法是去實踐,多建立 Model 和 Cube,從不同層次去優化,去嘗試,在實踐中不斷總結經驗。


Any Code,Code Any!

掃碼關注『AnyCode』,程式設計路上,一起前行。

Apache Kylin 入門 6 - 優化 Cube

相關文章