Kylin

2/18/2022 Kylin

# Kylin简介

# Kylin 定义

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

# Kylin架构

  1. REST Server

    REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。另外可以通过Restful接口实现SQL查询。

  2. 查询引擎(Query Engine)

    当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。

  3. 路由器(Routing)

    在最初设计时曾考虑过将Kylin不能执行的查询引导去Hive中继续执行,但在实践后发现Hive与Kylin的速度差异过大,导致用户无法对查询的速度有一致的期望,很可能大多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分钟,因此体验非常糟糕。最后这个路由功能在发行版中默认关闭。

  4. 元数据管理工具(Metadata)

    Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础。 Kylin的元数据存储在hbase中。

  5. 任务引擎(Cube Build Engine)

    这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及Map Reduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。

# Kylin特点

Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。

  1. 标准SQL接口:Kylin是以标准的SQL作为对外服务的接口。

  2. 支持超大数据集:Kylin对于大数据的支撑能力可能是目前所有技术中最为领先的。早在2015年eBay的生产环境中就能支持百亿记录的秒级查询,之后在移动的应用场景中又有了千亿记录秒级查询的案例。

  3. 亚秒级响应:Kylin拥有优异的查询相应速度,这点得益于预计算,很多复杂的计算,比如连接、聚合,在离线的预计算过程中就已经完成,这大大降低了查询时刻所需的计算量,提高了响应速度。

  4. 可伸缩性和高吞吐率:单节点Kylin可实现每秒70个查询,还可以搭建Kylin的集群。

  5. BI工具集成

    Kylin可以与现有的BI工具集成,具体包括如下内容。

    ODBC:与Tableau、Excel、PowerBI等工具集成

    JDBC:与Saiku、BIRT等Java工具集成

    RestAPI:与JavaScript、Web网页集成

    Kylin开发团队还贡献了Zepplin的插件,也可以使用Zepplin来访问Kylin服务

# Kylin安装

# Kylin依赖环境

安装Kylin前需先部署好Hadoop、Hive、Zookeeper、HBase,并且需要在/etc/profile中配置以下环境变量HADOOP_HOME,HIVE_HOME,HBASE_HOME,记得source使其生效。

# Kylin搭建

  1. 上传Kylin安装包apache-kylin-3.0.2-bin.tar.gz

  2. 解压apache-kylin-3.0.2-bin.tar.gz到/opt/module

    tar -zxvf apache-kylin-3.0.2-bin.tar.gz -C /opt/module/
    mv /opt/module/apache-kylin-3.0.2-bin /opt/module/kylin
    
    1
    2

# Kylin兼容性问题

修改/opt/module/kylin/bin/find-spark-dependency.sh,排除冲突的jar包

需要增加的内容:! -name '*jackson*' ! -name '*metastore*'

注意前后保留空格

# Kylin启动

  1. 启动Kylin之前,需先启动Hadoop(hdfs,yarn,jobhistoryserver)、Zookeeper、Hbase

  2. 启动Kylin

    bin/kylin.sh start
    
    1
  3. 启动之后查看各个节点进程

  4. 在http://ha01:7070/kylin查看Web页面(用户名为:ADMIN,密码为:KYLIN)

  5. 关闭Kylin

    bin/kylin.sh stop
    
    1

# Kylin使用

以gmall数据仓库中的dwd_order_detail作为事实表,dim_user_info、dim_sku_info、dim_base_province作为维度表,构建星型模型,并演示如何使用Kylin进行OLAP分析。

# 创建工程

  1. 点击下图中的"+"

  2. 填写项目名称和描述信息,并点击Submit按钮提交

# 获取数据源

  1. 点击DataSource

  2. 点击下图按钮导入Hive表

  3. 选择以下表格,并点击Sync按钮

    dwd_order_detail
    dim_sku_info
    dim_user_info
    dim_base_province
    
    1
    2
    3
    4

    注意事项

    Kylin不能处理Hive表中的复杂数据类型(Array,Map,Struct),即便复杂类型的字段并未参与到计算之中。故在加载Hive数据源时,不能直接加载带有复杂数据类型字段的表。而在dim_sku_info表中存在两个复杂数据类型的字段(平台属性和销售属性),故dim_sku_info不能直接加载,需对其进行以下处理

    1. 在hive客户端创建一个视图,如下。该视图已经将dim_sku_info表中的复杂数据类型的字段去掉,在后续的计算中,不再使用dim_sku_info,而使用dim_sku_info_view

      hive (gmall)>
      create view dim_sku_info_view
      as
      select
          id,
          price,
          sku_name,
          sku_desc,
          weight,
          is_sale,
          spu_id,
          spu_name,
          category3_id,
          category3_name,
          category2_id,
          category2_name,
          category1_id,
          category1_name,
          tm_id,
          tm_name,
          create_time
      from dim_sku_info;
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
    2. 在kylin中重新导入dim_sku_info_view视图

# 创建model

  1. 点击Models,点击"+New"按钮,点击"★New Model"按钮。

  2. 填写Model信息,点击Next

  3. 指定事实表

  1. 选择维度表,并指定事实表和维度表的关联条件,点击Ok

    ​ 维度表添加完毕之后,点击Next

  1. 指定维度字段,并点击Next

  1. 指定度量字段,并点击Next

  2. 指定事实表分区字段(仅支持时间分区),点击Save按钮,model创建完毕

# 构建cube

  1. 点击new, 并点击new cube

  2. 填写cube信息,选择cube所依赖的model,并点击next

  3. 选择所需的维度,如下图所示

  4. 选择所需度量值,如下图所示

  5. cube自动合并设置,cube需按照日期分区字段每天进行构建,每次构建的结果会保存在Hbase中的一张表内,为提高查询效率,需将每日的cube进行合并,此处可设置合并周期。

  6. Kylin高级配置(优化相关,暂时跳过)

  7. Kylin相关属性配置覆盖

  8. Cube信息总览,点击Save,Cube创建完成

  9. 构建Cube(计算),点击对应Cube的action按钮,选择build

  10. 选择要构建的时间区间,点击Submit

  11. 点击Monitor查看构建进度

# 使用进阶

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

按照上述流程,会发现,在cube构建流程中出现以下错误

错误原因分析:

上述错误原因是model中的维度表dim_user_info为拉链表、dim_sku_info(dim_sku_info_view)为每日全量表,故使用整张表作为维度表,必然会出现订单明细表中同一个user_id或者sku_id对应多条数据的问题,针对上述问题,有以下解决方案。

在hive客户端为拉链表以及每日全量维度表创建视图,在创建视图时对数据加以过滤,保证从视图中查出的数据是一份全量最新的数据即可。

  1. 创建维度表视图

    --拉链维度表视图
    create view dim_user_info_view as select * from dim_user_info where dt='9999-99-99';
    
    --全量维度表视图(注意排除复杂数据类型字段)
    create view dim_sku_info_view
    as
    select
        id,
        price,
        sku_name,
        sku_desc,
        weight,
        is_sale,
        spu_id,
        spu_name,
        category3_id,
        category3_name,
        category2_id,
        category2_name,
        category1_id,
        category1_name,
        tm_id,
        tm_name,
        create_time
    from dim_sku_info
    where dt=date_add(current_date,-1);
    
    --当前情形我们先创建一个2020-06-15的视图,由于之前已经创建了dim_sku_info_view,故无需重新创建,修改之前的视图即可。
    alter view dim_sku_info_view
    as
    select
        id,
        price,
        sku_name,
        sku_desc,
        weight,
        is_sale,
        spu_id,
        spu_name,
        category3_id,
        category3_name,
        category2_id,
        category2_name,
        category1_id,
        category1_name,
        tm_id,
        tm_name,
        create_time
    from dim_sku_info
    where dt='2020-06-15';
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
  2. 在DataSource中导入新创建的视图,之前的维度表,可选择性删除

  3. 重新创建model、cube。

如何实现每日自动构建cube

Kylin提供了Restful API,因次我们可以将构建cube的命令写到脚本中,将脚本交给azkaban或者oozie这样的调度工具,以实现定时调度的功能。

脚本如下:

#!/bin/bash
cube_name=order_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://ha01:7070/kylin/api/cubes/$cube_name/build
1
2
3
4
5
6
7
8
9
10
11
12
Last Updated: 2/19/2022, 10:04:43 PM