传送门:https://www.bilibili.com/video/BV1Wt4y1s7rZ?share_source=copy_web
kylin4.0
- 底层构建引擎通过spark构建数据源连接,诸如hadoop、hive、csv
- 将构建的cube存到parquet内,并存到hdfs上。这里的cube的可以理解为特殊的结构,由纬度组成,等于事先将各维度排列组合的立体模型构建好
- kylin中的元数据类似hive,保存在mysql中
- 路由层相当于检索,如果已有的cube满足条件就去查parquet,不满足条件再转换为sparksql去查询对接的数据源
- 查询引擎是用来解析用户客户端传来的sql语句
- rest server可让客户端进行接口访问,也可以让客户端发送sql
- 由于是sprak程序,所以可以被yarn/k8s进行资源管理排版
所以,实则上,kylin所做的事,就是你将事实纬度传入后指定相关度量的指标,它来自动构建2^n -1 纬度体系
quick start
docker构建
# 拉取镜像
docker pull apachekylin/apache-kylin-standalone:4.0.0
# 启动容器
docker run -d \
-m 8G \
-p 7070:7070 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
apachekylin/apache-kylin-standalone:4.0.0
启动完毕浏览器http://ip:7070/kylin可直接访问web端
目前支持数据源对接hive表、csv文件,读取hive时会同步hive表信息
直接导入创建的测试表
- 创建模型流程:创建模型—选择相关数据—选择纬度—选择事实—分区设置+过滤设置
- 创建cube流程:创建cube(需要选择模型)—纬度选择(从模型纬度中选择)—度量值选择(从模型中事实字段选择)—刷新设置(设置parquet文件合并的时间:默认7天小并,28天大并)—高级设置(设置聚合组、rowkey、Cuboids)—设置kylin相关参数(默认按照kylin*.properties)—最后确认
- 构建cube
- 正在构建,同时yarn上也会有application在运行
- 构建完成,可以写sql查询,同比查询比较hive是很快的
查询注意事项
-
创建模型的时候指定了join的连接方式,如果不开启查询下压,写其他的join方式sql会报错
-
字段都是建模、cube的时候指定了,如果没有开启查询下压,选择其他字段也会报错
-
聚合查询方式也是指定的,如果没有开启查询下压,选择其他字段聚合也会报错
-
必须事实表在前,维度表在后
restful api调用
- curl执行某一条sql
curl -X POST -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json' -d '{"sql":"select dname,sum(sal) from emp e join dept d on e.deptno = d.deptno group by dname","project":"FirstProject"}' http://172.16.6.14:7070/kylin/api/query
- 定时调度脚本,可用azkaban/oozie这样的调度工具去执行
#!/bin/bash
#从第 1 个参数获取 cube_name
cube_name=$1
#从第 2 个参数获取构建 cube 时间
if [ -n "$2" ]
then
do_date=$2
else
do_date=`date -d '-1 day' +%F`
fi
#获取执行时间的 00:00:00 时间戳(0 时区)
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 'ContentType: application/json' -d '{"startTime":'$start_date',
"endTime":'$stop_date', "buildType":"BUILD"}'
http://172.16.6.14:7070/kylin/api/cubes/$cube_name/build
# 注:没有修改 kylin 的时区,因此 kylin 内部只识别 0 时区的时间,0 时区的 0 点是东 8 区的早上 8 点,因此我们在脚本里要写$do_date 08:00:00 来弥补时差问题。
开启查询下压
-
开启查询下压,没有构建cube的用sparksql转到hive中去查
- 在conf目录下,kylin.properties
query.pushdown.runner-class-name=org.apache.kylin.query.pushdown.PushDownRunnerSparkImpl
查询引擎
- Sparder,感觉类似于spark-shell,申请资源一直占用,kylin默认会在第一条查询语句开启,所以第一条一般会比较慢,也可以默认直接开启,修改参数为true即可
kylin.query.auto-sparder-context-enabled-enabled=true
- hdfs目录
- 临时文件存储目录:/project_name/job_tmp Cuboid
- 文件存储目录: /project_name /parquet/cube_name/segment_name_XXX
- 维度表快照存储目录:/project_name /table_snapshot
- Spark 运行日志目录:/project_name/spark_logs
- kylin相关查询参数
####spark 运行模式####
#kylin.query.spark-conf.spark.master=yarn
####spark driver 核心数####
#kylin.query.spark-conf.spark.driver.cores=1
####spark driver 运行内存####
#kylin.query.spark-conf.spark.driver.memory=4G
####spark driver 运行堆外内存####
#kylin.query.spark-conf.spark.driver.memoryOverhead=1G
####spark executor 核心数####
#kylin.query.spark-conf.spark.executor.cores=1
####spark executor 个数####
#kylin.query.spark-conf.spark.executor.instances=1
####spark executor 运行内存####
#kylin.query.spark-conf.spark.executor.memory=4G
####spark executor 运行堆外内存####
#kylin.query.spark-conf.spark.executor.memoryOverhead=1G
cube构建优化
-
衍生纬度
- 按照常理来说有多少指标字段的纬度就有2^n-1个cuboid需要创建
- 现在是用维度表的主键表示维度表其他指标纬度,假设原来两个个维度表各有三个指标,那就得26-1=63个cuboid,现在只需要两个主键组合也就是22-1=3个cuboid
- 不推荐,因为kylin强大之处在于预计算构建cube,如果使用衍生纬度,会导致其在查询的时候计算,预计算的时候减少计算,本末倒置
- 在构建cube选择纬度的类型时候,Deriver关键字表示衍生纬度
-
聚合组
- 主要针对于实际环境用不到的cuboid,可以在预计算的时候就不去构建
- 强制纬度:表示构建的cuboid都需包含这个纬度,否则就不构建,注意,强制纬度也不能单独出现,下面也是有误
- 层次纬度:可以理解为某个纬度出现的先决纬度,也就是在B出现时A必须出现,A—>B
- 联合纬度:表示纬度必须一起出现
- 实际cube构建应用
-
cube参数调优
-
使用适当的spark资源,cube也会根据自身的参数来调节spark运行资源
-
全局字典:主要是去重功能,对于整型可以使用bitmap去重,而对于String类型,kylin采用的方式是先对string构建映射,再用bitmap对映射值去重
- 快照表优化:每一张快照表对应hive纬度表
-
查询性能优化
- 排序列:也就是构建的时候rowkey的顺序,可以拖拽各列的排序顺序,在rowkeys页面除了对各列的排序顺序,也有按照某列进行分片,分片可以提升查询的性能,对应kylin底层存储的parquet文件
- 减少小的或不均匀的 parquet 文件
连接工具集成
jdbc
<dependencies>
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
import java.sql.*;
public class KylinTest
{
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://172.16.6.14:7071/FirstProject";
//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
dname, sum(sal) from emp e join dept d on e.deptno = d.deptno group by dname ");
//执行查询
ResultSet resultSet = ps.executeQuery();
//遍历打印
while(resultSet.next())
{
System.out.println(resultSet.getString(1) + ":" + resultSet.getDouble(2));
}
}
}
MDX集成
可采用docker部署,拉取镜像:
docker pull apachekylin/apache-kylin-standalone:kylin-4.0.1-mondrian
启动容器:
docker run -d \
-m 8G \
-p 7070:7070 \
-p 7080:7080 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
apachekylin/apache-kylin-standalone:kylin-4.0.1-mondrian
- Kylin 页面:http://127.0.0.1:7070/kylin/login
- MDX for Kylin 页面:http://127.0.0.1:7080
- HDFS NameNode 页面:http://127.0.0.1:50070
- YARN ResourceManager 页面:http://127.0.0.1:8088