中国人的kylin

kylin的认识

一、cubo和cudoid

1.维度和度量

  • 数据分析领域中两个常用的概念。

  • 维度

    • 观察数据的角度,也就是数据记录的一个属性。

  • 度量

    • 基于数据所计算出来的考量值,通常是一个数据,例如销售额、不同的用户数量。

  • 我们就是从不同的维度来审查度量值,以便我们分析找出其中的变化规律。

  • 对于我们的SQL查询,group by的属性通常就是我们考量的维度,所计算出来的比如sum、min、max更字段就是我们需要的度量。

  • 示例讲解

    • Id  year   market  category  item    sales
      1 2010 商场1   家电类 电脑 100
      2 2010 商场1   家电类 冰箱 200
      3 2010 商场1 家电类 洗衣机 300
      4 2010 商场1 日用品类 厨具四件套 50
      5 2010 商场1   日用品类 锅碗瓢盆 33
      6 2010 商场1 日用品类 洗洁精 11
      7 2010 商场1 蔬果类 西瓜       5
      8 2010 商场1 蔬果类 苹果   6
      9 2010 商场1 蔬果类 梨       4
      10 2010 商场1 肉类 牛肉   10
      11 2010 商场1 肉类 猪肉    9
      12 2010 商场1 肉类 羊肉    8
    • SQL分析

      • select year, market , category ,SUM(sales) as sumsales from test group by category;

      • 结果

        • 2010    商场1   家电类   600
          2010 商场1 日用品类 94
          2010 商场1 肉类 27
          2010 商场1 蔬果类 15
    • 商品类别就是维度,sum(sales)就是度量,也就是我们从商品类别的角度来看,各种商品类别的销售额分别是多少。

  • 当然我们也可以进行多维度查询。

2.cubo和cuboid

  • cubo:

    • 确定好维度和度量之后,就可以根据他们构建cubo(立方体),也就是所谓的预计算,对原始数据建立的多位索引。

    • 给定一个数据模型,我们可以对其上的所有维度进行组合,对于N个维度来说,组合的所有可能性共有2的N次方种。

  • cuboid

    • 对于上面说的每一种维度组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为cuboid。

    • 所有的维度组合的cuboid作为一个整体,被称为cubo。

  • 简单来说,一个cubo就是许多按维度聚合的物化视图的集合。

  • 示例

    • 假定有一个电商的销售数据集,其中维度包括时间(Time)、商品(Item)、地点(Location)和供应商(Supplier), 度量为销售额(GMV)。那么所有维度的组合就有2^4 =16种(如图1-3所 示),比如一维度(1D)的组合有[Time]、[Item]、[Location]、[Supplier]4种; 二维度(2D)的组合有[Time,Item]、[Time,Location]、[Time、Supplier]、 [Item,Location]、[Item,Supplier]、[Location,Supplier]6种;三维度(3D)的 组合也有4种;最后零维度(0D)和四维度(4D)的组合各有1种,总共就有 16种组合。

  • cubo Segment

    • 元数据中的某一个片段计算出的cubo数据,通常数仓中的数据量会随着时间的增长而增长,而cubo Segment也是按照时间顺序来构建的。

二、事实表和维度表

1.事实表和维度表

  • 事实表是指存储有事实记录的表,如系统日志、销售记录等;事实表的记录在不断地动态增长,所以它的体积通常远远大于其他表。

  • 维度表或者维表,有时也称查找表,与事实表相对应,它保持了维度的属性值,可以跟事实表做关联;也就是将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。

  • 使用维度表的好处

    • 缩小了事实表的大小

    • 便于维度的管理和维护,正价、删除和修改维度的属性,不必对事实表的大量记录进行改动。

    • 维度表可以为多个事实表重用,以减少重复工作。

2.多维数据模型

  • 星型模型

    • 一张事实表,以及零个或多个维度表;

    • 事实表与维度表通过主键外键相关联,维度表之间没有关联。

  • 雪花模型

    • 将星型模型中的某些维度表抽取成更细粒度的维度表,然后让维度表之间也进行关联。

  • 区别

    • 星型模型以为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花模型要高

    • 星型结构不需要考虑很多正规化的因素,设计比较简单

    • 雪花模型去除了冗余数据,有些统计表需要通过表的联接才能产生,故效率不一定有星型模型高。

    • 正规化也是一种比较复杂的过程,相应的数据库结构设计、数据的ETL、以及后期的维护都要复杂一些。因此在冗余可以接受的前提下,实际运用中星型模型使用的更多,也更有效率。

三、kylin的简介

1.kylin的由来

  • Apache Kylin是一个开源的分布式分析引擎,为hadoop等大象分布式数据平台之上的超大规模数据集通过标准SQL查询及多位(OLAP)功能提供亚秒级的交互式分析能力。

  • Kylin租出由eBay开发至开眼社区,能狗仔亚秒级查询巨大的hive表,并支持高并发。

2、为什么使用Kylin

  • 企业中大数据查询分为两种:即席查询和定制查询。

    • hive、sparksql等OLAP引擎,随然在很大程度上降低了数据分析的难度,但是他们只适用于即席查询场景。优点:

      • 查询灵活,但是随着数据量和计算复杂度的增长,响应时间不能得到保证。

    • 定追查询:多数情况下四队用户的操作坐车实时反映,hive等查询引擎很难满足实时查询,一般只能对数据库中的数据进行提前计算,然后将结果存入MySQL等关系型数据库,最后提供给用户进行查询。

  • Apache Kylin采用“预计算”的模式,用户只需要提前定义好查询维度,kylin将帮助我们进行计算,并将结果存储到hbase中,为海量数据的查询和分析提供亚秒级返回,是一种典型的空间换时间的解决方案。

  • kylin不仅很好的解决了海量数据快速查询的问题,也避免了手动开发和维护提前计算程序带来的一系列麻烦。

3kylin的工作原理

  • 指定数据模型,定义维度和度量

  • 预结算cubo,计算所有cuboid并保存为物化视图。

  • 执行查询时,读取cuboid,运算,产生查询结果。

  • kylin的查询过程不会扫描原始记录,而是通过预计算预先完成表的关联、聚合更复杂运算,并利用预计算的结果来执行查询,因此相比非预计算的查询技术,速度一般要快一到两个数量级,这点在超大的数据集上有时更明显。

  • 总结

    • kylin的核心思想是cubo预计算,理论基础是空间换时间,把高度复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询。

 

四、kylin的技术架构

  • 图解

  • kylin架构图讲解

    • 主要分为在线查询和离线构建两个部分,橙色线代表在线,灰色线代表离线。

    • 提供一个标准的SQL接口用户可以从上方查询系统发送SQL进行查询分析。Kylin提供了各种Rest API、JDBC/ODBC接口。无论从哪个接口进入,SQL最终都会来到Rest服务层,再转交给查询引擎进行处理。这里需要注意的是,SQL语句是基于数据源的关系模型书写的,而不是cube。

      Kylin在设计时刻意对查询用户屏蔽了cube的概念,分析师只需要理解简单的关系模型就可以使用Kylin,没有额外的学习门槛,传统的SQL应用也很容易迁移。查询引擎解析SQL,生成基于关系表的逻辑执行计划,然后将其转译为基于cube的物理执行计划,最后查询预计算生成的cube并产生结果。整个过程不会访问原始数据源。

    • 架构图左侧为数据来源,消息队列、hive等拿到数据之后,通过kylin处理,将hbase作为存储介质,满足一定的实时性要求(Hbase中的每行记录的Rowkey由dimension组成,measure会保存在column family中。为了减小存储代价,这里会对dimension和measure进行编码。查询阶段,利用HBase列存储的特性就可以保证Kylin有良好的快速响应和高并发。Kylin在中间作为媒介,提供rest api使用以及jdbc接口供BI软件做报表的支撑(拓展软件:tableau,superset)。

  • 总结

    • kylin在数据集规模上的局限性主要取决于维度的个数和基数。

    • 因为预计算使得kylin的查询速度非常快,亚秒级响应。

  • 实例讲解

    • 两个维度,共有四种维度组合

    • 图右边讲解

      • 00000001+0

        • 只有第二个维度,0是该维度取的哪一个城市 代表含义是:北京的price是80 ;

      • 00000010+0

        • 只有第一个维度,0是该维度取的哪一年 代表含义是:93年的price是40;

      • 00000011+10

        • 有两个维度,0和1是该维度取的哪一年,哪一个城市 代表含义是:94年北京price是40;

      • 总结

        • 红色代表拥有几个维度,“+”后面代表取该维度下哪一个字段;

 

四、Kylin的安装

前提是安装好kylin所依赖的hadoop、hive、hbase、zookeeper。

  • 上传tar包并解压

  • 替换hbase为版本1以上

    • /etc/profile文件的环境变量:

      • HBASE_HOME:改成1.3.5版本的地址

    • 修改环境变量后,重新连接xshell,不要使用source /etc/profile命令

    • $HBASE_HOME/conf/hbase-env.sh

      • 注释:

        • export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"

        • export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"

    • 将hdfs上面的/hbase目录删除掉

      • hdfs dfs rmr /hbase

    • 将zookeeper上的/hbase节点删除掉

      • 进入zookeeper

        • zCli.sh

          • rmr /hbase

  • 配置kylin相关变量

    • vim /etc/profile

      • export HIVE_HOME=/opt/sxt/hive-1.2.1
        export HBASE_HOME=/opt/sxt/hbase-1.3.5
        export HIVE_CONF_HOME=$HIVE_HOME/conf
        export HCAT_HOME=$HIVE_HOME/hcatalog
        export HADOOP_CONF_DIR=/opt/sxt/hadoop-2.6.5/etc/hadoop
        export PATH=$HCAT_HOME/bin:$PATH
        export KYLIN_HOME=/opt/sxt/kylin
        export PATH=$HIVE_HOME/bin:$PATH
        export PATH=$KYLIN_HOME/bin:$PATH
      • 注意:增加配置中没有的路径即可

    • 加载配置文件

      • source /etc/profile

  • Kylin 会自动从环境中读取 Hadoop 配置(core-site.xml),Hive 配置(hive-site.xml)和 HBase 配置(hbase-site.xml)

  • 修改kylin.properties配置文件(单节点时这一步可以忽略掉

    • 如果是集群多台节点配置的话,只能是有一台是job/all,其他台是query模式。

  • kylin启动

    • 使用kylin的前提是,kylin要有操作所有东西的权限,什么意思,hdfs读写权限,hive创建表权限,各种权限。

    • 启动步骤

      • 启动zookeeper

      • 启动hadoop

      • 启动历史日志

        • mr-jobhistory-daemon.sh start historyserver

        • 历史日志配置

          • mapred-site.xml

            • <property>
               <name>mapreduce.jobhistory.address</name>
               <value>node03:10020</value>
              </property>

              <property>
                 <name>mapreduce.jobhistory.webapp.address</name>
                 <value>node03:19888</value>
              </property>
              <property>
                 <name>mapreduce.jobhistory.done-dir</name>
                 <value>/history/done</value>
              </property>
                  <!---  正在运行的任务信息临时目录 -->
              <property>
                 <name>mapreudce.jobhistory.intermediate.done-dir</name>
                 <value>/history/done/done_intermediate</value>
              </property>
          • yarn-siite.xml

            • <!---开启日志聚合 -->
              <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
              </property>
      • 启动hbase

      • 启动hive

        • service mysqld start

    • 启动kylin

      • 进入bin目录下执行 kylin.sh start

  • 访问

    • node01:7070/kylin

    • 账户:ADMIN

    • 密码:KYLIN

五、kylin的使用

建立project->建立model->建立cube->build。

1.创建kylin步骤

  • 进入hive中

    • 创建库

      • create database if not exists sxt_kylin;

    • 使用库

      • use sxt_kylin;

    • 创建表

      • create table kylin_sale(
        id int,
        day date,
        market string,
        category string,
        item string,
        number int,
        sales int
        )
        row format delimited fields terminated by ','
        lines terminated by '\n';
    • 源数据

      • 1,2019-08-08,商场1,家电类,电脑,2,9000
        2,2019-08-08,商场1,家电类,冰箱,3,3000
        3,2019-08-08,商场1,家电类,洗衣机,6,3000
        4,2019-08-08,商场1,日用品类,厨具四件套,10,500
        5,2019-08-08,商场1,日用品类,锅碗瓢盆,5,200
        6,2019-08-08,商场1,日用品类,洗洁精,8,240
        7,2019-08-08,商场2,家电类,电脑,7,35000
        8,2019-08-08,商场2,家电类,冰箱,4,4000
        9,2019-08-08,商场2,家电类,洗衣机,5,5000
        10,2019-08-08,商场2,日用品类,厨具四件套,8,500
        11,2019-08-08,商场2,日用品类,锅碗瓢盆,9,360
        12,2019-08-08,商场2,日用品类,洗洁精,10,900
        13,2019-08-09,商场1,家电类,电脑,3,15000
        14,2019-08-09,商场1,家电类,冰箱,4,3000
        15,2019-08-09,商场1,家电类,洗衣机,5,3000
        16,2019-08-09,商场1,日用品类,厨具四件套,6,500
        17,2019-08-09,商场1,日用品类,锅碗瓢盆,7,350
        18,2019-08-09,商场1,日用品类,洗洁精,8,240
        19,2019-08-09,商场2,家电类,电脑,9,35000
        20,2019-08-09,商场2,家电类,冰箱,5,3000
        21,2019-08-09,商场2,家电类,洗衣机,8,5000
        22,2019-08-09,商场2,日用品类,厨具四件套,3,300
        23,2019-08-09,商场2,日用品类,锅碗瓢盆,8,320
        24,2019-08-09,商场2,日用品类,洗洁精,9,900
    • 上传源数据至/root目录下

    • hive表中加载数据

      • load data local inpath '/root/kylin_sale' overwrite into table kylin_sale;
  • 进入kylin页面

    • 创建project

    • 将hive表中的事实表数据导入kylin

    • 选择要加载的实例库的表并同步数据(点击sync)

    • 创建模型model

    • 起名并next

    • 进入到选择维度字段页面

    • 点击next进入到measure(度量)页面

    • 进入到设置页面

      • 我们可以选择分区字段,选择格式化时间方式, 下面的filter可以添加where条件对数据源中的数据做过滤,最后点击save保存,既model创建成功。

    • 创建cubo

      • 指明要创建的cube在哪个model下,并且对cube进行命名。

    • 对本次cube添加计算的维度

    • 指定要进行计算的度量指标

      • 显示结果图

    • 保存cubo

2.kylin查询API

  • RestFul API

    • 目前kylin使用basic Authentication简单的访问控制机制。

    • 查询SQL

      • curl -X POST -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json' http://localhost:7070/kylin/api/query  -d '{
        "sql":"select market,sum(sales) from kylin_sale group by market",
        "offset":0,
        "limit":10,
        "acceptPartial":false,
        "project":"my_project"
        }'
      • 参数解释

        • SQL:字符串类型,请求sql

        • offset:可选,整型,查询默认从第一行返回结果,可以设置该参数以决定返回数据从哪一行开始往后返回。

        • limit:可选, 整型,加上limit参数后会从offset开始返回对应的行数,返回数据行数小于limit的将以实际行数为准。

        • acceptartial:可选,布尔型,默认是“true”,表示实际最多会返回一百万行数据;若返回结果集超过了一百万行,那么改参数需要设置为“false”。

        • project:可选,字符串类型,默认为“DEFAUIT”,在实际使用时,如果UI应查询的项目不是“DEFAUIT”,那就需要设置为自己的项目。

    • put提交cube

      • curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json' http://localhost:7070/kylin/api/ cubes/my_cube/build  -d '{
          "startTime":0,
        "endTime":”$endTime”,
        "buildType":"BUILD"
        }'
      • 参数解释

        • startTime:上一次build的endTime,精确到毫秒。

        • buildType:可选BUILD,MERGE,REDRESH。

  • JDBC连接方式

    • package com.shsxt.kylin;

      import java.io.IOException;
      import java.sql.Connection;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      import java.util.Properties;
      import org.apache.kylin.jdbc.Driver;

      public class KylinJdbc {
      public void connentJdbc()
      throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
      Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance();
      Properties info = new Properties();
      info.put("user", "ADMIN");
      info.put("password", "KYLIN");
      Connection conn = driver.connect("jdbc:kylin://*.*.*.*:7070/learn_kylin", info);
      Statement state = conn.createStatement();
      ResultSet resultSet = state.executeQuery("select * from kylin_account limit 1000");
      while (resultSet.next()) {
      String i = resultSet.getString(3);
      System.out.println(i);
      }
      }

      public static void main(String[] args)
      throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
      KylinJdbc ky = new KylinJdbc();
      ky.connentJdbc();
      }
      }

      一、增量cube

      • segment

        • cube划分为多个segment。

        • 每个segment用起始时间和结束时间来标志。

        • segment代表一段时间内源数据的预计算结果

        • 大部分情况下segment的起始时间等于它之前那个segment的结束时间。

        • 同一个cube中segment除了背后的源数据不同之外,其他的如结构定义、构建方法、优化方法、存储方式等都完全相同。

      • 全量构建

        • 增量构建的一种特例。

        • cube中只存在唯一的一个segment,没有分割时间的概念。

        • 每次更新cube数据时,在构建时会导入并处理所有的原始数据。

      • 增量构建

        • 只会导入新segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算。

      • 设计增量构建的前提:

        • cube的定义必须需包含一个时间维度,用来分割不同的segment,被称呼为分割时间列。

        • 分割时间列既可以是hive中的date类型,也可以是timestamp类型或者string类型。

        • 无论是哪种类型,Kylin都要求用户显式地指定分割时间列的 数据格式,例如精确到年月日的Date类型(或者String类型)的数据格式可能是yyyyMMdd或yyyy-MM-dd,如果是精确到时分秒的Timestamp类型(或者String类型),那么数据格式可能是YYYY-MM-DD HH:MM:SS。

      • 触发增量构建

        • 在Web GUI的Model页面中,选中想要增量构建的Cube,单击 Action→Build。

        • 增量构建的Cube会在此时弹出对话框让用户选 择“End Date。

      • 自动合并

        • 在Cube Designer的“Refresh Settings”的页面中 有“Auto Merge Thresholds”和“Retention Threshold”两个设置项可以用来帮 助管理Segment碎片。

        • “Auto Merge Thresholds”允许用户设置几个层级的时间阈值,层级越 靠后,时间阈值就越大。举例来说,用户可以为一个Cube指定(7天、28天) 这样的层级。每当Cube中有新的Segment状态变为READY的时候,就会触发一次系统试图自动合并的尝试。系统首先会尝试最大一级的时间阈 值,结合上面的(7天、28天)层级的例子,首先查看是否能将连续的若干 个Segment合并成为一个超过28天的大Segment,在挑选连续Segment的过 程中,如果遇到已经有个别Segment的时间长度本身已经超过了28天,那 么系统会跳过该Segment,从它之后的所有Segment中挑选连续的累积超 过28天的Segment。如果满足条件的连续Segment还不能够累积超过28天,那么系统会使用下一个层级的时间阈值重复寻找的过程。每当找到了能 够满足条件的连续Segment,系统就会触发一次自动合并Segment的构建 任务,在构建任务完成之后,新的Segment被设置为READY状态,自动合并的整套尝试又需要重新再来一遍。

        • 示例

          • 举例来说,如果现在有A~H8个连续的Segment,它们的时间长度分别 为28天(A)、7天(B)、1天(C)、1天(D)、1天(E)、1天(F)、1天(G)、1天 (H)。此时第9个Segment I加入,它的时间长度为1天,那么现在Cube中总 共存在9个Segment。系统首先尝试能否将连续的Segment合并到28天这个 阈值上,由于Segment A已经超过28天,它会被排除。接下来的B到H加起 来也不足28天,因此第一级的时间阈值无法满足,退一步系统尝试第二 级的时间阈值,也就是7天。系统重新扫描所有的Segment,发现A和B已经 超过7天,因此跳过它们,接下来发现将Segment C到I合并起来可以达到7 天的阈值,因此系统会提交一个合并Segment的构建请求,将Segment C到I 合并为一个新的Segment X。X的构建完成之后,Cube中只剩下三个 Segment,分别是原来的A(28天),B(7天)和新的X(7天)。由于X的加入,触发了系统重新开始整个合并尝试,但是发现已经没有满足自动合并的 条件,既没有连续的、满足条件的、累积超过28天的Segment,也没有连续 的、满足条件的、累积超过7天的Segment,尝试终止。

      • 保留segment

        • 自动合并是将多个segment合并为一个segment,以达到清理碎片的目的

        • 保留segment则是从另一个角度帮助实现碎片管理,那就是及时清理不再使用的segment。

      • 数据持续更新

        • 不以日为单位创建新的Segment, 而是以N天为单位创建新的Segment。

      二、cuboid以及cube优化

      为什么做优化?

      • build出来的cube size很大,从而占用大量的磁盘空间。

      • cube building的时间会很长。

      • 会占用集群的计算资源。

      1.cube的剪枝优化

      • 聚合组

        • Kylin在定义Cube时候,可以将维度拆分成多个聚合组(Aggregation Groups)这也就是我们在web页面创建cube时的第5步可以做,只在组内计算Cube,聚合组内查询效率高,跨组查询效率较差,所以需要根据业务场景,将常用的维度组合定义到一个聚合组中,提高查询性能,这也是Kylin中查询性能优化的一个重要方面。

        • kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader CubeName。

      • 强制维度

        • 一个维度被定义为强制维度,那么这个分组产生的所有cuboid中的每一个cuboid都会包含该维度。

      • 层次维度

        • 具有上下级层次关系的维度,例如年-->月-->日.

        • 实例:如果有三个维度A,B,C 设置为层次维度,那么Cuboid数量将由2^3减为3+1(ABC、AB、A、空)。

      • 联合维度

        • 每个联合中包含两个或者更多个维度,,那么在该分组产生的任何cuboid中,这些维度要么一起出现,要么都不出现。

        • 实例:如有 A B C D 四个维度, B C维度作为联合维度,则最后只要生成7个维度,如下图所示:其中红色维度为无需生成的维度,黑色维度为需要生成的维度。

      • 衍生维度

        • 当用户需要以更高的粒度(比如按周、 按月)来聚合时,如果在查询时获取按日聚合的Cuboid数据,并在查询引擎中实时地进行上卷操作,那么就达到了使用牺牲一部分运行时性能来节省Cube空间占用的目的。

          Kylin将这样的理念包装成为了一个简单的优化工具——衍生维度。

          衍生维度用于在有效维度内将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们。Kylin会在底层记录维度表主键与维度表其他维度之间的映射关系,以便在查询时能够动 态地将维度表的主键“翻译”成这些非主键维度,并进行实时聚合。

        • 实例:假设有一个日期查找表,其中的cal_dt是主键列,还有许多派生列,例如week_begin_dt,month_begin_dt。即使分析人员需要week_begin_dt作为维度,我们也可以对其进行修剪,因为它始终可以从cal_dt维度进行计算,这是“派生”优化。

      2.RowKey编码优化

      • 编码代表了该维度的值应使用何种方式进行编码,合适的编码能够减少维度对空间的占用。

      • 目前Kylin支持的编码方式有:

        • date编码:将日期类型的数据使用三个字节进行编码。

        • time编码:仅支持表示从1970-01-01 00:00:00到2038-01-19 03:14:07的时间,仅仅支持到秒,每个维度仅仅使用4个字节。

        • Integer编码:需要提供一个额外的参数“length”来代表需要多少个字节,length的长度为1~8。

        • dict编码:产生的编码非常紧凑,尤其在维度值得基数较小且长度较大的情况下,特别节约空间;但是在维度的基数大、长度也大的情况下,容易造成构建引擎或查询引擎的内存溢出。

        • Fixed_length编码:编码需要提供一个额外的参数“Length”来代表需 要多少个字节。该编码可以看作Dict编码的一种补充。对于基数大、长度 也大的维度来说,使用Dict可能不能正常工作,于是可以采用一段固定长度的字节来存储代表维度值的字节数组,该数组为字符串形式的维度值的UTF-8字节。如果维度值的长度大于预设的Length,那么超出的部分将会被截断。

        • Fixed_Length_Hex编码:适用于字段值为十六进制字符,比如1A2BFF或者FF00FF,每两个字符需要一个字节。只适用于varchar或nvarchar类型。

      三、kafka与kylin整合

      1.安装kafka

      • 准备

        • 基于hadoop环境上

        • 需要kylin1.6及以上版本

        • 需要kafka1.0.0及以上版本

      • 安装kafka

        • 上传jar包并解压

        • 配置kafka_home

      • 测试topic

        • bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic kylin_streaming_topic

      • 模拟产生数据

        • kylin.sh org.apache.kylin.source.kafka.util.KafkaSampleProducer --topic kylin_streaming_topic --broker localhost:9092

      • 消费数据验证

        • bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic kylin_streaming_topic --from-beginning

      2.web页面应用

      • 登录kylinweb页面

      • 创建工程

      • 创建model

        • 点击“Model” -> “Data Source”,然后随机选一条已有的消息,填入框中点击»”,kafka会解析json格式,列出所有的属性,这时候只需要填写表名

        • 点击next后,填写kafka集群的消息

          • “Parser Setting”中的内容,特别强调一下,kylin默认识别的格式是json,那么针对时间识别的格式是bigint (epoch time)。如果不是这种类型,而是例如“Jul 20, 2016 9:59:17 AM”这种时间字符串,这时候需要指定时间格式,操作方法如下:

        • 点击submit

      • 构建cube

        • 和普通cube大体相同

        • 注意点

          • cube的维度中必须有一个分区时间列。Streaming OLAP中,时间往往是一个查询条件,kylin强制使用这点来缩小分区查询范围。

          • 不要用“order_time”为维度,很细;建议使用“mintue_start”、“hour_start”或其他,取决于你如何将检查数据。

          • 定义“year_start”、“quarter_start”、“month_start”、“day_start”、“hour_start”、“minute_start”作为一个层次来降低组合计算。

          • 在“refersh setting”步,创建更多的类合并范围:0.5小时,1小时,4天,7天,这对控制立方体的segment是有帮助的。

          • 在“rowkeys”部分,拖放“minute_start”头部位置,作为流媒体查询时的状态总是出现;把它的头将有助于缩小扫描范围。

      • 触发cube,两种触发方式

      • cube构建完后

      • 查询数据

        • select minute_start, count(*), sum(amount), sum(qty) from streaming_sales_table group by minute_start order by minute_start

      • 脚本连续触发

        • 当任务触发执行一次后,kylin会记录自己的消费偏移,以供下次触发使用。每次kylin构建的时候都会从上次的偏移消费到kafka消息的最新偏移。

          如果每次触发都需要人为去触发这显然不现实,,此时我们可以使用crontab脚本来自定义实现一个定时触发消费kafka数据,构建cube的服务,避免人工频繁触发。

        • crontab -e
          * * * * * curl -X PUT --user ADMIN:KYLIN -H "Content-Type: application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0, "sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}' http://localhost:7070/kylin/api/cubes/{your_cube_name}/build2

      四、优化和错误避免

      • 避免缺包

        • 在环境变量中配置: export KAFKA_HOME=/opt/sxt/kafka_2.11-1.0.2

      • 跳过历史消费最新构建cube

      • cube构建的gap(断裂,两次构建中间缺少的偏移)

        • 如果一些 build job 出错了并且您将其 discard,Cube 中就会留有一个洞(或称为空隙)。每一次 Kylin 都会从最后的offset位置 build。

        • 查看裂缝

        • 查询结果是一个空的数组,则说明没有漏洞。否则,触发kylin填补

posted @ 2020-01-02 16:22  数据阮小白  阅读(568)  评论(0编辑  收藏  举报