apache-kylin 总结

apache kylin

Apache Kylin是一个开源的分布式存储引擎,最初由eBay开发贡献至开源社区。它提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持大规模数据,能够处理TB乃至PB级别的分析任务,能够在亚秒级查询巨大的Hive表,并支持高并发。

Apache Kylin的应用场景

  • (1)假如你的数据存在于Hadoop的HDFS分布式文件系统中,并且你使用Hive来基于HDFS构建数据仓库系统,并进行数据分析,但是数据量巨大,比如TB级别。
  • (2)同时你的Hadoop平台也使用HBase来进行数据存储和利用HBase的行键实现数据的快速查询等应用
  • (3)你的Hadoop平台的数据量逐日累增
  • (4)对于数据分析的维度大概10个左右

Apache Kylin怎样解决关键问题

Apache Kylin的初衷就是要解决千亿条、万亿条记录的秒级查询问
题,其中的关键就是要打破查询时间随着数据量成线性增长的这个规
律。仔细思考大数据OLAP,可以注意到两个事实。

  • 大数据查询要的一般是统计结果,是多条记录经过聚合函数计算后
    的统计值。原始的记录则不是必需的,或者访问频率和概率都极低。
  • 聚合是按维度进行的,由于业务范围和分析需求是有限的,有意义
    的维度聚合组合也是相对有限的,一般不会随着数据的膨胀而增长。
    基于以上两点,我们可以得到一个新的思路——“预计算”。应尽量多
    地预先计算聚合结果,在查询时刻应尽量使用预算的结果得出查询结
    果,从而避免直接扫描可能无限增长的原始记录。

预计算原理

预计算事先将数据按维度组合进行了聚合,
将结果保存为物化视图。经过聚合,物化视图的规模就只由维度的基数
来决定,而不再随着数据量的增长呈线性增长。

Apache Kylin的工作原理

Apache Kylin的工作原理本质上是MOLAP(Multidimensional Online
Analytical Processing)Cube,也就是多维立方体分析。

  • 维度(Dimension)
    • 简单来讲,维度就是观察数据的角度。比如电商的销售数据,可以从
      时间的维度来观察,也可以进一步细化,从时间和
      地区的维度来观察。维度一般是一组离散的值,比
      如时间维度上的每一个独立的日期,或者商品维度上的每一件独立的商
      品。因此统计时可以把维度值相同的记录聚合在一起,然后应用聚合函
      数做累加、平均、去重复计数等聚合计算。
  • 度量(Measure)
    • 度量就是被聚合的统计值,也是聚合运算的结果,它一般是连续的
      值。
  • cuboid 和cube
    • 给定一个数据模型,我们可以对其上的所有维度进行组合。对于N个
      维度来说,组合的所有可能性共有2N 种。对于每一种维度的组合,将度
      量做聚合运算,然后将运算的结果保存为一个物化视图,称为Cuboid。所
      有维度组合的Cuboid作为一个整体,被称为Cube。所以简单来说,一个
      Cube就是许多按维度聚合的物化视图的集合。

快速入门

维度和度量

维度和度量是数据分析中的两个基本概念。
  • 维度是指审视数据的角度,它通常是数据记录的一个属性,例如时
    间、地点等。
  • 度量是基于数据所计算出来的考量值;它通常是一个数值,

如总销售额、不同的用户数等。分析人员往往要结合若干个维度来审查
度量值,以便在其中找到变化规律。在一个SQL查询中,Group By的属性
通常就是维度,而所计算的值则是度量。

如下面的示例:

1
select part_dt, lstg_site_id, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_sales group by part_dt, lstg_site_id

在上面的这个查询中,part_dt和lstg_site_id是维度,sum(price)和
count(distinct seller_id)是度量。

事实表和维度表

  • 事实表(Fact Table)是指存储有事实记录的表,如系统日志、销售记
    录等;事实表的记录在不断地动态增长,所以它的体积通常远大于其他
    表。
  • 维度表(Dimension Table)或维表,有时也称查找表(Lookup Table),
    是与事实表相对应的一种表;它保存了维度的属性值,可以跟事实表做关
    联;相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行
    管理。常见的维度表有:日期表(存储与日期对应的周、月、季度等的属
    性)、地点表(包含国家、省/州、城市等属性)等。

维度表的好处

  • 缩小了事实表的大小。
  • 便于维度的管理和维护,增加、删除和修改维度的属性,不必对事
    实表的大量记录进行改动。
  • 维度表可以为多个事实表重用,以减少重复工作。

Cube、Cuboid和Cube Segment

  • Cube(或Data Cube),即数据立方体,是一种常用于数据分析与索引
    的技术;它可以对原始数据建立多维度索引。通过Cube对数据进行分析,
    可以大大加快数据的查询效率。
  • Cuboid在Kylin中特指在某一种维度组合下所计算的数据。
  • Cube Segment是指针对源数据中的某一个片段,计算出来的Cube数
    据。通常数据仓库中的数据数量会随着时间的增长而增长,而Cube
    Segment也是按时间顺序来构建的。

星形模型

数据挖掘有几种常见的多维数据模型,如星形模型(Star Schema)、雪
花模型(Snowf?lake Schema)、事实星座模型(Fact Constellation)等。

星形模型中有一张事实表,以及零个或多个维度表;事实表与维度表
通过主键外键相关联,维度表之间没有关联,就像很多星星围绕在一个
恒星周围,故取名为星形模型。

如果将星形模型中某些维度的表再做规范,抽取成更细的维度表,
然后让维度表之间也进行关联,那么这种模型称为雪花模型。

星座模型是更复杂的模型,其中包含了多个事实表,而维度表是公
用的,可以共享。

不过,Kylin只支持星形模型的数据集,这是基于以下考虑。

  • 星形模型是最简单,也是最常用的模型。
  • 由于星形模型只有一张大表,因此它相比于其他模型更适合于大数
    据处理。
  • 其他模型可以通过一定的转换,变为星形模型。

维度表的设计

  • 要具有数据一致性,主键值必须是唯一的;Kylin会进行检查,如果
    有两行的主键值相同则会报错。
  • 维度表越小越好,因为Kylin会将维度表加载到内存中供查询;过
    大的表不适合作为维度表,默认的阈值是300MB。
  • 改变频率低,Kylin会在每次构建中试图重用维度表的快照,如果
    维度表经常改变的话,重用就会失效,这就会导致要经常对维度表创建
    快照。
  • 维度表最好不要是Hive视图(View),虽然在Kylin1.5.3中加入了对
    维度表是视图这种情况的支持,但每次都需要将视图进行物化,从而导
    致额外的时间开销。

Hive表分区

  • Hive表支持多分区(Partition)。简单地说,一个分区就是一个文件目
    录,存储了特定的数据文件。当有新的数据生成的时候,可以将数据加载
    到指定的分区,读取数据的时候也可以指定分区。对于SQL查询,如果查
    询中指定了分区列的属性条件,则Hive会智能地选择特定分区(也就是目
    录),从而避免全量数据的扫描,减少读写操作对集群的压力。

  • Kylin支持增量的Cube构建,通常是按时间属性来增量地从Hive表中
    抽取数据。如果Hive表正好是按此时间属性做分区的话,那么就可以利
    用到Hive分区的好处,每次在Hive构建的时候都可以直接跳过不相干日
    期的数据,节省Cube构建的时间。这样的列在Kylin里也称为分割时间列
    (Partition Time Column),通常它应该也是Hive表的分区列。

维度的基数

  • 维度的基数(Cardinality)指的是该维度在数据集中出现的不同值的
    个数;
    • 例如“国家”是一个维度,如果有200个不同的值,那么此维度的基数
      就是200。
  • 基数超过一百万的维度通常被称为超
    高基数维度(Ultra High Cardinality,UHC),需要引起设计者的注意。
坚持原创技术分享,您的支持将鼓励我继续创作!