標籤:

Apache Kylin 優化利器KyBot: Rowkey一鍵優化

在KyBot最新版本中,新增了Rowkey一鍵優化功能,可根據維度自身的數據特徵以及用戶的查詢模式推薦給用戶最優的Rowkey排序和編碼建議。本文將介紹Rowkey的優化原理及使用方法。

Apache Kylin 簡介

Apache Kylin是領先的開源OLAP on Hadoop引擎,提供Hadoop之上的SQL查詢介面及多維分析(OLAP)能力,支持海量數據上的亞秒級響應。

KyBot 簡介

KyBot(kybot.io)是為Apache Kylin及其商業版KAP提供在線診斷及優化的平台。通過分析Kylin的日誌等信息,為用戶提供運維智能優化和Cube調優服務,包括診斷慢查詢、Cube存儲傾斜、Job構建瓶頸等功能、幫助用戶降低運維成本、提高Hadoop集群利用率。在KyBot最新版本中,新增了Rowkey一鍵優化功能,可以根據維度自身的數據特徵以及用戶的查詢模式推薦給用戶最優的Rowkey排序和編碼建議。

為什麼要優化Rowkey?

Apache Kylin使用HBase做為Cube的存儲引擎。HBase是Hadoop上的Key-Value資料庫,支持按Key的隨機查詢與寫入,這個Key在HBase中稱為Rowkey;為了能夠支持按多個維度進行查詢,Kylin需要將多個維度值以某種次序組成Rowkey。排在Rowkey靠前部分的維度,將比排在靠後部分的維度更易於做篩選(可以直接使得HBase Scan Range大幅縮小),因此查詢效率更高。除了各維度在Rowkey上的次序外,維度的編碼方法對於空間佔用及查詢性能也有著顯著的影響。

Rowkey 優化原理

1、編碼

對維度值編碼,可以將值轉成長度一致的位元組,合適的編碼能減少維度對空間的佔用,Cube中可能存在數以億計的行數,使用編碼節約的空間累加起來將是一個非常巨大的數字,同時編碼值也會加速查詢過濾。

Kylin支持的編碼類型如下:

· Dict編碼:使用字典將長的值映射成短的ID,適合中低基數的維度,默認推薦編碼。但由於字典要被載入到Kylin內存中,在超高基情況下,可能引起內存不足的問題。

· Fixed_Length編碼:適用於超高基場景,將選取欄位的前N個位元組作為編碼值,當N小於欄位長度,會造成欄位截斷,當N較大時,造成RowKey過長,查詢性能下降。只適用於varchar或nvarchar類型。

· Fixed_Length_Hex編碼:適用於欄位值為十六進位字元,比如1A2BFF或者FF00FF,每兩個字元需要一個位元組。只適用於varchar或nvarchar類型。

· Integer編碼:將數值類型欄位直接用數字表示,不做編碼轉換。Integer編碼需要提供一個額外的參數「Length」來代表需要多少個位元組。Length的長度為1到8,支持的整數區間為[ -2^(8*N-1), 2^(8*N-1)]

· Date編碼:將日期類型的數據使用三個位元組進行編碼,支持的格式包括yyyyMMdd、yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy-MM-dd HH:mm:ss.SSS,其中如果包含時間戳部分會被截斷。

· Time編碼:對時間戳欄位進行編碼,支持範圍為[ 1970-01-01 00:00:00, 2038/01/19 03:14:07],毫秒部分會被忽略。time編碼適用於time, datetime, timestamp等類型。

· Boolean編碼:用一個byte表示布爾值,適用於欄位值為: true, false, TRUE, FALSE, True, False, t, f, T, F, yes, no, YES, NO, Yes, No, y, n, Y, N, 1, 0

2、Rowkey 順序

Kylin會將查詢條件,轉換成HBase中Range Scan操作的start_key和end_key兩個參數。設計良好的Rowkey將更有效地完成數據的查詢過濾和定位,減少IO次數,提高查詢速度,維度在rowkey中的次序,對查詢性能有顯著的影響。

在調整Rowkey 的順序時需要結合以下2個原則:

· 在查詢中被用作過濾條件的維度放在非過濾條件維度的前面

· 基數較高的維度,放在基數較低維度之前

從上可以看出,良好的Rowkey設計需要Cube設計者掌握複雜的編碼原理以及Kylin的核心知識,對於大多數用戶來說具有一定難度。用戶期望有智能工具能給予自動的推薦。

使用KyBot優化

如圖1所示,在Cube調優頁面的Rowkey模塊,可以查看到Rowkey的基礎信息和查詢統計。基礎信息包含基數、欄位類型、編碼以及是否為shardby 。查詢統計包含維度出現的頻次、作為過濾條件出現的次數佔比、作為聚合條件出現的佔比。並且,基數、出現頻次、過濾百分比及聚合百分比都支持排序,用戶可從多個角度對Rowkey進行洞悉,譬如按照基數降序排列,基數較大的Rowkey可以考慮前置;按照過濾出現次數佔比排序,比例較高的Rowkey可以考慮前置。

圖1 Rowkey一鍵優化前

KyBot不僅分析了當前Rowkey設計的有效性,最新支持的「Rowkey智能推薦「更直接給出了建議的解決方案。如下圖2所示。點擊左上角的「建議設置」按鈕後,可以看到整個Rowkey進行了重新排序,不合適的編碼也被標示了出來,並且給出了建議的編碼。在這個例子中,基數較大和過濾次數較多的Rowkey[KYLIN-SALES.CATAGORY-CODE] [KYLIN-SALES.USER_NAME][KYLIN_SALES.SECTION_CODE][KYLIN_SALES.SECTION_NAME]排序被前置;[KYLIN_SALE.USER_NAME]是超高基數,用dict編碼容易造成構建引擎或查詢引擎的內存溢出,建議使用fixed_length編碼;[KYLIN_SALES.SELLER_ID]是編碼int64類型的整數,length設為8更合適。

圖2 Rowkey一鍵優化後

Rowkey 一鍵優化功能為用戶推薦了更合適的編碼演算法和Rowkey排序,這些推薦能力建立在對數據特性以及查詢模式的深入理解上,所以上傳的診斷包越多,查詢信息越多,建議越精確。 無需自行分析,就可以得到最優的Rowkey建議,想要深究的用戶也可以通過本文所提到的Rowkey設計原理,結合KyBot 展示的信息及對業務的理解,自行進行優化。


推薦閱讀:

如何看待2016年4月26日晚,中國互聯網被Struts2漏洞血洗?
PHP寫的API如何防止拒絕服務攻擊?
項目做到什麼程度才可以進入Apache Incubator(Apache孵化器)?
WEB伺服器如何選擇 Apache or Nginx?
Ambari之安裝篇

TAG:Apache |