kylin-工作原理及使用

3,172 阅读7分钟

前言

上一篇kylin-安装部署主要是进行安装和简单介绍,现在是对kylin的使用。

1.1 kylin概述

Demo数据,我们有这样的一个需求,分析薪资受哪些因素影响。

1.1.1 维度(Dimension

简单来说维度就是观察数据的角度,他通常是数据记录的一个属性,例如上图中,薪资可能跟工作类型有关系,也可能与入职年限有关系,那么job和hiredate就是维度。

1.1.2 度量(Measure)

度量就是被聚合后的统计值,一般如订单金额、商品价格等等,在Demo数据中对应的列就是sal。在基于sql的查询中,Group by 的属性通常就是维度,而所计算的就是度量。

select t.job,sum(t.sal)  from demo t group by t.job

1.1.3 Cube 和 Cuboid

根据维度和度量,那么数据模型上的所有字段都可以进行分类了,不是维度就是度量,那么就可以以此来做预计算。给定一个数据模型,对所有维度进行组合,假设有N个维度,那么可以组合的可能性一共有 2^n - 1中。 如上述demo数据,那么总共有3种组合。

每一种维度的组合,将度量做聚合运算,将运算结果保存为一个物化视图,称之为Cuboid。 所有维度组合的Cuboid作为一个整体,被称为Cube

1.2 kylin Web界面使用

1.2.1 构建hive数据

进入到hive

[root@node2 hive-1.2.2]# hive

在hive中创建员工表

create external table if not exists default.emp(
empno int,
ename string,
job string,
mgr int,
hiredate string, 
sal double, 
comm double,
deptno int)
row format delimited fields terminated by '\t';

创建部门表

create external table if not exists default.dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';

上传数据文件到node2

scp *.txt root@node2:~

员工数据

7369    SMITH   CLERK   7902    1980-12-17      800.00          20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.00 300.00  30
7521    WARD    SALESMAN        7698    1981-2-22       1250.00 500.00  30
7566    JONES   MANAGER 7839    1981-4-2        2975.00         20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.00 1400.00 30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.00         30
7782    CLARK   MANAGER 7839    1981-6-9        2450.00         10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.00         20
7839    KING    PRESIDENT               1981-11-17      5000.00         10
7844    TURNER  SALESMAN        7698    1981-9-8        1500.00 0.00    30
7876    ADAMS   CLERK   7788    1987-5-23       1100.00         20
7900    JAMES   CLERK   7698    1981-12-3       950.00          30
7902    FORD    ANALYST 7566    1981-12-3       3000.00         20
7934    MILLER  CLERK   7782    1982-1-23       1300.00         10

部门数据

10      ACCOUNTING      1700
20      RESEARCH        1800
30      SALES   1900
40      OPERATIONS      1700

将数据load到hive表中

load data local inpath '/root/empdata.txt' into table emp;
load data local inpath '/root/deptdata.txt' into table dept;

查询数据

1.2.2 创建project

1.2.3 加载数据

1.2.4 创建model

我这里是事先已经创建了project,需要先创建project然后在创建

这里kylin只支持创建星型模型,其他模型如星座、雪花等暂不支持。

1.2.5 创建cube

这一步骤是为增量构建 cube 而设计的。

Auto Merge Thresholds: 自动合并小的 segments 到中等甚至更大的 segment。如果不想自动合并,删除默认2个选项。

Volatile Range: 默认为0,会自动合并所有可能的 cube segments,或者用 ‘Auto Merge’ 将不会合并最新的 [Volatile Range] 天的 cube segments。

Retention Threshold: 只会保存 cube 过去几天的 segment,旧的 segment 将会自动从头部删除;0表示不启用这个功能。

Partition Start Date: cube 的开始日期。

我这里不做任何配置

Aggregation Groups: Cube 中的维度可以划分到多个聚合组中。默认 kylin 会把所有维度放在一个聚合组,当维度较多时,产生的组合数可能是巨大的,会造成 Cube 爆炸;如果你很好的了解你的查询模式,那么你可以创建多个聚合组。在每个聚合组内,使用 “Mandatory Dimensions”, “Hierarchy Dimensions” 和 “Joint Dimensions” 来进一步优化维度组合。

Mandatory Dimensions: 强制维度,现有a、b、c,3个维度,总共有7种组合,当a为Mandatory Dimensions时,那么,只有a维度或者包含a维度的组合才会被构建cubeid,即a、ab、ac、abc四种

Hierarchy Dimensions: 层级维度,例如 “国家” -> “省” -> “市” 是一个层级;不符合此层级关系的 cuboid 可以被跳过计算,例如 [“省”], [“市”]. 定义层级维度时,将父级别维度放在子维度的左边。 现有a、b、c,3个维度,总共有7种组合,当a->b>c为Hierarchy Dimensions时,即只有a、ab、abc三种组合会构建cubeid。

Joint Dimensions:联合维度,有些维度往往一起出现,或者它们的基数非常接近(有1:1映射关系),现有a、b、c,3个维度,总共有7种组合,a和b为联合维度时,只有ab、abc会被构建cubeid

1.2.5.1 Row key 优化

经常被用作where过滤的维度放在前边

主要是为了保证数据在hbase上面经过hash时,尽量保证相同维度的数据在一个region里面。而不是零碎的分布在多个region中。

基数大的维度放在基数小的维度前边

这里的基数其实就是cubeid,同时也是构成hbase上的rowkey的一部分

我这里只是做测试,所以不作配置下一步即可。

我这里什么都没有配置

然后一直下一步就创建完成了。

然后点击build,等待构建结束,可以点击最上面的monitor,查看完成情况。

我在运行这个build的时候出现了一个异常,提示我node2:10020拒绝链接,通过telnet尝试确实是关闭的,然后通过查阅,发现是需要开启历史服务器,10020是mr链接历史服务器的端口。 原文链接:www.cnblogs.com/lucas-zhao/…

执行以下命令
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver

问题解决,然后出现新的问题,提示我BulkLoad encountered an unrecoverable problem,expected /node1:8020, 因为我的hadoop cluster名字与hbase-site.xml中的hbase.rootdir名字不一样,hadoop为mycluster,hbase中为node1:8020,导致识别不了。所以解决方案是将hbase-site.xml中的映射名字改为mycluster,然后重启hbase集群,重启kylin,然后点击在actions中选择resume重新启动。

最终成功运行结束了。

1.2.6 查询数数据

kylin中查询数据

hive中查询数据

可以看到hive与kylin之间的查询速度的差距

这里还有涉及到到cube的创建原理,如hbase上的rowkey的产生原理,逐层构建算法以及快速构建算法,以后有机会再补充吧。

2.1 JDBC方式操作kylin

2.1.1 maven依赖

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

2.1.2 java 代码

package kylin;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class KylinJdbcDemo {
    public static void main(String[] args) throws Exception{
        //驱动
        String driverClassName = "org.apache.kylin.jdbc.Driver";

        //URl
        String url = "jdbc:kylin://node2:7070/test_project";

        //添加驱动信息
        Class.forName(driverClassName);

        //获取连接
        Connection connection = DriverManager.getConnection(url, "ADMIN", "KYLIN");

        //预编译
        PreparedStatement ps = connection.prepareStatement("select t.dname,sum(e.sal) from emp e join dept t on e.deptno = t.deptno group by t.dname");

        //查询
        ResultSet resultSet = ps.executeQuery();

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

    }

}

运行结果

RESEARCH	10875.0
SALES	9400.0
ACCOUNTING	8750.0

3.1 Zepplin的使用

3.1.1 Zepplin简单描述: 其实这个东西安装下来就像Anaconda里面的jupyter一样,打开就是一个能在web端进行操作的工具,能在上面根据数据进行一些图表展示。

3.1.2 zepplin 安装与启动

安装包下载
链接:https://pan.baidu.com/s/1cGLYc6ZCYOIFE0WAwBNeUQ  密码:kzz9

我这里已经上传到服务器了

tar -zxvf zeppelin-0.8.0-bin-all.tgz -C /opt/bigdata/

启动 默认端口是8080 如果和本地其他应用冲突了 可以通过修改zeppelin-site.xml.template文件去更改端口。
./bin/zeppelin-daemon.sh start

web访问 有些时候机器内存不够,可能需要等待一下,那么我这里是很快启动了。

3.1.2 zepplin的使用

可以看到,zeppelin支持了很多的组件。我们搜索kylin,右上角edit修改属性。

创建notebook

点击左边的按钮可以渲染不同的图表

那么到这里就已经都演示完毕了,有的地方可能不是那么详细,以后有机会再丰满一下。

end..