olap分析引擎——Kylin4.0


传送门:https://www.bilibili.com/video/BV1Wt4y1s7rZ?share_source=copy_web

kylin4.0

image-20220613204812248

  • 底层构建引擎通过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表信息

image-20220618112525531

直接导入创建的测试表

  • 创建模型流程:创建模型—选择相关数据—选择纬度—选择事实—分区设置+过滤设置

image-20220618113103567

  • 创建cube流程:创建cube(需要选择模型)—纬度选择(从模型纬度中选择)—度量值选择(从模型中事实字段选择)—刷新设置(设置parquet文件合并的时间:默认7天小并,28天大并)—高级设置(设置聚合组、rowkey、Cuboids)—设置kylin相关参数(默认按照kylin*.properties)—最后确认

image-20220618114837403

  • 构建cube

image-20220618114931825

  • 正在构建,同时yarn上也会有application在运行

image-20220618115156043

  • 构建完成,可以写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

image-20220618143541478

  • 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关键字表示衍生纬度

    image-20220618150655194

  • 聚合组

    • 主要针对于实际环境用不到的cuboid,可以在预计算的时候就不去构建
    • 强制纬度:表示构建的cuboid都需包含这个纬度,否则就不构建,注意,强制纬度也不能单独出现,下面也是有误

    image-20220618151049534

    • 层次纬度:可以理解为某个纬度出现的先决纬度,也就是在B出现时A必须出现,A—>B

    image-20220618151426519

    • 联合纬度:表示纬度必须一起出现

    image-20220618151533215

    • 实际cube构建应用

    image-20220618151924498

  • cube参数调优

    • 使用适当的spark资源,cube也会根据自身的参数来调节spark运行资源

      image-20220618152307023

    • 全局字典:主要是去重功能,对于整型可以使用bitmap去重,而对于String类型,kylin采用的方式是先对string构建映射,再用bitmap对映射值去重

    image-20220618160840985

    • 快照表优化:每一张快照表对应hive纬度表

    image-20220618160927769

查询性能优化

  • 排序列:也就是构建的时候rowkey的顺序,可以拖拽各列的排序顺序,在rowkeys页面除了对各列的排序顺序,也有按照某列进行分片,分片可以提升查询的性能,对应kylin底层存储的parquet文件

image-20220618161530898

  • 减少小的或不均匀的 parquet 文件

image-20220618163303660

连接工具集成

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友培

数据皆开源!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值