终于等到你 —— 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

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