36 大数据项目之电商数仓(即席查询之Kylin)

第 3 章 Kylin

3.0 前置知识

36 大数据项目之电商数仓(即席查询之Kylin)_第1张图片
2^n-1各角度

select
location
type
sum(money)
from tb
group by location,type

36 大数据项目之电商数仓(即席查询之Kylin)_第2张图片

OLAP类型
36 大数据项目之电商数仓(即席查询之Kylin)_第3张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第4张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第5张图片

3.1 Kylin 简介

3.1.1 Kylin 定义

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

3.1.2 Kylin 架构

36 大数据项目之电商数仓(即席查询之Kylin)_第6张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第7张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第8张图片
在这里插入图片描述
在这里插入图片描述

3.1.3 Kylin 特点

36 大数据项目之电商数仓(即席查询之Kylin)_第9张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第10张图片

3.2 Kylin 安装

3.2.1 Kylin 依赖环境

hbase参考文档安装

在这里插入图片描述
并且不需要分发因为只在dw1上有kylin

3.2.2 Kylin 搭建

1)下载 Kylin 安装包

下载地址:http://kylin.apache.org/cn/download/

2)解压 apache-kylin-2.5.1-bin-hbase1x.tar.gz 到/opt/module
在这里插入图片描述
3)启动

检验jobhistoryserver:

hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-example-2.7.2.jar pi 1 1
访问dw1:8088 点击history正常则没问题

(1)启动 Kylin 之前,需先启动 Hadoop(hdfs,yarn,jobhistoryserver)、Zookeeper、Hbase、hive元数据服务
36 大数据项目之电商数仓(即席查询之Kylin)_第11张图片
(2)启动 Kylin

[dw@dw1 kylin]$bin/kylin.sh start

在这里插入图片描述
如果起不来可能是kylin.sh脚本启动时调用check-hive-usability.sh中hive -e查询将时间调大
访问 http://dw1:7070/kylin
36 大数据项目之电商数仓(即席查询之Kylin)_第12张图片

用户名为:ADMIN,密码为:KYLIN

3.3 Kylin 使用

在这里插入图片描述

3.2.1创建工程

36 大数据项目之电商数仓(即席查询之Kylin)_第13张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第14张图片

3.2.2获取数据源

1)点击 DataSource
36 大数据项目之电商数仓(即席查询之Kylin)_第15张图片
2)点击下图按钮导入 Hive 表
36 大数据项目之电商数仓(即席查询之Kylin)_第16张图片
3)选择所需数据表,并点击 Sync 按钮
36 大数据项目之电商数仓(即席查询之Kylin)_第17张图片

3.2.3创建model

1)点击 Models,点击"+New"按钮,点击"★New Model"按钮。
36 大数据项目之电商数仓(即席查询之Kylin)_第18张图片
2)填写 Model 信息,点击 Next
36 大数据项目之电商数仓(即席查询之Kylin)_第19张图片

3)指定事实表
36 大数据项目之电商数仓(即席查询之Kylin)_第20张图片
4)选择维度表,并指定事实表和维度表的关联条件,点击 Ok

36 大数据项目之电商数仓(即席查询之Kylin)_第21张图片
维度表添加完毕之后,点击 Next
36 大数据项目之电商数仓(即席查询之Kylin)_第22张图片
5)指定维度字段,并点击 Next
36 大数据项目之电商数仓(即席查询之Kylin)_第23张图片
6)指定度量字段,并点击 Next
36 大数据项目之电商数仓(即席查询之Kylin)_第24张图片
7)指定事实表分区字段(仅支持时间分区),点击 Save 按钮,model 创建完毕
36 大数据项目之电商数仓(即席查询之Kylin)_第25张图片

3.2.4构建cube

1)点击 new, 并点击 new cube

36 大数据项目之电商数仓(即席查询之Kylin)_第26张图片

2)填写 cube 信息,选择 cube 所依赖的 model,并点击 next
36 大数据项目之电商数仓(即席查询之Kylin)_第27张图片
3)点击 add dimensions (维度表选normal)
36 大数据项目之电商数仓(即席查询之Kylin)_第28张图片

4)选择所需的维度,如下图所示,点击next
36 大数据项目之电商数仓(即席查询之Kylin)_第29张图片
5)选择所需度量值,如下图所示,并点击ok保存
36 大数据项目之电商数仓(即席查询之Kylin)_第30张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第31张图片
6)cube 自动合并设置,cube 需按照日期分区字段每天进行构建,每次构建的结果会保存在
Hbase 中的一张表内,为提高查询效率,需将每日的 cube 进行合并,此处可设置合并周期。

36 大数据项目之电商数仓(即席查询之Kylin)_第32张图片
注意:与hbase合并表不一样的是,kylin是多表合并一张表。hbase是一张大表内部hfile合并

7)Kylin 高级配置(优化相关,暂时跳过)
36 大数据项目之电商数仓(即席查询之Kylin)_第33张图片
8)Kylin 相关属性配置覆盖(只在当前cube生效)
36 大数据项目之电商数仓(即席查询之Kylin)_第34张图片
9)Cube 信息总览,点击 Save,Cube 创建完成
36 大数据项目之电商数仓(即席查询之Kylin)_第35张图片
10)构建 Cube(计算),点击对应 Cube 的 action 按钮,选择 build
36 大数据项目之电商数仓(即席查询之Kylin)_第36张图片
11)选择要构建的时间区间,点击 Submit
36 大数据项目之电商数仓(即席查询之Kylin)_第37张图片
12)点击 Monitor 查看构建进度
36 大数据项目之电商数仓(即席查询之Kylin)_第38张图片

3.2.5使用进阶

1)每日全量维度表及拉链维度表重复 Key 问题如何处理

按照上述流程,会发现,在 cube 构建流程中出现以下错误
36 大数据项目之电商数仓(即席查询之Kylin)_第39张图片
原因:事实表根据日期分区与用户拉链表join时,会出现多个有修改过操作的用户,所以导致重复key

重复key解决方案

方案一:在 hive 中创建维度表的临时表,该临时表中只存放维度表最新的一份完整的数据,在 kylin 中创建模型时选择该临时表作为维度表。

方案二:与方案一思路相同,但不使用物理临时表,而选用视图(view)实现相同的功
能。

此处采用方案二: 创建维度表视图

(1)创建维度表视图

--拉链维度表视图
create view	dwd_dim_user_info_his_view	as select * from dwd_dim_user_info_his where end_date='9999-99-99';

--全量维度表视图
create view	dwd_dim_sku_info_view	as select * from dwd_dim_sku_info where dt=date_add(current_date,-1);

--当前情形我们先创建一个 dwd_dim_user_info_his  的视图
create view	dwd_dim_user_info_his_view	as select * from dwd_dim_user_info_his where end_date='9999-99-99';

创建视图完毕后:
1.discard失败的任务并drop => 2.drop cube => 3.drop model => 4.unload table dwd_dim_user_info_his
并重新创建model执行下去

2)历史服务器错误 (方案:修改到今天日期)

hadoop fs -ls /tmp/hadoop-yarn/staging/history (存放jobhistory的日志)
done  显示在web界面
^
|
done_intermediate 日期往前则一直在 done_intermediate里无法显示

使用kylin进行查询

36 大数据项目之电商数仓(即席查询之Kylin)_第40张图片

select l.region_name, sum(payment_amount)
from dwd_fact_payment_info p
left join dwd_dim_base_province l
on p.province_id = l.id
group by l.region_name

36 大数据项目之电商数仓(即席查询之Kylin)_第41张图片
注意:第一次可能比较慢,因为与hbase需要建立一次连接需要消耗一些时间

如何实现每日自动构建 cube -->Restful API

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

查询 example

curl -X POST -H “Authorization: Basic XXXXX=” -H “Content-Type: application/json” -d ‘{ “sql”:“select count(*) from TEST_KYLIN_FACT”, “project”:“learn_kylin” }’ http://localhost:7070/kylin/api/query

1.需要将登陆的账号密码进行加密

http://tool.chinaz.com/Tools/Base64.aspx

36 大数据项目之电商数仓(即席查询之Kylin)_第42张图片
2.改写命令
curl -X POST -H “Authorization: Basic QURNSU46S1lMSU4=” -H “Content-Type: application/json” -d ‘{ “sql”:“select l.region_name, sum(payment_amount) from dwd_fact_payment_info p left join dwd_dim_base_province l on p.province_id = l.id group by l.region_name”, “project”:“gmall” }’ http://dw1:7070/kylin/api/query

构建 cube example

curl -X PUT -H “Authorization: Basic XXXXXXXXX” -H ‘Content-Type: application/json’ -d ‘{“startTime”:‘1423526400000’, “endTime”:‘1423612800000’, “buildType”:“BUILD”}’ http://:/kylin/api/cubes/{cubeName}/build

改写命令并编写成脚本

#!/bin/bash

cube_name=payment_view_cube
do_date=`date -d '-1 day' +%F`

#获取 00:00 时间戳
start_date_unix=`date -d "$do_date 08:00:00" +%s`
start_date=$(($start_date_unix*1000))

#获取 24:00 的时间戳
stop_date=$(($start_date+86400000))

curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json' -d '{"startTime":'$start_date', "endTime":'$stop_date',	"buildType":"BUILD"}' http://dw1:7070/kylin/api/cubes/$cube_name/build

3.4 Kylin Cube 构建原理

3.4.1Cube 存储原理

36 大数据项目之电商数仓(即席查询之Kylin)_第43张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第44张图片
底层存储16进制,并且有位数约定来表达第几个维度

3.4.2Cube 构建算法

1)逐层构建算法(layer)
36 大数据项目之电商数仓(即席查询之Kylin)_第45张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第46张图片

2)快速构建算法(inmem)
36 大数据项目之电商数仓(即席查询之Kylin)_第47张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第48张图片

3.5Kylin Cube 构建优化

3.5.1使用衍生维度(derived dimension)

36 大数据项目之电商数仓(即席查询之Kylin)_第49张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第50张图片

在这里插入图片描述

3.5.2使用聚合组(Aggregation group)

36 大数据项目之电商数仓(即席查询之Kylin)_第51张图片
(1)强制维度(Mandatory)
36 大数据项目之电商数仓(即席查询之Kylin)_第52张图片
(2)层级维度(Hierarchy)
36 大数据项目之电商数仓(即席查询之Kylin)_第53张图片
(3)联合维度(Joint) 如sku与spu
36 大数据项目之电商数仓(即席查询之Kylin)_第54张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第55张图片

3.5.3Row Key 优化

36 大数据项目之电商数仓(即席查询之Kylin)_第56张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第57张图片
2)基数大的维度放在基数小的维度前边。
36 大数据项目之电商数仓(即席查询之Kylin)_第58张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第59张图片

3.5.4并发粒度优化

36 大数据项目之电商数仓(即席查询之Kylin)_第60张图片

3.6Kylin BI 工具集成

36 大数据项目之电商数仓(即席查询之Kylin)_第61张图片

3.6.1JDBC

1)新建项目并导入依赖


	
		org.apache.kylin</groupId>
		kylin-jdbc</artifactId>
		2.5.1</version>
	</dependency>
</dependencies>

2)编码

package com.atguigu;
import java.sql.*; public class TestKylin {
public static void main(String[] args) throws Exception {

//Kylin_JDBC 驱动
String KYLIN_DRIVER = "org.apache.kylin.jdbc.Driver";
//Kylin_URL
String KYLIN_URL = "jdbc:kylin://dw1:7070/gmall";
//Kylin 的用户名
String KYLIN_USER = "ADMIN";

//Kylin 的密码
String KYLIN_PASSWD = "KYLIN";

//添加驱动信息
Class.forName(KYLIN_DRIVER);
//获取连接
Connection connection = DriverManager.getConnection(KYLIN_URL, KYLIN_USER, KYLIN_PASSWD);
//预编译 SQL
PreparedStatement ps = connection.prepareStatement("select l.region_name, sum(payment_amount) from dwd_fact_payment_info p left join dwd_dim_base_province l on p.province_id = l.id group by l.region_name");
//执行查询
ResultSet resultSet = ps.executeQuery();

//遍历打印
while (resultSet.next()) {
		System.out.println(resultSet.getString(1) + ":" +resultSet.getDouble(2) );
		}
	}
}

3)结果展示
36 大数据项目之电商数仓(即席查询之Kylin)_第62张图片

3.6.2Zepplin

1)Zepplin 安装与启动
(1)将 zeppelin-0.8.0-bin-all.tgz 上传至 Linux
(2)解压 zeppelin-0.8.0-bin-all.tgz 之/opt/module
(3)修改名称
(4)启动 bin/zeppelin-daemon.sh start (后台运行)
在这里插入图片描述

可登录网页查看,web 默认端口号为 8080
http://dw1:8080
2)配置 Zepplin 支持 Kylin
(1)点击右上角 anonymous 选择 Interpreter
36 大数据项目之电商数仓(即席查询之Kylin)_第63张图片
(2)搜索 Kylin 插件并修改相应的配置
36 大数据项目之电商数仓(即席查询之Kylin)_第64张图片
(3)修改完成点击 Save 完成

(4)点击 Notebook 创建新的 note
36 大数据项目之电商数仓(即席查询之Kylin)_第65张图片
36 大数据项目之电商数仓(即席查询之Kylin)_第66张图片
切换解释器
36 大数据项目之电商数仓(即席查询之Kylin)_第67张图片

你可能感兴趣的:(大数据)