设计CUBE
Posted playforever
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计CUBE相关的知识,希望对你有一定的参考价值。
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
重新分布中间表
以上是关于设计CUBE的主要内容,如果未能解决你的问题,请参考以下文章
Cg入门19:Fragment shader - 片段级模型动态变色