kylin建模指南

Apache Kylin的主要特点包括支持SQL接口、支持超大数据集、秒级
响应、可伸缩性、高吞吐率、BI工具集成等。


Apache Kylin的特色在于,在上述的底层技术之外,另辟蹊径地使用
了独特的Cube预计算技术。预计算事先将数据按维度组合进行了聚合,
将结果保存为物化视图。经过聚合,物化视图的规模就只由维度的基数
来决定,而不再随着数据量的增长呈线性增长。


在Hive中准备数据
星形模型
维度表的设计
1)要具有数据一致性,主键值必须是唯一的;Kylin会进行检查,如果
有两行的主键值相同则会报错。
2)维度表越小越好,因为Kylin会将维度表加载到内存中供查询;过
大的表不适合作为维度表,默认的阈值是300MB。
3)改变频率低,Kylin会在每次构建中试图重用维度表的快照,如果
维度表经常改变的话,重用就会失效,这就会导致要经常对维度表创建
快照。
4)维度表最好不要是Hive视图(View),虽然在Kylin1.5.3中加入了对
维度表是视图这种情况的支持,但每次都需要将视图进行物化,从而导
致额外的时间开销。


Hive表分区


了解维度的基数
维度的基数(Cardinality)指的是该维度在数据集中出现的不同值的
个数;基数超过一百万的维度通常被称为超
高基数维度(Ultra High Cardinality,UHC),需要引起设计者的注意。


KYLIN_SALES是事实表,保存了销售订单的明细信息。各列分别保
存着卖家、商品分类、订单金额、商品数量等信息,每一行对应着一笔交
易订单。
·KYLIN_CATEGORY_GROUPINGS是维表,保存了商品分类的详细
介绍,例如商品分类名称等。
·KYLIN_CAL_DT也是维表,保存了时间的扩展信息。如单个日期所
在的年始、月始、周始、年份、月份等。


设计Cube 
导入Hive表定义
创建数据模型 实际就是定义抽取模型
最后一步,是为模型补充分割时间列信息和过滤条件。如果此模型
中的事实表记录是按时间增长的,那么可以指定一个日期/时间列作为
模型的分割时间列,从而可以让Cube按此列做增量构建,


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


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


Hierarchy是一组有层级关系的维度,例如“国家”“省”“市”,这里
的“国家”是高级别的维度,“省”“市”依次是低级别的维度。用户会按高级
别维度进行查询,也会按低级别维度进行查询,但在查询低级别维度时,
往往都会带上高级别维度的条件,而不会孤立地审视低级别维度的数
据。


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


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


Kylin中字典编码允许的
基数上限默认是500万(由参数“kylin.dictionary.max.cardinality”配置


各维度在Rowkeys中的顺序,对于查询的性能会产生较明显的影响。
在这里用户可以根据查询的模式和习惯,通过拖曳的方式调整各个维度
在Rowkeys上的顺序


通常的原则是,将过滤频率较高的
列放置在过滤频率较低的列之前,将基数高的列放置在基数低的列之



Cube的构建方式通常有两种:全量构建和增量构建
Cube的构建包含如下步骤,由任务引擎来调度执行。
1)创建临时的Hive平表(从Hive读取数据)。
2)计算各维度的不同值,并收集各Cuboid的统计数据。
3)创建并保存字典。
4)保存Cuboid统计信息。
5)创建HTable。
6)计算Cube(一轮或若干轮MapReduce)。
7)将Cube的计算结果转成HFile。
8)加载HFile到HBase。
9)更新Cube元数据。
10)垃圾回收。


合并
合并相同的Key,从而减少Cube的存储空间。
·由于Segment减少了,因此可以减少查询时的二次聚合,提高了查询
性能。
·HTable的数量得以减少,更便于集群的管理。


优化
Cuboid剪枝优化
维度的诅咒 不要超过10
检查Cuboid数量


[root@hadoop-namenode1 kylin]# bin/kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader kylin_sales_cube


检查Cube大小
使用衍生维度
使用聚合组
并发粒度优化 =kylin.hbase.region.cut
Rowkeys优化
编码
按维度分片
调整Rowkeys顺序
降低度量精度
及时清理无用的Segment






kafka/bin/kafka-topics.sh --create --topic call_logs --replication-factor 3 --partitions 3 --zookeeper 192.168.2.52:2181,192.168.2.53:2181,192.168.2.54:2181
kafka/bin/kafka-topics.sh --create --topic signaling_logs --replication-factor 3 --partitions 3 --zookeeper 192.168.2.52:2181,192.168.2.53:2181,192.168.2.54:2181
kafka/bin/kafka-console-producer.sh --broker-list 192.168.2.52:9092,192.168.2.53:9092,192.168.2.54:9092 --sync --topic signaling_logs
kafka/bin/kafka-console-consumer.sh --zookeeper 192.168.2.52:2181,192.168.2.53:2181,192.168.2.54:2181 --topic call_logs --from-beginning


curl -X PUT --user ADMIN:KYLIN -H "Content-Type: application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0, "sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}' http://localhost:7070/kylin/api/cubes/kylin_sample_cube_2/init_start_offsets
curl -X PUT --user ADMIN:KYLIN -H "Content-Type: application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0, "sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}' http://192.168.18.62:7070/kylin/api/cubes/StreamingCube32/build2
278

你可能感兴趣的:(大数据开发)