查看原文
其他

终于等到你——Kylin 分布式全局字典

王小静 apachekylin 2022-04-23

当时在滴滴负责 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集团 | 汽车之家 | 中国移动 | 网易游戏 | 搜狐

满帮集团 | 好买财富 | 特来电 | 4399 | OLX 集团

微医 | 马蜂窝 | 唯品会 | 贝壳找房 | 麻袋财 | 绿城



点“阅读原文”了解 Kylin 在滴滴的应用

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存