传送门: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)—最后确认
- 正在构建,同时yarn上也会有application在运行
- 构建完成,可以写sql查询,同比查询比较hive是很快的
查询注意事项
-
创建模型的时候指定了join的连接方式,如果不开启查询下压,写其他的join方式sql会报错 -
字段都是建模、cube的时候指定了,如果没有开启查询下压,选择其他字段也会报错 -
聚合查询方式也是指定的,如果没有开启查询下压,选择其他字段聚合也会报错 -
必须事实表在前,维度表在后
restful api调用
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
cube_name=$1
if [ -n "$2" ]
then
do_date=$2
else
do_date=`date -d '-1 day' +%F`
fi
start_date_unix=`date -d "$do_date 08:00:00" +%s`
start_date=$(($start_date_unix*1000))
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
开启查询下压
查询引擎
- 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
cube构建优化
-
衍生纬度
- 按照常理来说有多少指标字段的纬度就有2^n-1个cuboid需要创建
- 现在是用维度表的主键表示维度表其他指标纬度,假设原来两个个维度表各有三个指标,那就得26-1=63个cuboid,现在只需要两个主键组合也就是22-1=3个cuboid
- 不推荐,因为kylin强大之处在于预计算构建cube,如果使用衍生纬度,会导致其在查询的时候计算,预计算的时候减少计算,本末倒置
- 在构建cube选择纬度的类型时候,Deriver关键字表示衍生纬度
-
聚合组
- 主要针对于实际环境用不到的cuboid,可以在预计算的时候就不去构建
- 强制纬度:表示构建的cuboid都需包含这个纬度,否则就不构建,注意,强制纬度也不能单独出现,下面也是有误
- 层次纬度:可以理解为某个纬度出现的先决纬度,也就是在B出现时A必须出现,A—>B
-
cube参数调优
查询性能优化
- 排序列:也就是构建的时候rowkey的顺序,可以拖拽各列的排序顺序,在rowkeys页面除了对各列的排序顺序,也有按照某列进行分片,分片可以提升查询的性能,对应kylin底层存储的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
{
String KYLIN_DRIVER = "org.apache.kylin.jdbc.Driver";
String KYLIN_URL = "jdbc:kylin://172.16.6.14:7071/FirstProject";
String KYLIN_USER = "ADMIN";
String KYLIN_PASSWD = "KYLIN";
Class.forName(KYLIN_DRIVER);
Connection connection = DriverManager.getConnection(KYLIN_URL, KYLIN_USER, KYLIN_PASSWD);
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
|