Kylin 基础介绍

Kylin术语

  • 维度(Dimension)
    一组属性,提供结构化的标签信息,一般作为报表的坐标轴。

  • 度量(Measure)
    一类可以进行聚合分析的特殊维度,聚合后的结果称为指标。

  • 事实表(Fact Table)
    数据仓库中的中央表,用于描述业务内特定事件的数据。

  • 维度表(Lookup Table)
    维度属性的集合,人们观察数据的特定角度。

  • 基度(Cardinality)
    指数据表中某一列数据去重后的元素个数。

  • 星型模型(Star Schema)
    一种多维的数据关系,由一张事实表和一组维度表组成。

  • cube
    一个cube就是一个Hive表的数据按照指定维度与指标计算出的所有组合结果。

  • cuboid
    某一维度组合下,度量聚合后的结果集合。有个特殊的cuboid叫 base cuboid,比如维度有ABCD,(A,B,C,D)称为Base cuboid

  • 数据立方体(cube)
    一组用于分析数据的相关度量值和维度,是所有cuboid的集合,作为存储和分析的基本单位

  • segment
    Cube Segment 是指针对源数据中的某一个片段,计算出来的 Cube 数据。
    通常数据仓库中的数据数量会随着时间的增长而增长,而 Cube Segment 也是按时间顺序来构建的。

  • 衍生维度
    维度表上的某一列通过PK可推的,换句话是可查询到的 比如由身份证可以推导性别,所以能通过PK推导的维度都可以设置为衍生维度。
    衍生维度是放在snapshot中

Kylin核心技术:Cube与计算

比如我们有10多亿中国人口数据,要统计男女比例这么个需求。如果直接从硬盘里提取数据来统计肯定会很慢,磁盘速度大概是几百兆/秒。
即使把数据放到内存中也最多提升100倍的速度。

所以,可以用与计算来统计男女比例

维度表和事实表

我学到了一个数据仓库的概念,维度表(Fact Table)和事实表(Lookup Table)。
通过下面例子就让我明白了:
学过数据库的童鞋应该都知道星型模型,星型模型在数据仓库的设计中可以为是一种典型的维度模型。
我们在进行维度建模的时候会建一张事实表,这个事实表就是星型模型的中心,然后会有一堆维度表,这些维度表就是向外发散的星星。
那么什么是事实表、什么又是维度表吗,下面会专门来解释。

中间的chat表就是事实表。其它周边的表就是维度表。

维度设计

只有普通维度会影响Cuboid的数量和存储膨胀率,衍生维度并不参与Cuboid计算,而是有衍生维度对应的外键FK参与计算Cuboid。
在查询时,对衍生维度的查询会首先转换为对外键所在维度的查询,因此会牺牲少量查询性能。

Kylin暂时不支持星座模型

默认情况下,系统将会为所有的维度表创建快照。
设计新的模型,将大维度表改为事实表

设计规则如下:
经常出现在规律条件中的维度应当设为普通维度,以达到更好的查询性能。

Derived 衍生类型的前提是要放到快照表里的

  • For normal dimensions, Kyligence has max number restriction of 62
  • If a dimension table is used in cube design, its corresponding fact table foreign key will be added as normal dimension even it’s not used.

维度优化

Mandatory Dimension: 一定group by的字段
Hierarchy Dimension: 国家、省、市
Joint Dimension: 要么一起出现,要么不出现,比如:A、B、C绑在了一起 (很少有这样的场景)

Rowkey

UHC不要用Dict作为encoding;
常用的字段比如日期字段要放在Rowkey的前面
高基维放置在低基维前面
过滤的维度放置在非过滤前面

max length of FixedLength(N) for UHC of varchar/char type will be 256

Cube Build

Supported Cube Build Types:

1
2
3
4
5
Full Build
By Date/time
Streaming(by offset)
By File(Beta)
Customize(Beta)

尽量使用增量加载
计划合并你的增量segment
用增量加载的时候要考虑下SCD

星型模型和雪花模型

fact table 外围一圈 dimension table 就是星型模型
dimension table 外再围一圈 dimension table就是雪花模型

System Configuration

Important configurations:
Job retry
Pushdown:对于没有cube能查得结果的sql,Kylin支持将这类查询通过JDBC下压至备用查询引擎如Hive, SparkSQL, Impala等来查得结果
Query cache(process level/shared)
Compression

Configuration override
System
Project
Cube

Authorization Management

project: Query, Operation , Managment, Admin
table: Table query, Row query, Column query

Caution: column ACL is a blacklist.

Resource Isolation

KE can submit cube build jobs to specified Yarn queues per: system level;project level;cube level

应用发布流程

DEV -> QA ->(sign off) PROD

Daily Operation

  1. Garbage cleanup
    e.g.: segment merged, cube purged

  2. System upgrade
    Minor version upgrade
    Major version upgrade

  3. System backup/restore
    System level
    Project level

Rest API

Authorization 这个Header的内容是 “ADMIN:yourpassword”的base64 encode

Hadoop生态和和MPP数据库的区别

Hadoop跟MPP的存储模型不一样。
Hadoop生态的存储用HDFS,HDFS的扩展是通过元数据来做的,它有中心节点用来存元数据,在加入新的节点的时候,
只需要修改元数据就可以,所以HDFS可扩展能力是收到管理元数据那台机器的性能限制的。一般来说可以到10K这个
规模,再向上就不行了。

而MPP要自己做切分,自己做切分就带来动态调整的问题。MPP通常采用的是没有中心节点的存储模式,比如hash,
每增加节点的时候,都需要rehash,这样当规模到了几百台的时候,扩展能力就下来了。

Hive在内存管理上方式不大一样。
MPP内存管理比较精细,他主要的想法是在每个机器上放个数据库,传统数据库的内存管理比较复杂,主要是内外存
交互的东西,这样的架构决定了MPP在小数据量的时候,latency可以做的比较小,但是数据量大的时候,
throughput做不上去了。
而Hive的内存管理非常粗放,它后来就是MapReduce的job,MR的job是没有太多精细的内存管理,就是拼命地
scan,完了就是spill,这样的架构导致throughput很大,但是latency很高。

failover机制,
Hive的failover就是MR的failover,job挂掉了重新换机器跑就完了。

MPP它的计算是要attach到数据节点上去的,如果你规模上去,那么fail的可能性就上去了,这样如果你每次计算
都有台机器挂了,一挂,别人就要等你,而不是换台机器继续跑。可以用木桶效应类比。

Cube设计

Rowkey的具体格式是cuboid id + 具体的维度值(最新的Rowkey中为了并发查询还加入了ShardKey)

前面4个框着的作为Rowkey,比如,2015-10-1的维度序号为1,BJ的序号为0,item-A序号为0,则最终Rowkey为 111+100

Rowkey的设计原则:

  1. 结合业务场景特点,按照查询频次来放置字段顺序
  2. 通过设计的Rowkey尽可能的将数据打散到整个集群中,负载均衡
  3. 设计的Rowkey尽量简短

有3个方面要考虑:

  • Encoding
    我们的编码方式能够大大减少每行Cube数据的体积。
    而Cube中可能存在数以亿计的行数,使用编码节约的空间累加起来将是一个非常巨大的数字。

  • 排序
    高概率用于过滤的列
    基数高的列(用它进行过滤时,返回的结果集小)
    排序评分=过滤概率*过滤强度
    经常使用到的维度提前—在需要进行后聚合的场景中效率会更高。

  • 分片
    按维度分片(Shard by Dimension)提供了一种更加高效的分片策略,那就是按照某个特定维度进行分片。
    简单地说,如果Cuboid中某两个行的Shard by Dimension的值相同,
    那么无论这个Cuboid最终会被划分成多少个分片,这两行数据必然会被分配到同一个分片中。

Shard by维度要求
仅支持单一维度
基数足够高(几十万)
分布均匀
经常进行group by和filter

更多的优化原理要参考Rowkey的设计

Reference

https://blog.bcmeng.com/post/kylin-cube.html#cuboid-%E7%9A%84%E7%BB%B4%E5%BA%A6%E5%92%8C%E6%8C%87%E6%A0%87%E5%A6%82%E4%BD%95%E8%BD%AC%E6%8D%A2%E4%B8%BAhbase%E7%9A%84kv%E7%BB%93%E6%9E%84