设计CUBE by kylin

Posted on 2019-03-21 11:40  打杂滴  阅读(603)  评论(0编辑  收藏  举报

1.新增或者选择一个已有项目(project)后,将hive数据导入到kylin中,web界面的Model→Data source,导入数据

2.创建数据模型,数据模型是Cube的基础,它主要用于描述一个星形模型。有了数据模型以后,定义Cube的时候就可以直接从此模型定义的表和列中进行选择了,省去重复指定连接(join)条件的步骤。基于一个数据模型还可以创建多个Cube,以方便减少用户的重复性工作。在Kylin界面的“Models”页面中,单击“New”→“New Model”,开始创建数据模型.

 a.输入模型名称;b.选择一个事实表,添加维表(可选),添加维表时要选择表连接类型,inner或者left,然后选择连接的主键和外键,支持多主键;c.选择维度和度量列,这是选择一个范围,不代表将来一定要用作cube维度度量。后续创建Cube的时候,将只能从这些列中进行选择;d:setting,为模型补充分割时间列信息和过滤条件.如果此模型中的事实表记录是按时间增长的,那么可以指定一个日期/时间列作为模型的分割时间列,从而可以让Cube按此列做增量构建.过滤(Filter)条件是指,如果想把一些记录忽略掉,那么这里可以设置一个过滤条件。Kylin在向Hive请求源数据的时候,会带上此过滤条件。

3.设计cube  

1.选择数据模型,定义cube名字,可选择输入邮箱,事件

2.选择维度

如果是衍生维度的话,则必须是来自于某个维度表,一次可以选择多个列,由于这些列值都可以从该维度表的主键值中衍生出来,所以实际上只有主键列会被Cube加入计算。而在Kylin的具体实现中,往往采用事实表上的外键替代主键进行计算和存储。但是在逻辑上可以认为衍生列来自于维度表的主键。

3.创建度量

4.关于Cube数据刷新的设置

在这里可以设置自动合并的阈值、数据保留的最短时间,以及第一个Segment的起点时间(如果Cube有分割时间列的话)

5.高级设置,可以设置聚合组和Rowkey

 Kylin默认会把所有维度都放在同一个聚合组中;如果维度数较多(例如>10),那么建议用户根据查询的习惯和模式,单击“New AggregationGroup+”,将维度分为多个聚合组。通过使用多个聚合组,可以大大降低Cube中的Cuboid数量。下面来举例说明,如果一个Cube有(M+N)个维度,那么默认它会有2的m+n 次方个Cuboid;如果把这些维度分为两个不相交的聚合组,那么Cuboid的数量将被减少为2次方 +2次方。

在单个聚合组中,可以对维度设置高级属性,如Mandatory、Hierarchy、Joint等。

mandatory  ['mændətɔri]

  • adj. 强制的;托管的;命令的
  • n. 受托者(等于mandatary)

Hierarchy['haɪərɑrki] 是一组有层级关系的维度

Mandatory维度指的是那些总是会出现在Where条件或Group By语句里的维度;通过将某个维度指定为Mandatory,Kylin就可以不用预计算那些不包含此维度的Cuboid,从而减少计算量。

 Joint是将多个维度组合成一个维度,其通常适用于如下两种情形:总是会在一起查询的维度,基数很低的维度。

Kylin以Key-Value的方式将Cube存储到HBase中。HBase的key,也就是Rowkey,是由各维度的值拼接而成的;为了更高效地存储这些值,Kylin会对它们进行编码和压缩;每个维度均可以选择合适的编码(Encoding)方式,默认采用的是字典(Dictionary)编码技术;除了字典以外,还有整数(Int)和固定长度(Fixed Length)的编码。

字典编码是将此维度下的所有值构建成一个从string到int的映射表;Kylin会将字典序列化保存,在Cube中存储int值,从而大大减小存储的大小。另外,字典是保持顺序的,即如果字符串A比字符串B大的话,那么A编码后的int值也会比B编码后的值大;这样可以使得在HBase中进行比较查询的时候,依然使用编码后的值,而无需解码。

字典非常适合于非固定长度的string类型值的维度,而且用户无需指定编码后的长度;但是由于使用字典需要维护一张映射表,因此如果此维度的基数很高,那么字典的大小就非常可观,从而不适合于加载到内存中,在这种情况下就要选择其他的编码方式了。Kylin中字典编码允许的基数上限默认是500万(由参数“kylin.dictionary.max.cardinality”配置)。

 整数(int)编码适合于对int或bigint类型的值进行编码,它无需额外存储,同时还可以支持很大的基数。用户需要根据值域选择编码的长度。例如有一个“手机号码”的维度,它是一个11位的数字,如13800138000,我们知道它大于231 ,但是小于239 -1,那么使用int(5)即可满足要求,每个值占用5字节,比按字符存储(11字节)要少占用一半以上的空间。

 

新创建的Cube只有定义,而没有计算的数据,它的状态是“DISABLED”,是不会被查询引擎挑中的。要想让Cube有数据,还需要对它进行构建。Cube的构建方式通常有两种:全量构建和增量构建;两者的构建步骤是完全一样的,区别只在于构建时读取的数据源是全集还是子集。

Cube的构建包含如下步骤,由任务引擎来调度执行。

1)创建临时的Hive平表(从Hive读取数据)。
2)计算各维度的不同值,并收集各Cuboid的统计数据。
3)创建并保存字典。
4)保存Cuboid统计信息。
5)创建HTable。
6)计算Cube(一轮或若干轮MapReduce)。

7)将Cube的计算结果转成HFile。
8)加载HFile到HBase。
9)更新Cube元数据。
10)垃圾回收。

 

构建cube遇到的问题:

java.lang.NullPointerException

可能是没有获取最新的meta数据导致

解决方法:reload metadata

 

重新分布中间表

作用:防止不均匀
默认是100W一个文件,你可以通过conf/kylin.properties
kylin.job.mapreduce.mapper.input.rows=500000这个进行配置
在构建cube的时候有一个配置叫做shard by这个可以设置,这个用于高基数的维度有很大作用,可以避免数据的重新分布也就是减少了shuffle 这个起码可以减少40%的build时间.
 
 
 
hybrid:ˈhaɪbrɪd 杂种 混合物
算法原理对程序的执行速度有很清晰的定义,称为时间复杂度。对应到大数据查询,可以概括为查询速度与被查询数据总量之间的关系。在给定硬件条件下,假设数据总量为N,查询时间随数据量增长而线性增长,被称为O(N) 时间复杂度;查询时间不随数据量的增长而增长,被称为O(1) 时间复杂度
 
为了支持Cube中的数据能够不断地得到更新,且无需重复地为已经处理过的历史数据构建Cube,因此对于Cube引入了增量构建的功能。
我们将Cube划分为多个Segment,每个Segment用起始时间和结束时间来标志。Segment代表一段时间内源数据的预计算结果。
 
全量构建可以看作增量构建的一种特例:在全量构建中,Cube中只存在唯一的一个Segment,该Segment没有分割时间的概念,因此也就没有起始时间和结束时间。
 
对于全量构建来说,每当需要更新Cube数据的时候,它不会区分历史数据和新加入的数据,也就是说,在构建的时候会导入并处理所有的原始数据。而增量构建只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算.
 
增量构建抽取数据的范围,采用了前包后闭的原则,即包含了开始时间,但不包含结束时间,从而保证上一个Segment的结束时间与下一个Segment的起始时间相同,但数据不会重复.
 
Cube构建完成以后,如果某些历史数据发生了改动,那么需要针对相应的Segment进行重新计算,这种构建称为刷新。刷新通常只针对增量构建的Cube而言,因为全量构建的Cube只要重新全部构建就可以得到更新;而增量更新的Cube因为有多个Segment,因此需要先选择要刷新的Segment,然后再进行刷新。
在刷新的同时,Cube仍然可以被查询,只不过返回的是陈旧数据。当Segment刷新完毕时,新的Segment会立即生效,查询开始返回最新的数据。老Segment则成为垃圾,等待回收。
 
 随着时间的迁移,Cube中可能会存在较多数量的Segment,使得查询性能下降,并且会给HBase集群管理带来压力。对此,需要适时地将一些Segment进行合并,将若干个小Segment合并成较大的Segment。
合并的好处:
合并相同的Key,从而减少Cube的存储空间。
由于Segment减少了,因此可以减少查询时的二次聚合,提高了查询性能。
HTable的数量得以减少,更便于集群的管理。
 
合并的时候,Kylin将直接以当初各个Segment构建时生成的Cuboid文件作为输入内容,而不需要从Hive加载原始数据。后续的步骤跟构建时基本一致。直到新的HTable加载完成后,Kylin才会卸载旧的HTable,从而确保在整个合并过程中,Cube都是可以查询的。
 
Cube构建好以后,状态变为“READY”,就可以进行查询了
 
需要了解的是,只有当查询的模式跟Cube定义相匹配的时候,Kylin才能够使用Cube的数据来完成查询。Group By的列和Where条件里的列,必须是在Dimension中定义的列,而SQL中的度量,应该跟Cube中定义的度量相一致。
 
在一个项目下,如果有多个基于同一模型的Cube,而且它们都满足查询对表、维度和度量的要求;那么,Kylin会挑选一个“最优的”Cube来进行查询;这是一种基于成本(cost)的选择,Cube的成本计算中包括多方面的因素,例如Cube的维度数、度量、数据模型的复杂度等。查询引擎将为每个Cube为完成此SQL估算一个成本值,然后选择成本最小的Cube来完成此查询。
 
Kylin使用Apache Calcite做SQL语法分析
 
 
 
 
 
 

Copyright © 2024 打杂滴
Powered by .NET 9.0 on Kubernetes