終於等到你——Kylin 分散式全域性字典

語言: CN / TW / HK

當時在滴滴負責 Apache Kylin 引擎時(瞭解詳情戳此處),使用者對我提的首要需求就是想要 滿足超高基數精準去重 。後來,我也與負責其他 OLAP 引擎的同事討論,大家總結了 4 條 OLAP 引擎應該具備的最重要或最常用的功能 ,其中之一就是需要具備超高基數精準去重的能力。

我有物美價廉的估算去重功能,你用嗎?」

不!要精準去重。

估算的誤差能做到 1% 左右,你用嗎?

不!我要精準去重。

此處省略一萬字 …...

注:文末有大 大驚喜

01

為什麼我們需要 Hive Global Dictionary?

Kylin 從 1.5.3 版本開始就支援全域性字典功能,對於基數不大(一億以內)的情況能夠起到很好的支援,當時的版本有兩個比較明顯的缺陷,一是全域性字典是在 Kylin Job Server 上通過單執行緒的方式構建,隨著資料的增多構建時長變得不可控;另外,隨著資料的累積,字典構建對 Job Server 的記憶體需求也不斷增多,其效能基本不能滿足我們當時更高基數全域性字典構建的需求。

基於這樣的背景,滴滴開啟了 Kylin Hive Global Dict 的探索之旅,希望新的全域性字典可以滿足以下要求:

  1. 分散式構建全域性字典

  2. 突破基數限制

  3. 提升構建速度

  4. 降低單節點所需記憶體

02

Hive Global Dictionary 的歷史與設計

在滴滴內部,我們一共進行了三個版本迭代(完整 PPT 可以參考去年 Kylin 與滴滴聯合舉辦的 Kylin Meetup )。其中,第一版本和第三版本已經合併到社群,第三版在 Kylin 社群稱之為 Hive Global Dict V2。

Hive Global Dictionary 實現的大致思路如下:

第一步,資料抽取。

通過 HiveQL,來獲取此 cube 各個全域性字典列本次新增的字面值,以及對應列之前的字典編碼最大序號,這個最大序號用於本次字典編碼的起始值 (colX_start_dict_id=colX_before_max_dict_id+1) 。

第二步,新增字面值的字典編碼。

通過兩個 MR Job 來完成對新增的字面值的編碼:第一輪先對此 cube 中所有需要全域性字典的列,進行並行區域性編碼 (colX_valueN_part_dict_id) ;然後在第二輪,再並行進行字典最終編碼 (colX_valueN_dict=colX_start_dict_id + offset + colX_valueN_part_dict_id)。

第三步,字典合併。

通過 HiveQL 的 union 操作,將第二步本次構建新增的字典合併到此 cube 的 Hive 全域性字典表中,供之後的構建使用。

第四步,原始值替換。

通過 HiveQL 的 join 操作,使用 Hive 全域性字典表的編碼整數來替換 Kylin 本次構建 flat table 中的原始值,完成對 flat table 的編碼工作。

03

Global Domain Dict

Global Domain Dict 在滴滴被叫做全域字典,當時做完全域性字典優化後,我們發現不同 cube 經常會對同一列做全域性字典,那我們能不能提供一個功能直接在 cube 之間複用字典功能呢?(注:Kylin 其實在當時已有字典複用功能,但只能 cube 自己內部的複用,並不能在 cube 之間複用。)結果當然是可行的,我們對於 Tiretree 方式和Hive Global Dict 這兩個完全不同的全域性字典,都實現了 Global Dict 的全域性複用功能,該功能目前社群已經合併到 Master 分支。

04

收益

經過 3 個版本迭代後,Hive Global Dictionary 目前基本能夠到達字典構建全部步驟的並行化,目前字典編碼(MR Job部分)基本可以恆定在 15 分鐘內完成(注:第一步資料抽取和第三步原始值替換的具體時間與資料量和資料傾斜有一定關係,但是整體時間還是非常可控的,基本不會出現構建不出來或者單個 job 需要巨大記憶體的情況)。

So,  ONE ID , I’m coming~

05

未來計劃

在未來的版本中,我們將持續打磨 Hive Global Dictionary,在保證構建高效穩定的基礎上,去嘗試服務更多業務場景。

從分散式構建引擎的方面,我們可以將現在使用的 HiveQL 切換到 SparkSQL,MR Job 構建切換到 Spark 構建,從而實現 All in Spark。其次,對於特殊情況下的構建速度下降,例如資料傾斜或者小資料量的字典構建,我們嘗試基於資料特徵來做應對。最後,由於全域性字典表是可以全域性可見的,可以成為整個公司的資料資產,在營銷分析等業務場景可以起到重要的作用。

06

後記

前幾天,Kylin 社群的同學告訴我,Kylin Hive Global Dictionary V2(分散式全域性字典V2)和 Global Domain Dictionary(全域性字典的全域性複用)功能已經合併到 Master 分支,計劃在 3.1 版本釋出,想要躍躍欲試的夥伴們,可以去吃螃蟹了。

07

參考連結

1. Hive Global Dictionary 實現細節詳解:https://cwiki.apache.org/confluence/display/KYLIN/Introduction+to+Hive+Global+Dictionary

2. 王小靜 部落格:https://blog.csdn.net/wangxiaojing123/article/details/106608077

作者 王小靜,有多年資料中臺相關產品的架構經驗,曾負責滴滴 Apache Kylin 引擎,大資料任務排程系統、資料資產引擎的架構和落地。目前在 Shopee 任 Senior Expert Engineer,負責 OLAP 相關引擎的工作。

互動環節

4 條 OLAP 引擎應具備的最重要或最常用的功能

另外三個是什麼呢?

在下方留言說出你的答案吧~

本週五(6月19日)下午 6 點前

點贊最多的 2 條留言 & 和作者想法一致的小夥伴將得到

超 shuhu 的 Kylin U 型枕!

他們都在用 Apache Kylin

eBay  | 騰訊 |  滴滴  |  小米  |  美團  |   百度  | 攜程

Strikingly  |   鬥魚  |   銀聯  |  京東  |  思科  |  一點資訊

58集團  |汽車之家  |  中國移動  |  網易遊戲  |  搜狐

滿幫集團  |  好買財富  | 特來電 |  439 9 | OLX 集團

微醫  |  馬蜂窩  | 唯品會  | 貝殼找房 |  麻袋財 富 |  綠城

點“閱讀原文”瞭解 Kylin 在滴滴的應用