在上一篇文章中介绍了kylin相关的基本知识,这篇文章的主要目的是针对kylin初学者,进行一次详细的kylin案例介绍,这里,我们还是以官方给定的数据为例。说明,我用的是kylin2.1.0. 与kylin1.x 可能有不一样的地方。
事实表和维度表
Cube、Cuboid和Cube Segment
星型模型
维度表的设计原则
除了数据模型只支持星型模型外,kylin对维度表还有一定的要求。
运行$KYLIN_HOME/bin/sample.sh 就会在hive自动创建五张表。当然你可以用vim打开sample.sh看看这个脚本文件到底是怎么样执行的。
我们看到,它调用了sample_cube下的create_sample_tables.sql创建表以及加载数据,所有与官方例子有关的数据都在samp_cube文件夹下
导入后,可以在hive查看具体信息。红线框住的部分,这5张表构成一个星型模型,kylin_sales是事实表,其他的作为维度表。
打开kylin主界面,新建一个项目test_kylin
选择项目test_kylin, 点击Data Source标签,第一个图标load hive table 需手动输入hive表名(带数据库名),中间图标load hive table from tree可直接选择表,最后一个图标为流式数据,暂时不管。
选择对应的5张表。
导入成功后,可以看到以下表信息
不废话,直接新型操作
输入模型名称,注意模型名在整个kylin应用下具有唯一性,而不是只在单个项目下的唯一性。
直接下一步,选择维度表和事实表。事实表是唯一的,这里我们选择kylin_sales. 单击 Add Lookup Table,选择维度表。
依次添加4个维度表。添加维度表的时候,需要选择连接的类型:是Inner还是Left,然后选择连接的主键和外键,这里也支持多主键。
所有维度表添加完成后如下:
接下来选择维度和度量列,度量只能在事实表中选择,维度表在事实表和维度表中选择,一个列只能是维度或度量中的一个。这里只是选择一个范围,不代表这些列将来一定要用作Cube的维度或度量,你可以把所有可能会用到的列都选进来,后续创建Cube的时候,将只能从这些列中进行选择。
最后一步,是为模型补充分割时间列信息和过滤条件。如果此模型中的事实表记录是按时间增长的,那么可以指定一个日期/时间列作为模型的分割时间列,从而可以让Cube按此列做增量构建,如果是想做全局构建,这一步就不用填,我们选择增量构建。
过滤(Filter)条件是指,如果想把一些记录忽略掉,那么这里可以设置一个过滤条件。Kylin在向Hive请求源数据的时候,会带上此过滤条件。比如要过滤掉价格小于0的列,只需要在filter中带上条件 price > 0.
最后,单击save,即可完成对数据模型的创建。
model创建好以后,我们就可以根据它创建cube了。单击new,选择new cube。选择model,输入cube name,同理,cube name也是全局唯一的。这里还可以输入一个邮件通知列表,用于在构建完成或出错时收到通知。如果不想接收处于某些状态的通知,那么可以从“Notification Events”中将其去掉。
接下来,添加维度。这里和kylin1.5版本有一点不一样,在kylin2.1中,直接单击 Add Dimensions ,根据各个表,选择维度以及设置维度表中维度为normal 或者derived(衍生维度)。
添加完成后如下
如果是衍生维度的话,则必须是来自于某个维度表,由于这些列值都可以从该维度表的主键值中衍生出来,所以实际上只有主键列会被Cube加入计算。而在Kylin的具体实现中,往往采用事实表上的外键替代主键进行计算和存储。但是在逻辑上可以认为衍生列来自于维度表的主键。
接下来,添加度量。_COUNT_ 是默认的聚合函数。可以单击“+Measure”按钮来添加新的度量。Kylin支持的度量有:SUM、MIN、MAX、COUNT、COUNT DISTINCT、TOP_N、RAW等。请选择需要的度量
类型,然后再选择适当的参数(通常为列名)
如果param Type选择column的话,下拉列表里面只能是度量信息。Return Type也是根据hive表中字段的类型在自动生成的,当然,这里也有一些kylin自己封装的类型,比如hllc(10)等。
需要注意的是,在kylin2.1版本中已经支持normal维度的聚合。
所有度量聚合添加完成后:
是关于Cube数据刷新的设置。在这里可以设置自动合并的阈值、数据保留的最短时间,以及第一个Segment的起点时间(如果Cube有分割时间列的话)
接下来是进行高级设置,维度的优化基本上通过这个这设置,在此页面上可以设置聚合组和Rowkey。
Kylin默认会把所有维度都放在同一个聚合组中;如果维度数较多(例如>10),那么建议用户根据查询的习惯和模式,单击“New AggregationGroup+”,将维度分为多个聚合组。通过使用多个聚合组,可以大大降低Cube中的Cuboid数量。下面来举例说明,如果一个Cube有(M+N)个维度,那么默认它会有2m+n 个Cuboid;如果把这些维度分为两个不相交的聚合组,那么Cuboid的数量将被减少为2m +2n 。
在单个聚合组中,可以对维度设置高级属性,如Mandatory、Hierarchy、Joint等
Kylin以Key-Value的方式将Cube存储到HBase中。HBase的key,也就是Rowkey,是由各维度的值拼接而成的;为了更高效地存储这些值,Kylin会对它们进行编码和压缩;每个维度均可以选择合适的编(Encoding)方式,默认采用的是字典(Dictionary)编码技术;除了字典以外,还有整数(Int)和固定长度(Fixed Length)的编码。
在kylin1.5(记得清楚了,好像是1.5)之后,引入了spark引擎,所以现在可以选择mapreduce和spark构建引擎,Advance ColumnFamily里面对应hbase里面的信息,CF 相当于hbase的列簇,而measure就是其中的列。
下一步,为Cube配置参数。和其他Hadoop工具一样,Kylin使用了很多配置参数以提高灵活性,用户可以根据具体的环境、场景等配置不同的参数进行调优。Kylin全局的参数值可在conf/kylin.properties文件中进行配置;如果Cube需要覆盖全局设置的话,则需要在此页面中指定。单击“+Property”按钮,然后输入参数名和参数值。我们这里直接保持默认就好。
直接写一步,完成。
cube的模型建立好以后,我们还需要对其进行构建。
设置segment的结束日期
提交成功。等待cube的完成。
搞定,下面就可以进行sql查询操作了。