https://www.jianshu.com/p/4f4417ef790a
扩展阅读:
一、什么是 Kylin
Apche Kylin 是 Hadoop 大数据平台上的一个开源 OLAP 引擎。它采用多维立方体(Cube)预计算技术,可以将某些场景下的大数据 SQL 查询速度提升到亚秒级别。相对于之前的分钟乃至小时级别的查询速度。
Apache Kylin 也是中国人主导的,第一个 Apche 顶级开源项目,在开源社区有较大影响力。
Kylin 对于解决的问题有以下假设:
- 大数据查询要的一般是统计结果,是多条记录经过聚合函数计算后的统计值
- 原始的记录则不是必需的,或者访问频率和概率都极低
- 聚合是按维度进行的,有意义的维度聚合组合也是相对有限的,一般不会随着数据的膨胀而膨胀
基于以上两点,可以得到一个新的思路—预计算,应尽量多地预先计算聚合结果,在查询时应该尽量利用预计算的结果得出查询结果,从而避免直接扫描可能无限增大的原始记录
二、定义 Cube
2.1、什么是 Cube
Cube 即多维立方体,也叫数据立方体。如下图所示,这是由三个维度(维度数可以超过3个,下图仅为了方便画图表达)构成的一个OLAP立方体,立方体中包含了满足条件的cell(子立方块)值,这些cell里面包含了要分析的数据,称之为度量值。
- 立方体:由维度构建出来的多维空间,包含了所有要分析的基础数据,所有的聚合数据操作都在立方体上进行
- 维度:观察数据的角度。一般是一组离散的值,比如:
- 时间维度上的每一个独立的日期
- 商品维度上的每一件独立的商品
- 度量:即聚合计算的结果,一般是连续的值,比如:
- 销售额,销售均价
- 销售商品的总件数
- 事实表:是指存储有事实记录(明细数据)的表,如系统日志、销售记录等;事实表的记录在不断地动态增长,数据量大
- 维度表(维表):保存了维度值,可以跟事实表做关联。常见的维度表如:
- 日期表
- 地点表
- 分类表
- Cuboid:对于每一种维度的组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为 Cuboid
2.2、创建数据模型
2.2.1、数据模型
常见的多维数据模型,如星型模型、雪花模型等。<br />星型模型:有一张事实表、以及零个或多个维度表;事实表与维度表通过 主键/外键 相关联,维度表之间没有关联,就像很多星星围绕在一个恒星周围,顾命名为星型模型。
雪花模型:如果将星型模型中某些维度的表再做规范,抽取成更细的维度表,然后让维度表之间也进行关联,那么这种模型成为雪花模型(雪花模型可以通过一定的转换,变为星型模型)
2.2.2、创建模型
- Model 是 Cube 的基础,用于描述一个数据模型
- 有了数据模型,定义 Cube 可以直接从此模型定义的表和列中进行选择
- 基于一个数据模型可以创建多个 Cube
数据模型可用一个 json 表示,如下是一个例子:
{
"name": "test_model", // 名为 test_model 的数据模型
"fact_table": "DEFAULT.KYLIN_SALES", // 事实表为 DEFAULT.KYLIN_SALES
"lookups": [ // 维表(又叫查找表,即lookup表)为 DEFAULT.KYLIN_CAL_DT;维表可以是 0~n 个
{
"table": "DEFAULT.KYLIN_CAL_DT",
"kind": "LOOKUP",
"alias": "KYLIN_CAL_DT",
"join": {
"type": "inner", // KYLIN_SALES 与 KYLIN_CAL_DT 连接方式为 inner join
// join condition 为 KYLIN_CAL_DT.CAL_DT = KYLIN_SALES.PART_DT
"primary_key": [
"KYLIN_CAL_DT.CAL_DT"
],
"foreign_key": [
"KYLIN_SALES.PART_DT"
]
}
}
],
"dimensions": [ // 定义维度,维度可以来自于事实表和维表;后续基于该模型的 Cube 的维度只能从这里定义的 dimensions 中选
{
"table": "KYLIN_SALES",
"columns": [
"PART_DT",
"LEAF_CATEG_ID",
"LSTG_SITE_ID",
"SLR_SEGMENT_CD",
"OPS_USER_ID"
]
},
{
"table": "KYLIN_CAL_DT",
"columns": [
"AGE_FOR_YEAR_ID",
"AGE_FOR_QTR_ID",
"AGE_FOR_MONTH_ID",
"AGE_FOR_WEEK_ID",
"CAL_DT"
]
}
],
"metrics": [ // 定义度量,度量智能来自事实表;后续基于该模型的 Cube 的度量只能从这里定义的 metrics 中选
"KYLIN_SALES.PRICE",
"KYLIN_SALES.ITEM_COUNT",
"KYLIN_SALES.SELLER_ID"
],
"filter_condition": "price > 0", // 定义向数据源查询数据时会带上的过滤条件
"partition_desc": { // 指定 KYLIN_SALES.PART_DT 列作为模型的分割时间列,以支持基于该模型的 Cube 按此列做增量构建
"partition_date_column": "KYLIN_SALES.PART_DT",
"partition_time_column": null,
"partition_date_start": 0,
"partition_date_format": "yyyy-MM-dd",
"partition_time_format": "HH:mm:ss",
"partition_type": "APPEND",
"partition_condition_builder": "org.apache.kylin.metadata.model.PartitionDesc$DefaultPartitionConditionBuilder"
},
}
2.3、创建 Cube
高级设置的一些说明:
- Aggregation Groups:Kylin 默认会把所有维度放在一个聚合组中;如果维度数较多(例如>10),那么建议用户根据查询的习惯和模式,将维度分为多个聚合组。通过使用多个聚合组,可以大大降低 Cube 中 Cuboid 数量。如,一个 Cube 有(M+N)个维度,那么会有
2的(M+N)次方
个 Cuboid;如果把这些维度分为两个不相交的聚合组,那么 Cuboid 的数量将减少为2的M次方+2的N次方
。在单个聚合组中,可以对维度设置高级属性:- Mandatory Dimensions:必要维度。所有不含此维度的 cuboid 就可以被跳过计算
- Hierarchy Dimensions:层级维度,例如 “国家” -> “省” -> “市” 是一个层级;不符合此层级关系的 cuboid 可以被跳过计算
- Joint Dimensions:联合维度,有些维度往往一起出现,或者它们的基数非常接近(有1:1映射关系)。例如 “user_id” 和 “email”。把多个维度定义为组合关系后,所有不符合此关系的 cuboids 会被跳过计算
- Rowkeys:HBase rowkey上的维度的位置对性能至关重要,可以拖拽维度列去调整其在 rowkey 中位置,位于rowkey前面的列,将可以用来大幅缩小查询的范围。通常建议:
- 将必要维度放在开头
- 然后是在过滤 ( where 条件)中起到很大作用的维度
- 如果多个列都会被用于过滤,将高基数的维度(如 user_id)放在低基数的维度(如 age)的前面,这也是基于过滤作用的考虑
- Cube Engine:Spark 或 Hive
2.3.1、一个 Cube 例子
Cube 可用一个 json 表示,如下是一个例子:
{
"name": "test_cube",
"model_name": "test_model", // 使用名为 model_test 的数据模型
"description": "",