avatar

目录
Kylin-分布式分析引擎

ref

[toc]

概述

Kylin定义

Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。

空间换时间:数据都提前计算好了

Kylin相关术语

  • Data Warehouse(数据仓库)

    数据仓库是一个各种数据(包括历史数据和当前数据)的中心存储系统,是BI( business intelligence ,商业智能)的核心部件。

    这里所谈的数据包括来自企业业务系统的订单、库存、交易账目、客户和供应商等来自企业所处行业和竞争对手的数据以及来自企业所处的其他外部环境中的各种数据。

  • Business Intelligence(商业智能)

    商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。

    为了将数据转化为知识,需要利用数据仓库、联机分析处理(OLAP)工具和数据挖掘等技术。

  • OLAP(online analytical processing)

    OLAP(online analytical processing)是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。从各方面观察信息,也就是从不同的维度分析数据,因此OLAP也成为多维分析。

    屏幕快照 2019-11-11 下午3.33.23

OLAP 类型

屏幕快照 2019-11-11 下午3.35.06
  • OLAP Cube

    MOLAP基于多维数据集,一个多维数据集称为一个OLAP Cube

    屏幕快照 2019-11-11 下午3.36.20
  • Cube & Cuboid

    按照不同角度分析

    屏幕快照 2019-11-11 下午3.39.45
  • Star Schema(星型模型)

    屏幕快照 2019-11-11 下午3.45.03
    • Fact Table(事实表) & Dimension Table(维度表)

      屏幕快照 2019-11-11 下午3.45.53
  • Dimension(维度) & Measure(度量)

    屏幕快照 2019-11-11 下午3.46.36

维度:分析数据的数据的角度

度量:被分析的指标

Kylin架构

将hive作为数据仓库,所有维度分析好后,存在Hbase里(数据存储),Kylin再提供SQL接口来查Hbase,底层自己做SQL转Hase查询,以屏蔽底层技术。这样开发人员只需掌握SQL。

屏幕快照 2019-11-11 下午3.59.48

1)REST Server

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

2)查询引擎(Query Engine)

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

3)路由器(Routing)

在最初设计时曾考虑过将Kylin不能执行的查询引导去Hive中继续执行,但在实践后发现Hive与Kylin的速度差异过大,导致用户无法对查询的速度有一致的期望,很可能大多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分钟,因此体验非常糟糕。最后这个路由功能在发行版中默认关闭。

4)元数据管理工具(Metadata)

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

5)任务引擎(Cube Build Engine)

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

Kylin特点

Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。

1)标准SQL接口:Kylin是以标准的SQL作为对外服务的接口。

2)支持超大数据集:Kylin对于大数据的支撑能力可能是目前所有技术中最为领先的。早在2015年eBay的生产环境中就能支持百亿记录的秒级查询,之后在移动的应用场景中又有了千亿记录秒级查询的案例。

3)亚秒级响应:Kylin拥有优异的查询相应速度,这点得益于预计算,很多复杂的计算,比如连接、聚合,在离线的预计算过程中就已经完成,这大大降低了查询时刻所需的计算量,提高了响应速度。

4)可伸缩性和高吞吐率:单节点Kylin可实现每秒70个查询,还可以搭建Kylin的集群。

5)BI工具集成

Kylin可以与现有的BI工具集成,具体包括如下内容。

ODBC:与Tableau、Excel、PowerBI等工具集成

JDBC:与Saiku、BIRT等Java工具集成

RestAPI:与JavaScript、Web网页集成

Kylin开发团队还贡献了Zepplin的插件,也可以使用Zepplin来访问Kylin服务。

Kylin环境搭建

解压apache-kylin-2.5.1-bin-cdh57.tar.gz

Code
1
$ tar -zxvf apache-kylin-2.5.1-bin-cdh57.tar.gz -C apps/

需要在/etc/profile文件中配置HADOOP_HOME,HIVE_HOME,HBASE_HOME并source使其生效。

shell
1
# 启动Kylin之前要保证HDFS,YARN,JobHistoryServer ,ZK,HBASE相关进程是正常运行的。

从2.6.1开始,不内置spark了

启动

shell
1
2
3
4
bin/kylin.sh start

# http://mxxcentos7:7070/kylin
# 用户名为:ADMIN,密码为:KYLIN

快速入门

数据准备

在Hive中创建数据,分别创建部门和员工外部表,并向表中导入数据。

原始数据

dept.txt

Code
1
2
3
4
10	ACCOUNTING	1700
20 RESEARCH 1800
30 SALES 1900
40 OPERATIONS 1700

emp.txt

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
7369	SMITH	CLERK	7902	1980-12-17	800.0	NULL	20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.0 1400.0 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.0 NULL 30
7782 CLARK MANAGER 7839 1981-6-9 2450.0 NULL 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.0 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.0 0.0 30
7876 ADAMS CLERK 7788 1987-5-23 1100.0 NULL 20
7900 JAMES CLERK 7698 1981-12-3 950.0 NULL 30
7902 FORD ANALYST 7566 1981-12-3 3000.0 NULL 20
7934 MILLER CLERK 7782 1982-1-23 1300.0 NULL 10

建表语句

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建部门表
create external table if not exists default.dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';

# 创建员工表
create external table if not exists default.emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';

向外部表中导入数据

shell
1
2
3
4
5
6
7
8
9
10
# 查看创建的表
show tables;

# 导入数据
load data local inpath '/media/psf/centos_share/dept.txt' into table default.dept;
load data local inpath '/media/psf/centos_share/emp.txt' into table default.emp;

# 查看结果
select * from emp;
select * from dept;

创建项目

1、登录系统

2、创建工程

3、选择数据源

都是界面操作:略

创建Model

1、回到Models页面

2、点击New按钮后点击New Model

3、填写Model名称及描述后Next

4、选择事实表

5、添加维度表

6、选择添加的维度及join字段

7、选择维度信息

8、选择度量信息

9、添加分区信息及过滤条件之后“Save”

10、创建Model完成

创建Cube

1、点击New按钮然后选择New Cube

2、选择Model及填写Cube Name

3、添加维度

4、添加需要做预计算的内容

6、动态更新相关(默认)

7、高阶模块(默认)

8、需要修改的配置

9、Cube信息展示

10、Cube配置完成

11、触发预计算

12、查看Build进度

13、构建Cube完成

Hive和Kylin性能对比

Code
1
2
3
4
5
6
7
8
9
10
11
12
点击insite,写个SQL查一下

select dept.dname, sum(emp.sal) from emp join dept on emp.deptno = dept.deptno group by dept.dname;

在虚拟机2核4G的配置里跑了6s出结果
第二次查有缓存,0.01s

和hive性能对比怎么样呢?

hive> select dept.dname, sum(emp.sal) from emp join dept on emp.deptno = dept.deptno group by dept.dname;

Time taken: 49.835 seconds, Fetched: 3 row(s)

49s vs 6s 区别还是大的,kylin做了预计算然后存储,就是以空间换时间,而且查过的还能缓存,下次查就是0.0几秒出结果。

Cube构建原理

Cube构建流程

第一步:创建中建表

image-20191114131237790

第二步:将中建表的数据均匀分配到不同的文件

image-20191114131610229

reduce产生文件大小分区不均匀,分配均匀,减轻后面的数据倾斜

1、统计总行数
2、规定每个mapper的行数1000000(这个数据小于HDFS文件块大小,不会被分片,效果就是一个文件一个分片)
3、计算出一共要生成160个文件(DISTRIBUITE BY RAND() : 将指定的字段放在一个reducer里)
4、下一次mapper的个数就是160了

中建表的文件已经均匀分配了

第三步:创建维度字典表

image-20191114131610229

存到Hbase里
用数字代替字段,中间要加字典表来映射,这样Hbase可以少存点数据

然后就开始跑MR:

  • 把字典表缓存到内存里,根据kv映射替换值

第四步:构建Cube

image-20191114131610229

相当于执行select语句,翻译成MR,每个维度都要

第五步:Hbase K-V

image-20191114133840833

111 代表3个维度都有 000 代表三个维度的字典值

第六步:将cube data 转成Hfile格式并导入HBase

image-20191114134242710

Cube构建算法

逐层构建算法(layer)

pic2.png

每个层级的计算(除了第一层,它是从原始数据聚合而来),是基于它上一层级的结果来计算的。

  • 为啥从高纬度开始构建?
    因为低纬度可以从低纬度开出来

  • 需要多少MR?
    一层一个。把子cuboid送到reduce端,第一个mr结束了,hdfs上存的就是2个维度的cuboid,继续给mr2跑,得到的就是一个维度的cuboid了

    每一轮的计算都是一个MapReduce任务,且串行执行;一个N维的Cube,至少需要N次MapReduce Job。

image-20191114142703441

缺点:

  • MR多
  • Shuffer工作量大
  • 对HDFS的读写操作较多

快速构建算法(inmem)

image-20191114142944437

只跑一个MR

  • map端分split数据(160),map端把所有层都算出来,然后所有数据发到reduce去聚合。
    所以在一个map做计算,相当于把一个128M全部加载到内存。比上个算法块30%

  • 直接在内存里聚合(在map端聚合),然后把全部的维度输出到reducer聚合

image-20191114143429137

特点:在map做预聚合

如何选择?

  • 集群资源可以的话,可以选第二个算法。
  • 如果不了解集群资源,可以选auto选项,交给kylin自动判断和选择

在页面Monitor可以看到具体算法

Cube构建优化

如果有20个维度,就有2的20次方个cuboid,对存储引擎压力太大了。所以要想办法减少维度。
比如年月日三个维度。年和日的组合是没有意义的,所以可以删掉

剪枝优化(即减少Cuboid的生成)。

使用衍生维度(derived dimension)

将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们。Kylin会在底层记录维度表主键与维度表其他维度之间的映射关系,以便在查询时能够动态地将维度表的主键“翻译”成这些非主键维度,并进行实时聚合。

image-20191114144739184

解释:

nomal方式构建的话,需要7种

选用derive,将维度表上的非主键维度排除掉(就是排除E), 并使用维度表的主键(其实是事实表上相应的外键)来替代它们(就是使用A替代E,因为A和E之间有映射关系,F(A)=E。从A–>D—>E),这样构建的cuboid就很少

具体是怎么实施的?

image-20191114145303458
  • 用A去构建

  • 查询时用E替换

  • 查询Hbase结果是要做聚合计算的(又变慢了,就是拿一定的时间换空间了)

虽然衍生维度具有非常大的吸引力,但这也并不是说所有维度表上的维度都得变成衍生维度,如果从维度表主键到某个维度表维度所需要的聚合工作量非常大,则不建议使用衍生维度。

例如,年构建derived,那365天要聚合,工作量巨大,每次查询都要重新做聚合计算

所以,对某些聚合工作量大的维度,可以选择不使用衍生维度吗?怎么做?

页面配置:每个维度都能单独选的

实验:页面使用derive方式构建cube,看下空间和时间的变化。

使用聚合组(Aggregation group)

例子:年和日没必要组合。

对于每个分组内部的维度,用户可以使用如下三种可选的方式定义,它们之间的关系,具体如下。

1、 强制维度(Mandatory)

如果一个维度被定义为强制维度,那么这个分组产生的所有Cuboid中每一个Cuboid都会包含该维度。
只构建包含强制维度的cuboid,其他就不构建了。

原理

image-20191114151319747

2、 层级维度(Hierarchy)

例如:省市区、年月日

image-20191114151833477

B必须依赖于A出现

3、联合维度(Joint)

AB必须同时出现

image-20191114151945549

页面配置:

Cube Designer的Advanced Setting中

可设置上面讲的3种维度

Row Key优化

Hbase的Row Key优化

Kylin会把所有的维度按照顺序组合成一个完整的Rowkey,并且按照这个Rowkey升序排列Cuboid中所有的行。

设计良好的Rowkey将更有效地完成数据的查询过滤和定位,减少IO次数,提高查询速度,维度在rowkey中的次序,对查询性能有显著的影响。

1、被用作where过滤的维度放在Row Key前边

image-20191114153453761

这个表已经存在hbase了现在要查这个select,scan的时候会去3个地方。优化后,只需要查一个地方

怎么放?页面设置

2、基数大的维度放在基数小的维度前边

基数:月的基数是12,日是31,星期是7,也就是distinct那个字典值。

image-20191114154152314

AB这个维度从哪来?
内部机制,选cuboid id小的

基数小,聚合工作量也小,所以要把基数大的放前面。

页面配置:

Cube Designer的Advanced Setting中

可设置RowKey顺序

并发粒度优化

从Hbase查时,读取并发度

一个表有多个region分区,目的是方便扩展,还有并发读取。

没有预分区,最开始是一个region的,然后到达数量后自动拆分。

1、kylin.hbase.region.cut

kylin的 “kylin.hbase.region.cut” 可设置拆分,默认值5GB。如果5G以内,我就想实现并发,就可以手动设置这个值

2、kylin.hbase.region.count.min(默认为1) 和 kylin.hbase.region.count.max (默认为500)

这个相当于在开始就进行预分区,这样也能保证并发度

一般就改kylin.hbase.region.cut和kylin.hbase.region.count.min

页面配置:

Cube Designer 的Configuration Overwrites

配置覆写,比系统默认配置优先级高

补充

增量构建Cube

相当于数据每天增量进来,cube也需要每天增量去构建

1、disable: Hbase那个表

2、编辑Model,在setting那

指定Model分区策略(必做)

1、选择要分区的表:订单表

2、选分区列:按时间分

3、选择时间格式

4、Has a sep

​ 日期和时间如果是2个字段,上面就选日期,下面选时间

然后还要改Cube的设置(可选)

1、在refresh setting那

2、一天构建一个cube的话,多了会自动触发合并,这里就是改合并时间的策略。

image-20191114160741190

比如到第7天:我就开始小合并,把7天的segment合并一下。

第8天,就等到第14天,又把7天的segment合并一下。

到了3个7天+7个一天的时候,直接合并成28天的。

3、partition start date

从哪一天开始合并

每天buid一次

流式构建

对接kafka要用的

TODO

RestAPI

http://kylin.apache.org/cn/docs/howto/howto_use_restapi.html

就是,在页面能做的,都能通过restAPI做

演示一个query的

Curl Example

在linux下查一下

Code
1
curl -X POST --user ADMIN:KYLIN -H "Content-Type: application/json" -d '{ "sql":"select dept.dname, sum(emp.sal) from emp join dept on emp.deptno = dept.deptno group by dept.dname;", "project":"emp_project" }' http://mxxcentos7:7070/kylin/api/query

BI工具集成

JDBC

xml
1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>

demo

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package mxx.kylin;

import java.sql.*;

public class TestJDBC {
public static void main(String[] args) throws ClassNotFoundException, SQLException {

String driverClass = "org.apache.kylin.jdbc.Driver";

String url = "jdbc:kylin://mxxcentos7:7070/emp_project";

String user = "ADMIN";

String password = "KYLIN";

// 1 加载驱动
Class.forName(driverClass);

// 2 获取连接
Connection connection = DriverManager.getConnection(url, user, password);

// 3 SQL
String sql = "select dept.dname, sum(emp.sal) from emp join dept on emp.deptno = dept.deptno group by dept.dname;";


// 4 预编译SQL
PreparedStatement ps = connection.prepareStatement(sql);

// 5 执行SQL
ResultSet resultSet = ps.executeQuery();

// 6 打印结果
while(resultSet.next()){
System.out.println(resultSet.getString(1)+"\t"
+ resultSet.getDouble(2));
}

// 7 关闭
connection.close();


}
}

这个查的很快,相当于从数据仓库hive拿了数据,预处理后存在Hbase里,所以查的是Hbase。

所以可以整合前端,做实时查询的效果,hive那套就没法做实时的。

Zepplin

安装启动

shell
1
2
3
4
5
6
7
8
9
tar -zxvf /media/psf/centos_share/zeppelin-0.8.0-bin-all.tgz -C ~/apps/

mv zeppelin-0.8.0-bin-all zeppelin-0.8.0

./bin/zeppelin-daemon.sh start

http://mxxcentos7:8080/

# 完成...

Zepplin概念

共享笔记,查出来,自动生成报表,统计图啥的。

Zepplin能对接很多东西:Kylin、Spark、Hbase、python

类似于python的jupyter

就是个可视化报表的BI工具

配置Zepplin支持Kylin

1、点击右上角anonymous选择Interpreter

2、搜索Kylin插件并修改相应的配置

3、修改完成点击Save完成

界面操作:略

案例实操

1、点击Notebook创建新的note

2、填写Note Name点击Create

3、执行查询

4、结果展示

5、其他图表格式

文章作者: Machine
文章链接: https://machine4869.gitee.io/2019/11/11/20191111151342292/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论