大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(正在更新...)

章节内容

上节我们完成了如下的内容:

  • Apache Kylin 按日期构建 Cube
  • 详细记录

Cube 介绍

Apache Kylin 是一个开源的分布式分析引擎,专注于提供大数据的实时OLAP(在线分析处理)能力。Cube(立方体)是 Apache Kylin 的核心概念之一,通过预计算大规模数据的多维数据集合,加速复杂的 SQL 查询。下面详细介绍 Cube 的关键点:

Cube 的基本概念

Kylin 中的 Cube 是通过对一组事实表(通常是业务数据表)进行多维建模后,生成的预计算数据结构。Cube 涉及对多维数据的度量和维度的组合,从而可以在查询时通过检索预先计算的结果来显著减少计算开销。

  • 维度(Dimension):数据中用于分组、筛选和切片的数据字段,例如时间、地区、产品等。
  • 度量(Measure):通常是需要进行聚合计算的数据字段,例如销售额、订单数等。
  • Cuboid:每个 Cube 由多个 Cuboid 构成,Cuboid 是一个特定维度组合的子集。Cube 中每种维度组合都会生成一个 Cuboid,每个 Cuboid 存储了该组合下的预聚合结果。

Cube 的创建过程

  • 数据建模:首先在 Kylin 中创建一个数据模型(Data Model),这个模型定义了事实表和维度表之间的关系,类似于星型或雪花型模式。模型中也定义了需要聚合的度量字段。
  • Cube 设计:基于数据模型设计 Cube,指定 Cube 的维度和度量。Kylin 会根据定义自动计算所有可能的维度组合(Cuboid)。
  • 构建 Cube:构建过程会读取底层数据源(如 Hive、HBase、Kafka),然后根据指定的维度和度量生成每个 Cuboid 的预计算数据。这些预计算结果存储在 HBase 或其他存储引擎中。

Cube 的查询与优化

  • 查询加速:当有 SQL 查询请求到达时,Kylin 会根据查询所涉及的维度组合,选择合适的 Cuboid 返回结果,避免了实时计算,极大地提高了查询性能。
  • Cube 优化:为了控制 Cube 大小和加速构建,Kylin 支持裁剪 Cube,通过配置仅生成部分 Cuboid,这称为"Aggregation Group",可以减少冗余计算。

实时 OLAP

Kylin 4.0 引入了对实时 OLAP 的支持,使用 Kafka 作为实时数据流输入,构建实时 Cube。通过使用 Lambda 架构,Kylin 可以支持实时和批处理数据的整合分析。

Cube 的典型应用场景

  • 大规模数据分析:Cube 适用于分析超大规模的数据集,通过预计算方式加速查询。
  • 实时分析:实时 Cube 允许用户在近乎实时的基础上分析流数据。
  • 商业智能(BI)工具的集成:Kylin 提供与 Tableau、Power BI 等常见 BI 工具的集成,用户可以使用熟悉的 SQL 查询语言进行复杂的多维分析。

创建Cube(按日期、区域、产品、渠道)

Cube设计

维度:日期、渠道、区域、产品

指标:销售总金额、订单总比数

结构图如下:

对应的SQL如下所示:

sql 复制代码
select
  t1.date1,
  t2.regionid,
  t2.regionname,
  t3.productid,
  t3.productname,
  sum(t1.price) as total_money,
  sum(t1.amount) as total_amount
from
  dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by
  t1.date1,
  t2.regionid,
  t2.regionname,
  t3.productid,
  t3.productname
order by
  t1.date1,
  t2.regionname,
  t3.productname

核心步骤

定义数据源 => 定义Model => 定义Cube => 构建Cube

操作步骤

创建Model

创建的时候,Lookup Table,配置成如下的内容:

配置维度为如下的结果:

配置度量为如下的结果:

创建Cube

选择维度,如下图所示:

配置完的结果如下图:

指定指标,如下图所示:

我们继续Build操作,对Cube进行Build:

漫长等待,构建完毕的结果:

执行SQL

sql 复制代码
select
  t1.date1,
  t2.regionid,
  t2.regionname,
  t3.productid,
  t3.productname,
  sum(t1.price) as total_money,
  sum(t1.amount) as total_amount
from
  dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by
  t1.date1,
  t2.regionid,
  t2.regionname,
  t3.productid,
  t3.productname
order by
  t1.date1,
  t2.regionname,
  t3.productname

执行的结果:

Cube 查询流程

当查询请求到达 Kylin 时,Kylin 通过以下步骤来确定如何利用 Cube 加速查询:

查询解析

当用户通过 SQL 提交查询时,Kylin 会先将 SQL 查询进行解析。解析的内容包括:

选择的维度(如 GROUP BY 和 WHERE 中使用的字段)

聚合操作(如 SUM、COUNT 等)

过滤条件(WHERE 和 HAVING 子句)

Kylin 会将解析后的 SQL 查询映射到事先创建好的 Cube 上,并尝试根据查询所涉及的维度和度量,找到最匹配的 Cuboid。

Cuboid 匹配

Kylin 的核心是 Cube,它由多个 Cuboid 组成,每个 Cuboid 存储了一个特定维度组合的聚合结果。Cuboid 是基于事实表中的维度进行组合的子集,每个子集存储了预计算的度量值。

Kylin 通过如下步骤进行 Cuboid 匹配:

确定 SQL 查询需要的维度和度量。

查找与查询条件最匹配的 Cuboid。Kylin 会优先选择最小的 Cuboid,即只包含所需维度的子集,这样可以减少数据读取量,提高查询性能。

如果找到匹配的 Cuboid,Kylin 会直接从中提取预计算的数据。

查询执行

一旦找到匹配的 Cuboid,Kylin 会从 HBase 或者其他存储引擎中读取 Cuboid 中的数据,然后对数据进行最后的过滤、排序或聚合(如果查询中有其他未预先计算的内容)。因为大部分计算已经在 Cube 构建阶段完成,所以这一步的执行速度非常快,通常可以在秒级内完成大规模数据的查询。

Cube 优化策略

虽然 Cube 提供了强大的查询加速功能,但 Cube 的构建、存储和管理也存在一定的挑战。因此,Kylin 提供了一些优化策略,帮助用户最大化利用 Cube 的性能,最小化资源消耗。

维度裁剪(Aggregation Group)

Cube 的大小和复杂度与维度的数量密切相关,因为 Cube 中每个维度的组合都会生成一个 Cuboid,维度越多,Cuboid 数量呈指数级增长。为了避免不必要的 Cuboid 生成,Kylin 支持 Aggregation Group,它允许用户定义 Cube 中仅需要保留的维度组合,从而减少不常用维度组合的计算和存储。

举例:

如果某个 Cube 中有 时间、地区 和 产品 三个维度,用户可以根据业务需求定义只计算 时间-产品 和 地区-产品 的组合,而忽略不常用的 时间-地区 组合。

Cuboid 裁剪(Cuboid Pruning)

Cuboid 裁剪是进一步优化的手段,用于在 Cube 构建时减少不必要的 Cuboid。Kylin 会根据查询历史和配置规则,自动裁剪不经常使用的 Cuboid,减少 Cube 的构建时间和存储空间。这一过程称为 Cuboid Pruning。

Cuboid 裁剪的规则:

通过历史查询分析:Kylin 可以根据历史查询分析哪些维度组合更常被查询,从而决定哪些 Cuboid 需要保留。

通过手动配置:用户也可以根据业务场景,手动配置哪些维度组合重要,哪些可以被裁剪。

增量构建

在大规模数据环境中,全量构建 Cube 的代价非常高。为了应对这一问题,Kylin 提供了 增量构建 功能。增量构建允许用户只对新增或更新的数据进行 Cube 构建,而无需重建整个 Cube。

增量构建的好处:

提高构建效率:只处理增量数据,避免对整个数据集的重复计算。

实时更新:支持更快的响应时间,能够在较短的时间内更新最新数据的 Cube。

Cube 的层次构建(Layered Cuboid)

为了减少 Cuboid 的存储空间,Kylin 采用了 层次构建(Layered Cuboid) 策略。这个策略通过优先计算最小的 Cuboid(即包含较少维度的组合),再基于这些 Cuboid 逐层构建更大的 Cuboid。这样不仅可以减少存储占用,还能提高构建速度。

数据分区

Kylin 支持将 Cube 按照时间维度进行分区(如按天、按月等),从而使得查询和数据管理更加高效。分区可以帮助 Kylin 减少每次查询时的数据量,提高查询性能。

静态和动态优化

Kylin 提供了 静态优化 和 动态优化 两种方式:

静态优化:在 Cube 构建时进行优化,例如通过裁剪 Cuboid、定义 Aggregation Group 等手段减少 Cube 的体积。

动态优化:在查询时动态选择最合适的 Cuboid,尽可能避免过大的数据读取,提升查询效率。

Cube 的监控与调优

为了进一步优化 Cube,Kylin 提供了多种工具和功能用于监控和调优:

  • 查询日志分析:通过分析查询日志,用户可以识别出哪些查询执行时间过长或未命中 Cube,从而针对性地调整 Cube 设计。
  • 构建日志监控:监控 Cube 构建过程中的性能瓶颈,及时发现并优化构建效率。
相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
zhixingheyi_tian3 小时前
Spark 之 Aggregate
大数据·分布式·spark
PersistJiao3 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud