58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典

在很多场景中,精确去重是一个重要指标,例如统计 UV。 从 1.5.3 版本开始支持精确去重。 使用 Bitmap 实现精确去重,使用全局字典实现字符串到 int 值的映射。

一、背景

当前全局字典介绍

基于改造后的 TireTree 实现的全局字典。
默认在单一 Kylin Job 节点上进行构建,如果一个 Cube 有多个全局字典列,会串型构建。如果将全局字典列设为 UHC(超高基数列),同个 Cube 的多个全局字典列可以通过 MR 并行构建,但是一个全局字典列只能分配在一个 Reducer 进行构建,仍然存在内存瓶颈。 当前全局字典存在的一些问题和可改进的点:

  • 目前在内存有限,且字典较大时,容易出现字典分片被频繁换入换成的抖动,导致整体效率不高;
  • 虽然一个 Cube 多个全局字典可以并发构建,但是每个全局字典,只能在单一进程中构建;
  • 实际场景中,很多列的数据有高度相似性或属于同一来源,有可能共享同一个全局字典,目前只支持 Cube 自己内部复用。

新版 Hive 全局字典

新版全局字典使用 Hive 和 MR 构建全局字典,使用 Hive 存储全局字典。
优势:

  • 同 Cube 多列全局字典构建全部并行化,提高了构建性能。使用 MR 和 Hive 进行构建,减少 Kylin 节点内存需要;
  • 突破原来全局字典的基数瓶颈;
  • 替换中间表原值,后续构建步骤都是基于字典编码值的,减少了其它步骤内存的使用,提高整个构建的效率;
  • Hive 表的形式存储全局字典,其它 Cube 或服务可以很容易的复用字典。

二、新版 Hive 全局字典的使用

使用步骤

1. 添加 Count Distinct 度量

《58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典》
图 1. 添加度量

2. 配置使用新版 Hive 全局字典(默认使用原来的 TireTree 全局字典)

《58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典》
图 2. 配置新版全局字典

配置如下:1)【必填】添加 kylin.dictionary.mr-hive.columns 配置,格式为:

{TABLE_NAME}_{COLUMN_NAME}

如果有多个列,使用逗号隔开;
2)【必填】添加 kylin.dictionary.shrunken-from-global-enabled 配置,设置为 False;
3)【可选】kylin.dictionary.mr-hive.columns.reduce.num,设置各个全局字典构建的并行度,默认值为 2,格式为:

{TABLE_NAME}_{COLUMN_NAME}:{num}

例如:

KYLIN_SALES_SALES_ID:10,KYLIN_SALES_BUYER_ID:5

3. 其他步骤不变,正常构建即可

三、构建性能对比

环境对比

Kylin 2.6 集群,13 台节点,24 × 2 Cores,堆内存为 62G。

测试案例 1 

Cube 说明:

  • cube_01:基于 tire-tree 的全局字典,包含 11 个维度,2 个度量(一个 sum,一个 bitmap);
  • cube_02:新版 Hive 全局字典,包含 11 个维度,2 个度量(一个 sum,一个 bitmap)。

 构建某一分区数据,数据量大小约为 9 千万行,全局字典列基数约为 500 万。

《58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典》
图 3. 构建情况
《58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典》
图 4. 构建时间对比

测试结果:

  • cube_01 构建总时长为 81.67 min,构建全局字典耗时约为 45 min(包含了构建维度字典的时间),构建 cuboids 耗时约为 17 min;
  • cube_02 构建总时长为 48.95 min,构建全局字典耗时约为 16 min,构建 cuboids 耗时约为 13 min。

使用新版全局字典,相比原来的 tire-tree 全局字典,性能提升了 40%。

测试案例 2

这里为了方便测试,仅仅设置了一个维度:

  • cube_03:基于 tire-tree 的全局字典,包含 1 个维度,1 个度量 (bitmap);
  • cube_04:新版 Hive 全局字典,包含 1 个维度,1个度量 (bitmap)。

 构建数据量大小约为 21 亿行,全局字典列基数约为12.8 亿。

《58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典》
图 5. 构建任务
《58集团基于Kylin平台创建新版全局字典特性支持 稳定构建20 亿基数字典》
图 6. 构建时间对比

测试结果:

  • cube_03 构建总时长为 224.6 min,构建维度字典和全局字典耗时约为 197.95 min,构建 cuboids 耗时约为 12.53 min;
  • cube_04 构建总时长为 123.85 min,构建维度字典和全局字典耗时约为 84.43  min,构建 cuboids 耗时约为 17.79 min。

使用新版全局字典,相比原来的 tire-tree 全局字典,性能提升了 45%。

四、总结

新版 Hive 全局字典的意义在于消除了原来单机构建字典的内存瓶颈和基数限制。全局字典分布式构建,可以增加并行度来提高构建效率,可以很好的满足业务需要。在全局字典列基数比较大或者同一个 Cube 存在多个全局字典列情况下,新版 Hive 全局字典的性能明显更好。 

五、文章信息

参考资料

[1] http://kylin.apache.org/cn/docs/howto/howto_use_hive_mr_dict.html

关于作者

作者:杨正,58大数据部 Kylin 核心工程师

原文信息

本文来源于 58大数据部

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注