Kylin系列(一)—— 入门

因为平常只会使用kylin而不知其原理,故写下此篇文章。文章不是自己原创,是看过很多资料,查过很多博客,有自己的理解,觉得精华的部分的一个集合。算是自己对Kylin学习完的一个总结和概括吧。文章最后有链接,需要请自取。

前言

企业中的查询大致可分为即席查询和定制查询两种。很多的OLAP引擎包括Hive、Presto、SparkSQL,虽然很大成都上能降低数据分析的难度,但是他们都只适用于即席查询的场景。但是随着数据量和计算复杂度的增长,响应时间是无法保证的,这其实和业务需要是相违背的,数据分析师以及业务部门人员需要的对数据实时的反馈,才能更好对业务产生指导。

Kylin的产生就是为了解决如何对海量数据进行OLAP查询。

Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力,也可以说Kylin就是基于Hadoop平台。

Kylin构建在Hadoop等分布式计算平台之上,充分利用了MapReduce的并行处理能力和可扩展基础设施,高效处理超大数据规模(其实kylin的中的cuboid都是基于MapReduce任务的),可根据数据的规模实现架构的可伸缩。

过程:
- 数据源(Hive、Kafla)
- 计算:构建多维立方体用MapRedue
- 存储:Hbase
- SQL查询解析: kylin SQL解析器

Kylin采用预计算的模式,用户只需提前定义好查询维度,Kylin将会帮助我们进行计算,并将结果存储到HBase中,为海量数据的查询和分析提供亚秒级返回,是空间换时间的解决方案。

其实就是用穷举的办法把所有可能涉及到的维度的组合数都算一遍。利用sql解析,利用Hbase的性能,从算好的结果中提取数据。

提一下,Apache Kylin是第一个由中国人主导的Apache顶级项目。

核心概念

数据仓库

Data Warehouse 简称DW,即数据仓库,是BI中的核心部分。主要是将不同数据源的数据整合到一起,通过多维分析等方式为企业提供决策支持和报表生成。

数据仓库和传统型数据仓库的用途是不同的。传统型数据仓库面向事务,而DW面向分析。传统型数据库更多的是对业务作出实时反应,涉及增删改查,所以需要遵循三大范式,需要ACID。而数据仓库中的数据多为历史数据,主要目的是为企业决策提供支持,所以可能存在大量数据冗余,但利于多个维度查询,为决策者提供更多观察角度。

传统BI中,数据仓库的数据会存储在Mysql、Sql Sever等数据库,而大数据领域常用的是Hive。Hive也是Kylin的默认数据源。

传统数仓和大数据数仓的区别

那么这里顺带提一句传统型数据仓库和大数据数据仓库之间的区别。为什么一定要是使用大数据数据仓库。

这里有几点理由:
1.数据源多样化
原来的数据源可能更多来自于交易数据,但是可能有:行为数据、财务数据等。
2.数据量暴涨
原来的数据源可能较单一,但是数据源多样化后,数据量暴涨,单机的运算无法满足。比如处理行为日志数据的需求,是没办法处理的。使用Hive后,可利用分布式和分区特效加快效率。
3.数据类型
传统数仓只能解决结构化的数据的问题,而无法解决非结构化数据。而大数据数仓可以通过Hbase接受非结构化数据,利用hive外部表来读取数据。
4.服务对象
传统数仓可能更多针对于高管、运营、财务人员,大数据数仓不仅用于上述人群,而且可以为各个系统提供接口数据,例如推荐系统、内部风控系统等等。
5.处理速度快
大数据数仓采用分布式架构,利用分布式计算效率远高于传统数仓,且可按需进行动态扩展,无需担心性能问题。

OLAP和OLTP

OLAP(online analytical process)联机事物处理,是以多维度分析,提供决策支持,多应用于数仓。OLTP(online transcation process),联机事物处理,多用于传统数据库,如mysql\Oracle\sql Sever等,专注于对业务系统的反馈进行对单行数据的增删改查。

维度和度量

维度指的是观察数据的角度,如对于一张订单表来说,维度有订单生成时间、地区、产品类别、产品等等。

维度一般是一个离散的值,比如时间维度上的每一个独立日期,地区上每一个地点,因此统计时可以将相同维度的记录聚合在一起,进行聚合计算。

度量就是被聚合的统计值,也就是运算的结果,如对于一张订单,他的销售量和销售金额是两种度量,是需要统计聚合的值。

维度的基数

指的是该维度在数据集中出现的不同值的个数。

例如一个国家是一个维度,如果有200个不同的值,那么此维度的基数是200。

通常一个维度的基数会从几十到几万个不等,个别维度如“用户ID”的基数会超过百万甚至千万。

基数超过1百万的维度通常被称为超高基数维度。

Cube中所有维度的基数决定了Cube的复杂度,如果有好几个超高基数的维度,那么Cube膨胀的概率就会很高。

事实表和维度表

事实表(factTable)指的是存储有事实记录的表,包含了每个时间的具体要素,以及具体发生的事情如系统记录、销售记录以及库存记录等等。

事实表的体积是远大于其他表的。

维度表(DimensionTable)是对事实表中事件要素的描述信息。

它保存了维度属性值,可以跟事实表关联:相当于把事实表上经常重复出现的属性抽取、规范出来用作一张表。

常见的维度表:日期表(日期对应的周月季度等属性)、地点表(包含国家、省州、城市)。

维度表的好处:
- 缩小了事实表的大小
- 便于维度的管理和维护,对维度表的修改不必对事实表进行大量的改动。
- 维度表可以为多个事实表重用。

提一句,再Kylin种采用的是星型模型,即维度表全部和事实表直接关联。

星型模型

星型模型是数据挖掘种常用的几种多维度数据模型之一。他的特点是只有一张事实表,以及零到多个维度表,事实表和维度表通过主表外键相关联,维度表之间没有关联。

(注意在kylin中,维度表的主键是唯一的,并且事实表中,除了join的关联字段,不允许和维度表中的字段相同,并且维度表和维表之间字段也不能相同。并且事实表和维度表join关联的字段类型必须相同。这在构建cube的时候是经常会遇到错误。)

Kylin中维度表的设计

Kylin对于维度表来说是有一定要求的。

要具有数据一致性,主键值必须是唯一的。即与维度表相关联的列在维度表中一定是唯一的,否则会报错。这在后续的kylin报错解析会有所提及。

维度表越小越好,因为Kylin会将维度表加载到内存中供以查询;默认阈值为300MB.

改变频率低,Kylin在每次构建中试图重用维度表的快照,若经常改变,重用会失效,这就导致会经常性的对维度表创建快找。

维度表不要是hive视图,因为视图其实是一个逻辑结构,并不实际存在,每次使用都需要进行一个物化,从而导致额外时间的开销。

Cube和Cuboid

了解维度和度量,就可以将数据模型上的所有字段进行分类:他们要么是维度,要么是度量,没有第三种字段。根据定义的维度和度量就可以构建cube了。

对于一个给定的数据模型,我们可以对其上所有的维度进行组合,对于N个维度来说,组合的可能性共有2的N次方种。即一个N维的cube,是由1个N维子立方体,N个(N-1)维子立方体、N*(N-1)/2个(N-2)维子立方体… N个1维子立方体和1个0维子立方体构成。其实就是排列组合。

对于每一种维度的组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为cuboid。所有维度组合的cuboid作为一个整体,被称为Cube.

举个例子,假设有维度A、B、C,那么2的2的3次方,即8种。

0维度0D:一种
一维度1D:[A][B][C]
二维度2D:[AB][AC][BC]
三维度3D:[ABC]

SQL表达计算Cuboid[A,B]

select A,B,Sum(amount) from table1
group by A,B

将计算结果保存为物化视图,所有cuboid物化视图的总称就是Cube.

Kylin的技术架构

Apache Kylin系统主要可以分为在线查询和离线构建两部分,具体架构图如下:

首先来看离线构建部分。从图中可以看出,左侧位数据源,目前kylin默认的数据源是Hive,保存着待分析的用户数据。根据元数据的定义,构建引擎从数据源抽取数据,并构建Cube.数据以关系表的形式输入,并且符合星形模型。构建技术主要为MapReduce。构建后的Cube保存在右侧存储引擎中,目前Kylin默认的存储引擎是HBase。

完成离线构建后,用户可以从上方的查询系统发送SQL进行查询分析。Kylin提供了RESTful API、JDBC/ODBC接口供用户调用。无论从哪个接口进入,SQL最终都会来到REST服务层,再转交给查询引擎进行处理。查询引擎解析SQL,生成基于关系表的逻辑执行计划,然后将其转译为基于Cube的物理执行计划,最后查询预计算生成的Cube并产生结果。整个过程不会访问原始数据源。如果用户提交的查询语句未在Kylin中预先定义,Kylin会返回一个错误。

值得一提的是,Kylin对数据源、执行引擎和Cube存储三个核心模块提取出了抽象层,这意味着这三个模块可以被任意地扩展和替换。

Kylin的核心模块

REST Server

REST Server是一套面向应用程序开发的入口点。此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及用户权限等等。另外可以通过Restful借口实现SQL查询。

查询引擎(Query Engine)

当cube准备就绪后,查询引擎能够获取并解析用户查询。他随后会与系统中的其他组件进行交互,从而向用户返回对应的结果。

Routing

负责将解析SQL生成的执行计划转换成cube缓存查询,cube是通过预计算缓存在hbase中。

元数据管理工具

Kylin是一款元数据驱动型应用程序。元数据管理工具十一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其他全部组件的正常运作都需以元数据管理工具为基础。Kylin的元数据存储在Hbase中。

任务引擎(Cube Build Engine)

这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及MapReduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。

Kylin Cube三种构造

我们来谈谈Cube构建。Kylin的Cube构建分为三种:全量构建、增量构建、流式构建。最简单的是全量构建,就是每次构建都Hive表进行全表构建。但是全量构建在实际环境中并不常用,因为大多数业务场景虾,事实数据都在不断地增长中,所以最常用的构建方式其实是增量构建。

这里提出一个全量构建的例子。比如链家的相关数据必须使用全量构建,如成交业绩相关,因为一单成交时间有2个月之久,可能存在中间关于某单的修改,那么业绩也随之修改。故只能采用全量构建,dm表为全量整年的业绩。但是维度控制在较少范围,故压力不大。总体来说,这是通过控制DM表来控制实现的,且在kylin中只保留一个最新的segment。

增量构建可以使Cube每次只构建Hive表中新增部分的数据,而不是全部数据,因此大大降低了构建成本。Kylin将Cube分为多个Segment,每个Segment用起始时间和结束时间来标识。

增量构建与全量构建的不同之处:

1. 创建model时需要指定Partition Date Column,用日期字段来对Cube进行分割。

2. 创建Cube时需要指定Partition Start Date,即Cube默认的第一个Segment的起始时间。
可看文章
Kylin Cube Creation
Kylin Cube Build and Job Monitoring

增量构建的方式解决了业务数据动态增长的问题。但是却不能满足分钟级近实时返回结果的需求,因为增量构建他们使用的时Hive作为数据源,Hive中的数据由ETL定时导入(如每天一次)。数据的时效性对于数据价值的重要性不言而喻。Kylin给出了流式构建方案。

流式构建使用Kafka作为数据源,构建引擎定时从Kafka中拉去数据进行构建。这一个设计与Spark Streaming的微批次思想非常像。需要注意流式构建在1.6版本后存在。

Kylin提供:
- Cube构建可以在Web UI界面和RESTful API
- 数据查询可以在Web UI界面和RESTful API和JDBC/ODBC接口

用户可以根据自身情况选择合适的构建和查询方式。

博客参考

kylin的基本介绍
http://cxy7.com/articles/2018/06/09/1528544157772.html
https://www.jianshu.com/p/abd5e90ab051
http://www.liuhaihua.cn/archives/451581.html

传统数仓和大数据平台的区别

https://blog.csdn.net/Gospelanswer/article/details/78208761
https://support.huaweicloud.com/dws_faq/dws_03_0005.html

Inmon Kimball 数据仓库架构之争
https://blog.csdn.net/paicMis/article/details/53236869
https://blog.csdn.net/yanshu2012/article/details/55254300

OLTP与OLAP的介绍
https://www.cnblogs.com/hhandbibi/p/7118740.html

原文地址:https://www.cnblogs.com/zzjhn/p/11525025.html

时间: 2024-10-09 06:58:04

Kylin系列(一)—— 入门的相关文章

软件测试系列之入门篇

一.你知道软件测试有多重要吗? 在国际上,软件测试(软件质量控制)是一件非常重要的工程工作,测试也作为一个非常独立的职业.在IBM.Microsoft等开发大型系统软件公司,很多重要项目的开发测试人员的比例能够达到1:2甚至1:4. 在国内软件测试的地位还不够高,并且大多只停留在软件单元测试.集成测试和功能测试上.软件测试从业人员的数量同实际需求有不小差距,国内软件企业中开发人员与测试人员数量一般为5:1,因此,国内的软件测试产业化还有待开发和深掘. 说到这里不知道你反应是高兴还是失望?但是我却

Angular系列----AngularJS入门教程04:迭代器过滤(转载)

我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视着你的应用,并且在发生回归的时候迅速报告. 请重置工作目录: git checkout -f step-3 我们的应用现在有了一个搜索框.注意到页面上的手机列表随着用户在搜索框中的输入而变化. 步骤2和步骤3之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 控制器 我们对控制器不做

Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列----AngularJS入门教程00:引导程序(转载)

我们现在开始准备编写AngularJS应用——phonecat.这一步骤(步骤0),您将会熟悉重要的源代码文件,学习启动包含AngularJS种子项目的开发环境,并在浏览器端运行应用. 进入angular-phonecat目录,运行如下命令: git checkout -f step-0 该命令将重置phonecat项目的工作目录,建议您在每一学习步骤运行此命令,将命令中的数字改成您学习步骤对应的数字,该命令将清除您在工作目录内做的任何更改. 运行以下命令: node scripts/web-s

Angular系列----AngularJS入门教程02:静态模板(转载)

为了说明angularJS如何增强了标准HTML,我们先将创建一个静态HTML页面模板,然后把这个静态HTML页面模板转换成能动态显示的AngularJS模板. 在本步骤中,我们往HTML页面中添加两个手机的基本信息,用以下命令将工作目录重置到步骤1. git checkout -f step-1 请编辑app/index.html文件,将下面的代码添加到index.html文件中,然后运行该应用查看效果. app/index.html <ul> <li> <span>

Angular系列------AngularJS入门教程:导言和准备(转载)

学习AngularJS的一个好方法是逐步完成本教程,它将引导您构建一个完整的AngularJS web应用程序. 该web应用是一个Android设备清单的目录列表,您可以筛选列表以便查看您感兴趣的设备,然后查看设备的详细信息. 本教程将向您展示AngularJS怎样使得web应用更智能更灵活,而且不需要各种扩展程序或插件. 通过本教程的学习,您将: 阅读示例学习怎样使用AngularJS的客户端数据绑定和依赖注入功能来建立可立即响应用户操作的动态数据视图. 学习如何使用AngularJS创建数

.NET 4 并行(多核)编程系列之一入门介绍

本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:  1. 并行编程和多线程编程的区别.  2. 并行编程技术的利弊  3. 何时采用并行编程 系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始 .NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之四 Task的休眠 .NET 并行(多核)编程系列之五 Task执行和异常处理

Angular系列----AngularJS入门教程05:双向绑定(转载)

在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f step-4 你应该发现除了搜索框之外,你的应用多了一个下来菜单,它可以允许控制电话排列的顺序. 步骤3和步骤4之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 模板 app/index.html Search: <input ng-model="query"&g

C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ? 标签: c#objectuibyte通讯.net 2010-05-19 08:43 55212人阅读 评论(188) 收藏 举报  分类: 通讯类库设计(4)  版权声明:本文为博主原创文章,未经博主允许不得转载. 第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问