Kyligence Copilot - AI 数智助理,以 AI 变革企业经营与管理! 立即了解更多

Apache Kylin 优化利器KyBot: Rowkey一键优化

张琦
2017年 7月 26日

在KyBot最新版本中,新增了Rowkey一键优化功能,可根据维度自身的数据特征以及用户的查询模式推荐给用户最优的Rowkey排序和编码建议。本文将介绍Rowkey的优化原理及使用方法。

Apache Kylin 简介

Apache Kylin是领先的开源OLAP on Hadoop引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力,支持海量数据上的亚秒级响应。

KyBot 简介

KyBot(https://kybot.io)是为Apache Kylin及其商业版KAP提供在线诊断及优化的平台。通过分析Kylin的日志等信息,为用户提供运维智能优化和Cube调优服务,包括诊断慢查询、Cube存储倾斜、Job构建瓶颈等功能、帮助用户降低运维成本、提高Hadoop集群利用率。在KyBot最新版本中,新增了Rowkey一键优化功能,可以根据维度自身的数据特征以及用户的查询模式推荐给用户最优的Rowkey排序和编码建议。

为什么要优化Rowkey?

Apache Kylin使用HBase做为Cube的存储引擎。HBase是Hadoop上的Key-Value数据库,支持按Key的随机查询与写入,这个Key在HBase中称为Rowkey;为了能够支持按多个维度进行查询,Kylin需要将多个维度值以某种次序组成Rowkey。排在Rowkey靠前部分的维度,将比排在靠后部分的维度更易于做筛选(可以直接使得HBase Scan Range大幅缩小),因此查询效率更高。除了各维度在Rowkey上的次序外,维度的编码方法对于空间占用及查询性能也有着显著的影响。

Rowkey 优化原理

1、编码

对维度值编码,可以将值转成长度一致的字节,合适的编码能减少维度对空间的占用,Cube中可能存在数以亿计的行数,使用编码节约的空间累加起来将是一个非常巨大的数字,同时编码值也会加速查询过滤。

Kylin支持的编码类型如下:
· Dict编码:使用字典将长的值映射成短的ID,适合中低基数的维度,默认推荐编码。但由于字典要被加载到Kylin内存中,在超高基情况下,可能引起内存不足的问题。
· Fixed_Length编码:适用于超高基场景,将选取字段的前N个字节作为编码值,当N小于字段长度,会造成字段截断,当N较大时,造成RowKey过长,查询性能下降。只适用于varchar或nvarchar类型。
· Fixed_Length_Hex编码:适用于字段值为十六进制字符,比如1A2BFF或者FF00FF,每两个字符需要一个字节。只适用于varchar或nvarchar类型。
· Integer编码:将数值类型字段直接用数字表示,不做编码转换。Integer编码需要提供一个额外的参数“Length”来代表需要多少个字节。Length的长度为1到8,支持的整数区间为[ -2^(8*N-1), 2^(8*N-1)]
· Date编码:将日期类型的数据使用三个字节进行编码,支持的格式包括yyyyMMdd、yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy-MM-dd HH:mm:ss.SSS,其中如果包含时间戳部分会被截断。
· Time编码:对时间戳字段进行编码,支持范围为[ 1970-01-01 00:00:00, 2038/01/19 03:14:07],毫秒部分会被忽略。time编码适用于time, datetime, timestamp等类型。
· Boolean编码:用一个byte表示布尔值,适用于字段值为: true, false, TRUE, FALSE, True, False, t, f, T, F, yes, no, YES, NO, Yes, No, y, n, Y, N, 1, 0

2、Rowkey 顺序

Kylin会将查询条件,转换成HBase中Range Scan操作的start_key和end_key两个参数。设计良好的Rowkey将更有效地完成数据的查询过滤和定位,减少IO次数,提高查询速度,维度在rowkey中的次序,对查询性能有显著的影响。

在调整Rowkey 的顺序时需要结合以下2个原则:
· 在查询中被用作过滤条件的维度放在非过滤条件维度的前面
· 基数较高的维度,放在基数较低维度之前
从上可以看出,良好的Rowkey设计需要Cube设计者掌握复杂的编码原理以及Kylin的核心知识,对于大多数用户来说具有一定难度。用户期望有智能工具能给予自动的推荐。

使用KyBot优化

如图1所示,在Cube调优页面的Rowkey模块,可以查看到Rowkey的基础信息和查询统计。基础信息包含基数、字段类型、编码以及是否为shardby 。查询统计包含维度出现的频次、作为过滤条件出现的次数占比、作为聚合条件出现的占比。并且,基数、出现频次、过滤百分比及聚合百分比都支持排序,用户可从多个角度对Rowkey进行洞悉,譬如按照基数降序排列,基数较大的Rowkey可以考虑前置;按照过滤出现次数占比排序,比例较高的Rowkey可以考虑前置。

图1 Rowkey一键优化前

KyBot不仅分析了当前Rowkey设计的有效性,最新支持的“Rowkey智能推荐“更直接给出了建议的解决方案。如下图2所示。点击左上角的“建议设置”按钮后,可以看到整个Rowkey进行了重新排序,不合适的编码也被标示了出来,并且给出了建议的编码。在这个例子中,基数较大和过滤次数较多的Rowkey[KYLIN-SALES.CATAGORY-CODE] [KYLIN-SALES.USER_NAME][KYLIN_SALES.SECTION_CODE][KYLIN_SALES.SECTION_NAME]排序被前置;[KYLIN_SALE.USER_NAME]是超高基数,用dict编码容易造成构建引擎或查询引擎的内存溢出,建议使用fixed_length编码;[KYLIN_SALES.SELLER_ID]是编码int64类型的整数,length设为8更合适。

图2 Rowkey一键优化后

Rowkey 一键优化功能为用户推荐了更合适的编码算法和Rowkey排序,这些推荐能力建立在对数据特性以及查询模式的深入理解上,所以上传的诊断包越多,查询信息越多,建议越精确。 无需自行分析,就可以得到最优的Rowkey建议,想要深究的用户也可以通过本文所提到的Rowkey设计原理,结合KyBot 展示的信息及对业务的理解,自行进行优化。

添加企微

kyligence
关注我们

kyligence