Apache Kylin(三)Kylin上手
Kylin 上手
根据Kylin 官方给出的测试数据,我们实际操作一下 Kylin。
1. 导入 Hive 数据
首先创建一个project,在界面左上角有个“Add Project” 按钮,这里我们创建的Project名为tuto。
进入Model 界面,从 Hive 中导入两张表:kylin_sales和 kylin_cal_dt
导入完成后可以在左边看到表的定义:

同时 Kylin 会在后台触发一个 MapReduce 任务,计算此表中每个列的基数。一般在隔几分钟后再刷新页面,就可以看到基数信息,如:

需要注意的是,这里 Kylin 对基数采用的是HyperLogLog的近似算法,与精确值略有误差。例如对TRANS_ID 的基数估计为 10491,而若是我们在Hive 中获取 TRANS_ID 的distinct count:
select count(distinct trans_id) from kylin_sales;
> 10000
可以看到计算的结果与kylin计算出的基数稍有误差,不过一般这种近似值作为参考值是足够的。
2. 创建数据模型
2.1. 选择事实表与维度表
数据模型(Data Model)是Cube 的基础,主要根据分析需求进行设计。有了数据模型后,定义Cube的时候就可以直接从此模型定义的表和列中进行选择了,省去了重复指定连接(JOIN)条件的步骤。基于一个数据模型可以创建多个Cube,方便减少用户的重复性工作。
在 Kylin web 界面的 Model 页面,创建一个新Model(也就是数据模型)。必须选择一个事实表,以及(可选)添加一个维度表。

这里snapshot是指是否将维度表以快照(snapshot)的形式存储到内存中以供查询。当维度表小于300MB时,推荐启用维度表以快照形式存储,以简化Cube计算和提高系统整体效率。当维度表超过 300MB 时,则建议关闭维度表快照,以提升Cube构建的稳定性与查询的性能。
对于join key,也支持多组key。
2.2. 选择维度和度量
选择维度和度量的列,这里只是选择一个范围,并不代表这些列将来一定要用作 Cube 的维度或度量。可以把所有可能会用到的列都选进来,后续创建 Cube 的时候,将只能从这些列中进行选择。
选择维度列时,维度可以来自事实表或维度表,例如:

选择度量时,度量只能来自事实表或不加载进内存的维度表,如:

最后一步,是为模型补充分割时间列信息和过滤条件。如果此模型中的事实表记录是按时间增长的,那么可以指定一个日期/时间列作为模型的分割时间列,从而可以让Cube按此列做增量构建。
过滤(Filter)条件是指,如果想把一些记录忽略掉,那么这里可以设置一个过滤条件。Apache Kylin 在向 Hive 请求源数据的时候,会带上此过滤条件,如下所示,会只保留price 大于 0 的记录:

点击 Save 后,即可保存此 Model。
3. 创建 Cube
3.1. Cube Info
从左上角创建按钮新创建一个 Cube,并选择之前创建的Model:

3.2. Dimensions
然后添加Cube的维度:


3.3. Measures
接着是添加度量,Kylin支持的度量有SUM、MIN、MAX、COUNT、COUNT_DISTINCT、TOP_N、EXTENDED_COLUMN、PERCENTILE等。默认会创建一个Count(1) 度量。
可以通过Bulk Add Measure 按钮批量添加度量。目前对于批量添加度量,Kylin仅支持SUM、MIN、MAX等简单函数。只需要选择度量类型,然后再选择需要计算的列即可:

如果需要添加复杂度量,点击“+Measure”按钮添加即可,如:

添加完后的结果为:

3.4. Refresh Setting
接下来是关于Cube数据刷新的设置,这里可以设置自动合并的阈值、自动合并触发时保留的阈值、数据保留的最小时间、以及第一个Segment的起点时间(如果Cube有分割时间列):

3.5. Advanced Setting
在此页面可以设置维度聚合组和Rowkey属性。
默认Kylin会把所有维度放在同一个聚合组(Aggregation Group,也称维度组)中,如果维度数较多(如 > 15),建议用户根据查询的习惯和模式,点击New Aggregation Group+ 命令,将维度分布到多个聚合组中。通过使用多个聚合组,可以大大降低Cube中Cuboid数量。
举个例子,一个Cube有(M+N)个维度,如果把这些维度都放置在一个组里,那么默认会有2(M+N) 个Cuboid;如果把这些维度分为两个不相交的聚合组,第一个组有M个维度,第二个组有N个维度,那么Cuboid的总数量将减少至2M + 2N ,会极大减少Cuboid的数量。
在单个聚合组中,可以对维度设置一些高级属性,如Mandatory Dimensions、Hierarchy Dimensions、Joint Dimensions 等。这几种属性都是为了优化Cube的计算而设计:
- Mandatory Dimensions(强制维度):指的是那些总是会出现在Where条件或Group By 语句里的维度。在指定某个维度为Mandatory Dimensions 后,Kylin可以不予计算那些不包含此维度的Cuboid,从而减少计算量
- Hierarchy Dimensions(层级维度):指一组有层级关系的维度,如“国家”、“省”、“市”。这里“国家“是最高级别的维度,”省“、”市“依次是次要级别。用户为按高级别维度进行查询,也会按低级别维度进行查询。但当查询低级别维度时,往往会带上高级别维度的条件,而不会孤立地查询低维度的数据。例如,用户会使用”国家“作为条件进行查询,也会使用”国家“+”省“+”市“的条件进行查询。通过指定层级维度,Kylin可以略过不满足此模式的Cuboid
- Joint Dimensions(联合维度):将多个维度视作为一个维度,在进行组合计算的时候,它们要们一起出现,要们均不出现。通常适用于以下几种情况:
- 总是一起查询的维度
- 彼此之间有一定映射关系,如USER_ID 和 EMAIL
- 基数很低的维度,如性别、布尔类型的属性
在此步骤中,web 界面里自动选择了要添加的维度到此聚合组中。然后用户可以根据模型特征和查询模式,设置高级维度属性。Hierarchy Dimension 和 Joint Dimension 可以设置多组,但是要主要的是,一个维度出现在某个属性中后,将不能再设置为另一种属性。但是一个维度是可以同时出现在多个聚合组中的。
添加完后的聚合组为:

Kylin中,会将Cube的构建结果以Key-Value的形式存储到HBase中。而HBase是单行键索引,所以在存储时,但是Kylin又需要按照多个维度来对度量进行检索。所以在存储到HBase中时,Kylin会将多个维度拼接组成Rowkey。在HBase中的存储结构如下:

可以看到Dimensions 是rowkey,Metrics是value。由于同一维度中的数值长短不一,如国家名,短的如“中国”,长的如“巴布亚新几内亚”,因此将多个不同列的值进行拼接的时候,要么添加分隔符,要么通过某种编码使各个列所占的宽固定。Kylin为了能够在HBase上高效地进行存储和检索,会使用第二种方式对维度值进行编码。维度编码的优势有:
- 压缩信息存储空间;
- 提高扫描效率,减少解析开销。
对于各个维度在rowkey中的顺序,也会对查询的性能产生比较明显的影响。在这里用户可以根据查询的模式和习惯,通过拖拽的方式调整各个维度在Rowkey上的顺序:

一般原则是:将过滤频率高的列放置在过滤频率低的列之前,将基数高的列放在基数低的列之前。这样做的好处是:充分利用过滤条件来缩小在HBase中扫描的范围,从而提高查询的效率。
在构建Cube时,可以通过维度组合白名单(Mandatory Cuboids)确保想要构建的Cuboid能被成功构建:

Kylin支持对于复杂的COUNT DISTINCT度量进行字典构建,以保证查询性能。目前提供两种字典格式:Global Dictionary 和 Segment Dictionary。如下所示:

其中,Global Dictionary 可以将一个非Integer的值转为Integer值,以便bitmap进行去重,如果要计算的COUNT DISTINCT的列本身已经是Integer类型,那就不需要定义Global Dictionary。并且Global Dictionary会被所有segment共享,因此支持跨segments做上卷去重操作。
而Segment Dictionary 虽然也是用于精确计算COUNT DISTINCT 的字典,但与Global Dictionary不同的是,它是基于一个segment的值构建的,因此不支持跨segments的汇总计算。如果你的cube 不是分区的,或者能保证你的所有SQL按照partition column 进行group by,那么最好使用Segment Dictionary 而不是 Global Dictionary,这样可以避免单个字典过大的问题。
Kylin 目前支持两种构建Cube 的引擎:Mapreduce 和 Spark。如果你的Cube只有简单度量(如SUM、MIN、MAX),建议使用Spark。如果Cube中有复杂类型度量(如COUNT DISTINCT、TOP_N),建议使用MapReduce。
为了提升构建性能,可以在Advanced Snapshot Table中将维度表设置为全局维度表,同时提供不同的存储类型:

在构建时,可以在Advanced Column Family 中对度量进行分组,如果有超过一个的COUNT DISTINCT或 Top_N 度量,可以将它们放在更多的列簇中,以优化HBase的I/O:

3.6. Configuration Overwrites
在这里可以为 Cube 配置参数。首先Kylin的全局参数在conf/kylin.properties 文件中;如果Cube需要覆盖全局设置的话,需要在此指定。
例如,指定 kylin.hbase.region.cut 的值为 1,则此Cube在存储的时候,Kylin将会按每个HTable Region 存储空间为 1GB 来创建HTable Region。如果用户希望任务从YARN 中获取更多内存,可以设置kylin.engine.mr.config-override.mapreduce.map.memory.mb、kylin.engin.mr.config-override.mapreduce.map.java.opts 等mapreduce 相关参数。如果用户希望Cube的构建任务使用不同的YARN资源队列,可以设置kylin.engine.mr.config-override.mapreduce.job.queuename。这些配置均可以在Cube级别重写。

配置完后保存,Cube 就创建完毕了。
4. 构建Cube
新创建的Cube只有定义,没有计算的数据,状态还是DISABLED,所以不会被查询引擎挑中。为了让Cube有数据,需要对它进行构建。构建有两种:全量与增量。两者构建步骤完全一样,区别在于构建时读取的数据源是全集还是子集。
Cube的构建过程如下,由任务引擎调度执行:
- 创建临时Hive平表(从Hive中读取数据)
- 计算各维度的不同值,并收集各Cuboid的统计数据
- 创建并保存字典
- 保存Cuboid统计信息
- 创建HTable
- 计算Cube(一轮或若干轮计算)
- 将Cube计算结果转为HFile
- 加载HFile到HBase
- 更新Cube元数据
- 垃圾回收
上述步骤中,前5步是为了计算Cube而作的准备工作,如遍历维度值来创建字典,对数据做统计和估算以创建HTable等。第6步是真正的Cube计算,取决于使用的Cube算法,它可能是一轮MapReduce任务,也可能是N(在没有优化的情况下,N可以被视作维度数)轮迭代的MapReduce。
由于Cube运算的中间结果是以SequenceFile的格式存储在HDFS上的,所以为了导入HBase,还需要进行第7步操作,将这些结果转换成HFile。第8步通过HBase BulkLoad 将HFile导入到HBase 集群,这一步完成后,HTable就可以查询到数据。第9步更新Cube的数据,将此构建的Segment状态从“NEW”更新为“READY”,表示已经可供查询。最后一步,清理构建过程中生成的临时文件等垃圾,释放集群资源。
Monitor页面会显示当前项目下进气的构建任务
4.1. 全量构建与增量构建
对数据模型中没有指定分割时间列信息的Cube,Kylin会采用全量构建,即每次都从Hive中读取全部的数据来开始构建。通常适用于以下两种情形:
- 事实表的数据不是按时间增长的
- 事实表的数据比较小或更新频率很低,全量构建不会造成太大的存储空间浪费
进行增量构建的时候,Kylin每次会从Hive中读取一个时间范围内的数据,然后进行计算,并以一个Segment的形式保存。下次构建的时候,自动以上此结束的时间为起点时间,再选择新的终止时间进行构建。经过多次构建后,Cube中会有多个Segment依次按时间顺序进行排列,如Seg-1,Seg-2,…,Seg-N。进行查询的时候,Kylin会查询一个或多个Segment然后做聚合计算,以便返回正确的结果给请求者。
使用增量构建的优势是,每次只需要对新增数据进行计算,避免了对实例数据重复计算。对于数据量很大的Cube,使用增量计算是必须的。
下面是为构建一个Segment的Cube的数据框,需要用户选择时间范围:

在从Hive中读取源数据的时候,Kylin会带上此条件。构建完毕后,Cube成为Ready状态:

4.2. 历史数据刷新
Cube构建完成后,如果某些历史数据发生了变动,需要针对相应的Segment重新进行计算,这种构建称为刷新。刷新通常只针对增量构建的Cube而言,因为全量构建的Cube只要重新全部构建就可以得到更新;而增量更新的Cube因为有多个Segment,需要先选择刷新的Segment,然后再进行刷新。如下所示:

在刷新的同时,Cube仍可以被查询,只是返回的是陈旧数据。在Segment刷新完毕后,新Segment会立即生效,查询开始返回最新的数据。原Segment则成为垃圾,等待回收。
5. 查询
Cube构建好后,即可进行查询。不过只有当查询的模式跟Cube定义相匹配的时候,Kylin才能够使用Cube的数据来完成查询。Group By 的列和 Where 条件里的列,必须是在维度中定义的列,而SQL中的度量,应该跟Cube中定义的度量一致。
例如,我们查询每天的总销售额的结果为:

可以看到耗时仅0.68s,速度非常快。得益于Kylin的预计算,可以大大缩减数据查询的时间。
Apache Kylin(三)Kylin上手的更多相关文章
- [kylin] 部署kylin服务
一.工具准备 zookeeper3.4.6 (hadoop.hbase 管理工具) Hadoop. Hbase1.1.4 Kylin1.5.0-HBase1.1.3 Jdk1.7.80 Hive 二. ...
- Apache的三种工作模式及相关配置
Apache的三种工作模式 作为老牌服务器,Apache仍在不断地发展,就目前来说,它一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块).它们分别是 prefor ...
- 三分钟上手Highcharts简易甘特图
根据业务需求,找到了这个很少使用的图形,话不多说,看看该如何使用.首先要引入支持文件:可根据链接下载. exporting.js:https://img.hcharts.cn/highcharts/m ...
- apache开源项目--kylin
Kylin 是一个开源的分布式的 OLAP 分析引擎,来自 eBay 公司开发,基于 Hadoop 提供 SQL 接口和 OLAP 接口,支持 TB 到 PB 级别的数据量. Kylin 是: 超级快 ...
- 在spring boot中三分钟上手apache顶级分布式链路追踪系统skywalking
原文:https://juejin.im/post/5cd10e81e51d453b560f2d53 skywalking在apache里全票通过成为了apache顶级链路追踪系统 项目地址:gith ...
- Kylin(三): Saiku
Saiku是一个轻量级的OLAP分析引擎,可以方便的扩展.嵌入和配置.Saiku通过REST API连接OLAP系统,利用其友好的界面为用户提供直观的分析数据的方式,它是基于jQuery做的前端界面. ...
- Apache Commons DbUtils 快速上手
原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...
- Apache的三种工作模式
Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. 它们分别是prefork,worker和event,它们同时也代表这Apac ...
- Apache Shiro(三)-登录认证和权限管理MD5加密
md5 加密 在前面的例子里,用户密码是明文的,这样是有巨大风险的,一旦泄露,就不好了.所以,通常都会采用非对称加密,什么是非对称呢?就是不可逆的,而 md5 就是这样一个算法.如代码所示 123 用 ...
- 学习Apache(三)
对某个目录开启验证登录 <Directory /var/www/html/admin > AllowOverride All Order allow,deny Allow from all ...
随机推荐
- VSCode 打开ESP32工程问题
一.无法跳转 问题现象: 打开ESP32工程头文件提示波浪线不跳转,如下图所示: 解决办法: 删除工程中.vsccode文件夹下的所有文件 VSCode 中打开命令行搜索 ESP-IDF 找到`添加 ...
- QT MySQL连接自动断开
参考链接 MySQL链接10天后自动断开解决方案:<https://blog.csdn.net/xiaoxiao133/article/details/123006881 方式一 QT中可以通过 ...
- SpringMVC学习三(静态资源/AJAX功能/乱码问题)
静态资源的映射 Springmvc完成ajax功能 SpringMVC返回中文到ajax乱码问题解决方式 1.静态资源映射 对于之前web.xml配置文件中的 先做出如下更改,不可写"/*& ...
- MacOS M1芯片openmp库出现mach-o file, but is an incompatible architecture (have ‘arm64‘, need ‘x86_64‘问题解决
目录 1. 问题描述 2. 问题出现原因 3. 解决方案 编译安装 使用Homebrew安装 Reference 1. 问题描述 报错如下所示: ImportError: dlopen(/Users/ ...
- python教程5:函数编程
函数编程 特性: 1.减少重复代码 2.让程序变的可扩展 3.使程序变得易维护 定义: 默认参数 要求:默认参数放在其他参数右侧 指定参数(调用的时候) 正常情况下,给函数传参数要按顺序,如果不想按 ...
- ShareConnect即将寿终正寝 Splashtop远程桌面会是最好的替代品
大家好,我是没有感情的翻译机器人,又见面了.同类产品ShareConnect即将退市,官方大大搞了个新闻稿.君叫臣翻,臣不得不翻.------没有感情的分割线------ShareConnect的使用 ...
- 2023最新nacos的windows 10安装(保姆级)
目录 前景提要 一.环境整合 构建工具(参考工具部署方式) 二.找到下载位置 1.在百度中找到下载地址.搜索nacos中文官网. 2.双击进入这个网站,看到首页找到下载位置. 3.进入git地址找到如 ...
- ETSI GS MEC 012,无线网络信息服务 API
目录 文章目录 目录 版本 功能理解 版本 ETSI GS MEC 012 V2.1.1 (2019-12) 功能理解 RNIS(Radio Network Information Service,无 ...
- go新手常踩的坑
作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上也先后开发了两个go项目.在学习go语言的过程中也学习并总结了一些相关的东西, ...
- MyBatis日志模块源码分析
MyBatis源码的logging包下是日志模块的相关实现,Mybatis日志模块通过适配器模式和代理模式优雅的实现了SQL日志的输出功能. 一. 适配器模式实现了MyBatis对第三方日志框架的适配 ...