Kylin设计Cube
1.导入Hive表定义
Kylin会在后台触发一个MapReduce任务,计算此表每列的基数。
注:Kylin对基数的计算方法采用的是HyperLogLog的近似算法,与精确值略有误差,参考足矣。
2.创建数据模型
输入模型名称
选择事实表(查询的数据表),然后添加维度表
添加维度列
添加度量列
为模型补充分割时间列信息(如果此模型中的事实表记录是按时间增长的,那么可以指定一个日期/时间作为模型的分割时间列,从而可以让Cube按此列做增量构建参见第三章)和过滤条件
3.创建Cube
创建Cube维度,WEEK_BEG_DT,实际是由PART_DT来决定,WEEK_BEG_DT为衍生维度。
根据聚合需求,为Cube定义度量的聚合形式
Cube自动合并阈值,默认7天进行一次合并,28天进行一次合并,保留时间阈值为0,即不对Cube做自动清理;根据分段时间列,选择分段起始时间。
高级设置优化Cube存储大小和查询速度,设置聚合组和Rowkey;
Kylin默认所有维度都放在同一个聚合组中,如果维度数较多(>10),建议用户根据查询的习惯和模式,单机"New Aggregation Group+",将维度分为多个聚合组(Cuboid从2m+n变为2m+2n)。
Mandatory维度,总是会出现在Where条件或Group By语句里的维度,Kylin就可以不用预计算那些不包含此维度的Cuboid,从而减少计算量。
Hierarchy是一组有层级关系的维度,例如“国家”“省”“市”,“国家”高级别维度,“省”“市”依次是低级别的维度。用户会按照高级别维度进行查询,也会按低级别维度进行查询,但在查询低级别维度是,往往都会带上高级别维度的条件,而不会孤立地审视低级别维度的数据。
Joint将多个维度组合成一个维度:总是会在一起查询的维度;基数很低的维度
参与Cuboid生成的维度都会作为Rowkeys,经常出现在过滤条件中的列放在Rowkeys前
Kylin以Key-Value的方式将Cube存储到HBase中。HBase的key,也就是Rowkey,是由各维度的值拼接而成的;为了更高效地存储这些值,Kylin会对它们进行编码和压缩;每个维度均可以选择合适的编码(Encoding)方式,默认采用的是字典(Dictionary)编码技术,整数(int)和固定长度(Fixed Length)的编码
字典编码:将此维度下的所有值构建成一个从string到int的映射表;Kylin会将字典序列化保存,在Cube中存储int值,减少存储大小。字典是保持顺序的,使得在HBase中进行比较查询时,依然使用编码后的值,而无需解码。
注:将过滤频率较高的列放置在过滤频率较低的列之前,将基数高的列放置在基数低的列之前,利用过滤条件来缩小在HBase中扫描的范围。
Kylin全局参数在conf/kylin.properties中配置;Cube在Property中设置,如:kylin.hbase.region.cut=1,Kylin将会为每个HTable Region分配1GB来创建一个HTable Region
测试SQL
select sum(price) from KYLIN_SALES ks where ks.part_dt between '2013-12-01' and '2013-12-31' and ks.ops_region='Shanghai'