Apache Kylin 概览

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": "",
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_world!

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值