中国人的kylin
kylin的认识
一、cubo和cudoid
1.维度和度量
-
数据分析领域中两个常用的概念。
-
维度
-
观察数据的角度,也就是数据记录的一个属性。
-
-
度量
-
基于数据所计算出来的考量值,通常是一个数据,例如销售额、不同的用户数量。
-
-
我们就是从不同的维度来审查度量值,以便我们分析找出其中的变化规律。
-
对于我们的SQL查询,group by的属性通常就是我们考量的维度,所计算出来的比如sum、min、max更字段就是我们需要的度量。
-
示例讲解
-
Id year market category item sales
1 2010 商场1 家电类 电脑 100
2 2010 商场1 家电类 冰箱 200
3 2010 商场1 家电类 洗衣机 300
4 2010 商场1 日用品类 厨具四件套 50
5 2010 商场1 日用品类 锅碗瓢盆 33
6 2010 商场1 日用品类 洗洁精 11
7 2010 商场1 蔬果类 西瓜 5
8 2010 商场1 蔬果类 苹果 6
9 2010 商场1 蔬果类 梨 4
10 2010 商场1 肉类 牛肉 10
11 2010 商场1 肉类 猪肉 9
12 2010 商场1 肉类 羊肉 8 -
SQL分析
-
select year, market , category ,SUM(sales) as sumsales from test group by category;
-
结果
-
2010 商场1 家电类 600
2010 商场1 日用品类 94
2010 商场1 肉类 27
2010 商场1 蔬果类 15
-
-
-
商品类别就是维度,sum(sales)就是度量,也就是我们从商品类别的角度来看,各种商品类别的销售额分别是多少。
-
-
当然我们也可以进行多维度查询。
2.cubo和cuboid
-
cubo:
-
确定好维度和度量之后,就可以根据他们构建cubo(立方体),也就是所谓的预计算,对原始数据建立的多位索引。
-
给定一个数据模型,我们可以对其上的所有维度进行组合,对于N个维度来说,组合的所有可能性共有2的N次方种。
-
-
cuboid
-
对于上面说的每一种维度组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为cuboid。
-
所有的维度组合的cuboid作为一个整体,被称为cubo。
-
-
简单来说,一个cubo就是许多按维度聚合的物化视图的集合。
-
示例
-
假定有一个电商的销售数据集,其中维度包括时间(Time)、商品(Item)、地点(Location)和供应商(Supplier), 度量为销售额(GMV)。那么所有维度的组合就有2^4 =16种(如图1-3所 示),比如一维度(1D)的组合有[Time]、[Item]、[Location]、[Supplier]4种; 二维度(2D)的组合有[Time,Item]、[Time,Location]、[Time、Supplier]、 [Item,Location]、[Item,Supplier]、[Location,Supplier]6种;三维度(3D)的 组合也有4种;最后零维度(0D)和四维度(4D)的组合各有1种,总共就有 16种组合。
-
-
cubo Segment
-
元数据中的某一个片段计算出的cubo数据,通常数仓中的数据量会随着时间的增长而增长,而cubo Segment也是按照时间顺序来构建的。
-
二、事实表和维度表
1.事实表和维度表
-
事实表是指存储有事实记录的表,如系统日志、销售记录等;事实表的记录在不断地动态增长,所以它的体积通常远远大于其他表。
-
维度表或者维表,有时也称查找表,与事实表相对应,它保持了维度的属性值,可以跟事实表做关联;也就是将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。
-
使用维度表的好处
-
缩小了事实表的大小
-
便于维度的管理和维护,正价、删除和修改维度的属性,不必对事实表的大量记录进行改动。
-
维度表可以为多个事实表重用,以减少重复工作。
-
2.多维数据模型
-
星型模型
-
一张事实表,以及零个或多个维度表;
-
事实表与维度表通过主键外键相关联,维度表之间没有关联。
-
-
雪花模型
-
将星型模型中的某些维度表抽取成更细粒度的维度表,然后让维度表之间也进行关联。
-
-
区别
-
星型模型以为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花模型要高
-
星型结构不需要考虑很多正规化的因素,设计比较简单
-
雪花模型去除了冗余数据,有些统计表需要通过表的联接才能产生,故效率不一定有星型模型高。
-
正规化也是一种比较复杂的过程,相应的数据库结构设计、数据的ETL、以及后期的维护都要复杂一些。因此在冗余可以接受的前提下,实际运用中星型模型使用的更多,也更有效率。
-
三、kylin的简介
1.kylin的由来
-
Apache Kylin是一个开源的分布式分析引擎,为hadoop等大象分布式数据平台之上的超大规模数据集通过标准SQL查询及多位(OLAP)功能提供亚秒级的交互式分析能力。
-
Kylin租出由eBay开发至开眼社区,能狗仔亚秒级查询巨大的hive表,并支持高并发。
2、为什么使用Kylin
-
企业中大数据查询分为两种:即席查询和定制查询。
-
hive、sparksql等OLAP引擎,随然在很大程度上降低了数据分析的难度,但是他们只适用于即席查询场景。优点:
-
查询灵活,但是随着数据量和计算复杂度的增长,响应时间不能得到保证。
-
-
定追查询:多数情况下四队用户的操作坐车实时反映,hive等查询引擎很难满足实时查询,一般只能对数据库中的数据进行提前计算,然后将结果存入MySQL等关系型数据库,最后提供给用户进行查询。
-
-
Apache Kylin采用“预计算”的模式,用户只需要提前定义好查询维度,kylin将帮助我们进行计算,并将结果存储到hbase中,为海量数据的查询和分析提供亚秒级返回,是一种典型的空间换时间的解决方案。
-
kylin不仅很好的解决了海量数据快速查询的问题,也避免了手动开发和维护提前计算程序带来的一系列麻烦。
3kylin的工作原理
-
指定数据模型,定义维度和度量
-
预结算cubo,计算所有cuboid并保存为物化视图。
-
执行查询时,读取cuboid,运算,产生查询结果。
-
kylin的查询过程不会扫描原始记录,而是通过预计算预先完成表的关联、聚合更复杂运算,并利用预计算的结果来执行查询,因此相比非预计算的查询技术,速度一般要快一到两个数量级,这点在超大的数据集上有时更明显。
-
总结
-
kylin的核心思想是cubo预计算,理论基础是空间换时间,把高度复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询。
-
四、kylin的技术架构
-
图解
-
-
kylin架构图讲解
-
主要分为在线查询和离线构建两个部分,橙色线代表在线,灰色线代表离线。
-
提供一个标准的SQL接口用户可以从上方查询系统发送SQL进行查询分析。Kylin提供了各种Rest API、JDBC/ODBC接口。无论从哪个接口进入,SQL最终都会来到Rest服务层,再转交给查询引擎进行处理。这里需要注意的是,SQL语句是基于数据源的关系模型书写的,而不是cube。
Kylin在设计时刻意对查询用户屏蔽了cube的概念,分析师只需要理解简单的关系模型就可以使用Kylin,没有额外的学习门槛,传统的SQL应用也很容易迁移。查询引擎解析SQL,生成基于关系表的逻辑执行计划,然后将其转译为基于cube的物理执行计划,最后查询预计算生成的cube并产生结果。整个过程不会访问原始数据源。
-
架构图左侧为数据来源,消息队列、hive等拿到数据之后,通过kylin处理,将hbase作为存储介质,满足一定的实时性要求(Hbase中的每行记录的Rowkey由dimension组成,measure会保存在column family中。为了减小存储代价,这里会对dimension和measure进行编码。查询阶段,利用HBase列存储的特性就可以保证Kylin有良好的快速响应和高并发。Kylin在中间作为媒介,提供rest api使用以及jdbc接口供BI软件做报表的支撑(拓展软件:tableau,superset)。
-
-
总结
-
kylin在数据集规模上的局限性主要取决于维度的个数和基数。
-
因为预计算使得kylin的查询速度非常快,亚秒级响应。
-
-
实例讲解
-
-
两个维度,共有四种维度组合
-
图右边讲解
-
00000001+0
-
只有第二个维度,0是该维度取的哪一个城市 代表含义是:北京的price是80 ;
-
-
00000010+0
-
只有第一个维度,0是该维度取的哪一年 代表含义是:93年的price是40;
-
-
00000011+10
-
有两个维度,0和1是该维度取的哪一年,哪一个城市 代表含义是:94年北京price是40;
-
-
总结
-
红色代表拥有几个维度,“+”后面代表取该维度下哪一个字段;
-
-
-
四、Kylin的安装
前提是安装好kylin所依赖的hadoop、hive、hbase、zookeeper。
-
上传tar包并解压
-
替换hbase为版本1以上
-
/etc/profile文件的环境变量:
-
HBASE_HOME:改成1.3.5版本的地址
-
-
修改环境变量后,重新连接xshell,不要使用source /etc/profile命令
-
$HBASE_HOME/conf/hbase-env.sh
-
注释:
-
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
-
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
-
-
-
将hdfs上面的/hbase目录删除掉
-
hdfs dfs rmr /hbase
-
-
将zookeeper上的/hbase节点删除掉
-
进入zookeeper
-
zCli.sh
-
rmr /hbase
-
-
-
-
-
配置kylin相关变量
-
vim /etc/profile
-
export HIVE_HOME=/opt/sxt/hive-1.2.1
export HBASE_HOME=/opt/sxt/hbase-1.3.5
export HIVE_CONF_HOME=$HIVE_HOME/conf
export HCAT_HOME=$HIVE_HOME/hcatalog
export HADOOP_CONF_DIR=/opt/sxt/hadoop-2.6.5/etc/hadoop
export PATH=$HCAT_HOME/bin:$PATH
export KYLIN_HOME=/opt/sxt/kylin
export PATH=$HIVE_HOME/bin:$PATH
export PATH=$KYLIN_HOME/bin:$PATH -
注意:增加配置中没有的路径即可
-
-
加载配置文件
-
source /etc/profile
-
-
-
Kylin 会自动从环境中读取 Hadoop 配置(core-site.xml),Hive 配置(hive-site.xml)和 HBase 配置(hbase-site.xml)
-
修改kylin.properties配置文件(单节点时这一步可以忽略掉)
-
如果是集群多台节点配置的话,只能是有一台是job/all,其他台是query模式。
-
-
kylin启动
-
使用kylin的前提是,kylin要有操作所有东西的权限,什么意思,hdfs读写权限,hive创建表权限,各种权限。
-
启动步骤
-
启动zookeeper
-
启动hadoop
-
启动历史日志
-
mr-jobhistory-daemon.sh start historyserver
-
历史日志配置
-
mapred-site.xml
-
<property>
<name>mapreduce.jobhistory.address</name>
<value>node03:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node03:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/history/done</value>
</property>
<!--- 正在运行的任务信息临时目录 -->
<property>
<name>mapreudce.jobhistory.intermediate.done-dir</name>
<value>/history/done/done_intermediate</value>
</property>
-
-
yarn-siite.xml
-
<!---开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
-
-
-
-
启动hbase
-
启动hive
-
service mysqld start
-
-
-
启动kylin
-
进入bin目录下执行 kylin.sh start
-
-
-
访问
-
node01:7070/kylin
-
账户:ADMIN
-
密码:KYLIN
-
五、kylin的使用
建立project->建立model->建立cube->build。
1.创建kylin步骤
-
进入hive中
-
创建库
-
create database if not exists sxt_kylin;
-
-
使用库
-
use sxt_kylin;
-
-
创建表
-
create table kylin_sale(
id int,
day date,
market string,
category string,
item string,
number int,
sales int
)
row format delimited fields terminated by ','
lines terminated by '\n';
-
-
源数据
-
1,2019-08-08,商场1,家电类,电脑,2,9000
2,2019-08-08,商场1,家电类,冰箱,3,3000
3,2019-08-08,商场1,家电类,洗衣机,6,3000
4,2019-08-08,商场1,日用品类,厨具四件套,10,500
5,2019-08-08,商场1,日用品类,锅碗瓢盆,5,200
6,2019-08-08,商场1,日用品类,洗洁精,8,240
7,2019-08-08,商场2,家电类,电脑,7,35000
8,2019-08-08,商场2,家电类,冰箱,4,4000
9,2019-08-08,商场2,家电类,洗衣机,5,5000
10,2019-08-08,商场2,日用品类,厨具四件套,8,500
11,2019-08-08,商场2,日用品类,锅碗瓢盆,9,360
12,2019-08-08,商场2,日用品类,洗洁精,10,900
13,2019-08-09,商场1,家电类,电脑,3,15000
14,2019-08-09,商场1,家电类,冰箱,4,3000
15,2019-08-09,商场1,家电类,洗衣机,5,3000
16,2019-08-09,商场1,日用品类,厨具四件套,6,500
17,2019-08-09,商场1,日用品类,锅碗瓢盆,7,350
18,2019-08-09,商场1,日用品类,洗洁精,8,240
19,2019-08-09,商场2,家电类,电脑,9,35000
20,2019-08-09,商场2,家电类,冰箱,5,
-
-