OLAP引擎Kylin——Cube优化

  |   0 评论   |   2,614 浏览

背景知识

Cube的优化主要是在“高级设置”那一步实现的

Fact Table

事实表(Fact Table)是中心表,包含了大批数据并不冗余,其数据列可分为两类:

包含大量数据事实的列;

与维表(Dimension Table)的primary key相对应的foreign key。

Lookup Table

Lookup Table包含对事实表的某些列进行扩充说明的字段。在Kylin的quick start中给出sample cube(kylin_sales_cube)——其Fact Table为购买记录,lookup table有两个:用于对购买日期PART_DT、商品的LEAF_CATEG_ID与LSTG_SITE_ID字段进行扩展说明。

Dimension

维表(Dimension Table)是由fact table与lookup table逻辑抽象出来的表,包含了多个相关的列(即dimension),以提供对数据的多维观察;其中dimension的值的数目称为cardinatily。在kylin_sales_cube的事实表的LSTG_FORMAT_NAME被单独抽出来做一个dimension,可与其他维度组合分析数据。

Aggregation Group(聚合组)

用户根据自己关注的维度组合,可以划分出自己关注的组合大类,这些大类在 Apache Kylin 里面被称为聚合组

Dimension类型

在kylin中存在的维度是为了减少cuboid的个数,而不是每一个维度是否缓存的,当前kylin是对所有的cuboid中的所有组合都进行计算和存储的,对于普通的dimension,N个维度的cuboid个数为2的N次方,而kylin中设置了一些维度可以减少cuboid个数,当然,这需要使用者对自己需要的维度十分了解,知道自己可能根据什么进行group by

Normal Dimension

最常见的类型,与所有其他的dimension组合构成cuboid

Mandatory(固定) Dimension

每次查询的group by中都会携带的维度,将dimension设置为Mandatory,可以将维度组合减少一半

在下图中A为Mandatory dimension,则与B、C总共构成了4个cuboid,相较于normal dimension的cuboid(2^3=8)减少了一半

image.png

Hierarchy(层级) Dimension

在Fact table(事实表)中的维度满足层级关系时定义这几个维度为Hierarchy。一些列具有层次关系的Dimension组成一个Hierarchy,比如年,月,日组成了一个Hierarchy。

需要进行OLAP操作,如上卷、下钻等的字段有层级关系的维度也可以大大减少cuboid的个数

image.png

使用该类型字段的局限在于,查询时只能使用group by year ;  group by year, month; group by year,  month, day,而不能使用group by month,day,如果需要单独的对month进行聚合,那么还需要再使用month列定义一个单独的普通维度

Derived(衍生) Dimension

这类维度的意思是可推导的维度,例如在某张Look up Table(维度表)中有多个维度,该维度表对应的一个或者多个列可以和维度表的主键是一对一的,那么可以将其设置为Derived Dimension。

在Kylin内部会将其用统一的主键来替换,以此来达到降低维度组合的数据。当仍然在一定程度上会降低查询效率。

image.png

例如timeid是时间这个维度表的主键,也就是事实表的外键,时间只精确到天,那么year、month、day三列可以唯一对应着一个time_id,而time_id是事实表的外键,那么我们可以指定year、month、day为一个derived维度,实际存储的时候可以只根据timeid的取值决定维度的组合,但这就要求我们在查询的时候使用的group by必须指定derived维度集合中的所有列

Joint Dimension

可以视为一个维度的几个维度,如用户的查询语句中仅仅会出现 group by A, B, C,而不会出现 group by A, B 或者 group by C 等等这些细化的维度组合

将N个维度设置为联合维度,则这N个维度组合成的cuboid个数会从2的N次方减少到1。

维度的顺序

维度的顺序很重要,ID决定了这个维度在数组中执行查找时改维度对应的第一个维度

image.png

HBase Rowkey顺序

查询频率越高的维度在Rowkey中的顺序需要越靠前

image.png

调整Cube并发粒度

当Segment中某个Cuboid的大小超出一定的阈值时,系统会将该Cuboid的数据分片到多个Hbase Region Server,从而实现Cuboid数据读取的并行化,优化Cube的查询速度。

kylin的默认设置中

kylin.storage.hbase.region-cut-gb=5,
kylin.storage.hbase.min-region-count=1,
kylin.storage.hbase.max-region-count=500

在实际应用中(根据实际数据量调整),可以将

kylin.storage.hbase.min-region-count=2,
kylin.storage.hbase.max-region-count=100,
kylin.storage.hbase.region-cut-gb=1

上面设置为最小为2个分区,每个分区大小为1G,最多设置100个region分区。

其它方面的优化

  1. 对于大的事实表可以采用分区来增量构建;

  2. Cube的维度如果超过10个,建议将常用的聚合字段分组。也可修改Kylin的参数,限制Cube的维度个数或者维度组合个数;

  3. Cube中定义Rowkey顺序:Mandatory维度、where过滤条件中出现频率较多的维度、高基数维度、低基数维度;

  4. 使用Nginx做负载均衡,后端启动多个Query Server接收查询请求,提高并发度;


参考《Design Cube in Kylin

读后有收获可以支付宝请作者喝咖啡