終於等到你 —— Kylin Hive Global Dict and Global Domain Dict

前幾天,Kylin社區的同學告訴我,Kylin Hive Global DICT V2(分佈式全局字典V2)和Global Domain Dict(全域字典)功能已經合併到Master分支,將在3.1版本發佈,想要躍躍欲試的夥伴們,可以去喫螃蟹了。

當時在滴滴負責Kylin引擎時,我的第一個用戶提的首要需求就是要滿足超高基數精準去重的需求,後來也與負責其他OLAP引擎的同事討論,大家總結了4條OLAP引擎應該具備的最重要或最常用的功能,其中之一就是需要具備超高基數精準去重的能力。

”我有物美價廉的估算去重功能,你用嗎?“
”不,要精準去重“
”估算的誤差能做到1%左右,你用嗎?“
”不,我要精準去重“
此處省略一萬字…

Kylin Hive Global Dict

What And Why Kylin Hive Global dict

在這裏插入圖片描述
Kylin 從1.5.3版本開始就支持全局字典功能,對於基數不大(一億以內)的情況能夠很好的支持,當時的版本有兩個比較明顯的缺陷,構建是在Kylin Build server上且是單線程的方式,隨着數據的增多構建時長變得不可控,另外對Build Server的內存需求也不斷增多,基本不能滿足我們當時高更基數進行全局字典的構建需求。基於這樣的背景,在滴滴開啓了Kylin Hive Global Dict 的探索之旅(全局字典分佈式構建,突破基數限制,提升構建速度,降低單次build所需內存)。

Version iteration

在這裏插入圖片描述
在滴滴內部當時一共進行了三版本迭代(完整ppt可以參考去年Kylin與滴滴聯合舉辦的Kylin Meetup),其中第一版本和第三版本已經合併到社區,第三版(Kylin社區叫Hive Global Dict V2 )即爲Kylin 社區本次將發佈的版本。

Hive Global Dict V2 Implement

實現的大致思路:

  • 第一步數據抽取
    通過Hive獲取此Cube,各自全局字典列本次新增的count distinct 值以及此列之前的字典編碼最大值,用於本次字典編碼的起始值計算(colX_start_dict_num=colX_before_max_dict_num+1);
  • 第二步字典編碼
    通過MR首先對此cube中所有需要全局字典的列並行進行局部編碼(colX_valueN_part_dict_num),然後在並行進行字典最終編碼(colX_valueN_dict=colX_start_dict_num + offset + colX_valueN_part_dict_num )
  • 第三步字典合併
    通過Hive將第二步本次構建新增的字典合併到此Cube的Hive全局字典表中,供下次構建時使用;
  • 第四步原始值替換
    通過Hive將編碼後的值替換Kylin 本次構建flat table中的原始值。
    在這裏插入圖片描述
    如上圖,某個cube需要對uname求全局字典,某次構建新增張三和李三兩個用戶,之前已經有王芳這個用戶,則本次構建完成後此cube的全局字典表中會有這3個用戶的原值(key)和對應的字典編碼(value),且在構建的全局字典第四步時將會把flat table中uname列中的值由張三、李三、王芳變成其對應的字典編碼。

Kylin Global Domain Dict

Kylin Global Domain Dict 我們又叫做全域字典,當時做完全局字典優化後,發現不同cube經常會對同一列做全局字典,於是乎,咱們能不能提供一個功能直接在cube之間複用字典功能?(Kylin其實在當時已有字典複用功能,但是隻能是cube自己內部的複用,並不能在Cube之間複用。)結果當然是可行的,我們在Kylin Tiretree方式和Hive Global Dict這兩個完全不同的全局字典的方式上都加上了支持Global Domain Dict的功能,目前社區已經合併到Master分支,應該會隨着3.1版本一起發佈。So one id , I’m coming .

Effect

在這裏插入圖片描述
經過3個版本迭代後,目前基本能夠到達字典所有構建全部並行化包括同一Cube種多個列求全局字典的場景均並行化,目前字典編碼基本可以恆定在15分鐘內完成(第一步數據抽取和第三步原始值替換的具體時間與數據量和數據傾斜有一定關係,但是整體時間還是非常可控的,基本不會出現構建不出來或者單個job 需要巨大內存的情況),另外有Global Domain Dict 全域字典加特,什麼user,passenger,customer,driver table,咱每天通通只夠建一次,其他cube直接複用即可,One ID ,Go。

More Additional

在這裏插入圖片描述

——————————————————————————————
相關Issue:
https://github.com/apache/kylin/pull/1207
相關文檔:
https://cwiki.apache.org/confluence/display/KYLIN/Introduction+to+Hive+Global+Dictionary

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