核心思想:预计算与立方体
Kylin 的核心思想是 “预计算”,它将大数据查询中常见的、复杂的聚合计算(如多维度、多指标的 GROUP BY)提前在数据仓库中计算好,并将结果存储下来,当用户发起查询时,系统只需从预计算好的结果中进行 “查表” 操作,从而实现亚秒级的查询响应。

这个预计算的结果就是 “Cube”(立方体),你可以把它想象成一个多维度的数据透视表,它预定义了所有可能的维度组合和对应的指标聚合值。
整体架构图
我们来看一个 Kylin 整体架构的示意图,这有助于我们建立宏观的认识。
上图展示了 Kylin 的主要组件以及它们如何与外部系统(如 Hadoop、HBase、查询引擎)交互。
核心组件详解
Kylin 的架构可以分为以下几个关键部分:

查询请求层
这是用户与 Kylin 交互的入口。
- REST Server: 提供 RESTful API 接口,用于元数据管理、任务提交、查询请求等,BI 工具(如 Tableau, PowerBI)、Superset 或其他应用程序通过 API 与 Kylin 通信。
- Web GUI: 提供一个基于 Web 的图形用户界面,方便用户进行 Cube 的设计、构建、管理和查询。
查询引擎层
当查询请求到达后,Kylin 需要将其翻译并执行。
- Query Engine: 这是 Kylin 的大脑,它负责:
- 接收查询请求: 解析用户通过 SQL 或 API 发送的查询。
- 语法分析: 将 SQL 查询解析成一个语法树。
- 元数据匹配: 根据查询中的
GROUP BY维度和SELECT的指标,去元数据中查找最匹配的 Cube。 - 生成执行计划: 如果查询可以命中 Cube,则生成一个基于 Cube 的执行计划;如果不能,则会尝试将查询下推到数据源(如 Hive)执行。
- 路由查询: 将最终的执行计划路由到相应的执行引擎。
存储层
Kylin 本身不存储原始数据,而是将预计算结果存储在专门的存储系统中。
- Apache HBase: 这是 Kylin 最经典、最常用的存储后端,HBase 是一个高可用、高可扩展的分布式 NoSQL 数据库,非常适合存储稀疏的、多维度的预计算结果,Cube 的数据被切分成多个 Region,分布在 HBase 集群的不同节点上,实现了并行查询和水平扩展。
- 其他存储后端: 除了 HBase,Kylin 也支持其他存储,如 Amazon S3 + Apache Parquet(用于云原生架构)、Apache Kafka(用于实时流式场景)等。
计算层
这是 Kylin 的核心,负责执行最耗时的预计算任务,这些计算任务通常在 Hadoop 或 Spark 集群上运行。

- Cube Build Engine: 负责执行 Cube 的构建过程,它可以是:
- MapReduce: Kylin 早期和经典的构建引擎,将构建过程拆分成多个 MapReduce 作业,稳定但性能相对较低。
- Spark: 当前推荐和默认的构建引擎,利用 Spark 的内存计算和 DAG 调度优势,构建速度比 MapReduce 快得多(通常快 5-10 倍)。
- Job Engine: 一个更上层的任务调度框架,负责管理整个构建流程,包括数据提取、构建、合并等步骤,并将它们作为一个个 Job 提交给 Hadoop/Spark 集群执行。
元数据层
元数据是 Kylin 的“灵魂”,它描述了整个数据仓库的结构、Cube 的定义、构建历史等,元数据存储在关系型数据库中(如 MySQL, PostgreSQL)。
- :
- 项目: 逻辑上组织 Cube 和数据源。
- 数据源: 描述原始数据的位置(如 Hive 表)。
- 模型: 定义事实表、维度表以及它们之间的关联关系。
- Cube: 定义了 Cube 的核心,包括:
- 维度: Cube 的分析角度,如
city,date。 - 指标: Cube 需要聚合的数值,如
price_sum,count。 - Row Key: 定义了维度在 HBase Row Key 中的排列组合顺序,这是决定 Cube 大小和查询性能的关键。
- Measure: 具体的指标计算方式,如 SUM, COUNT, MAX。
- Cube Segment: Cube 的一个构建单元,通常对应一个时间窗口的数据,每次构建都会生成一个新的 Segment,多个 Segment 可以合并成一个更大的 Segment。
- 维度: Cube 的分析角度,如
- 任务历史: 记录了所有 Cube 构建任务的详细信息。
协同组件
这些组件为 Kylin 的正常运行提供了支持。
- REST API: 提供了标准的编程接口,方便与外部系统集成。
-
认证与授权: 支持与 LDAP, Kerberos, Ranger 等系统集成,进行用户身份验证和权限控制。
数据流程:一个查询的生命周期
为了更好地理解架构,我们跟踪一个典型的查询请求是如何被处理的:
-
用户发起查询: 用户通过 BI 工具提交一个 SQL 查询,
SELECT SUM(price) FROM sales GROUP BY city, date;
-
请求到达 REST Server: BI 工具通过 JDBC 或 REST API 将此请求发送给 Kylin 的 REST Server。
-
Query Engine 接手并分析:
- Query Engine 接收到请求。
- 它解析 SQL,识别出
GROUP BY的维度是city和date,指标是SUM(price)。 - 它去元数据中查找是否存在一个 Cube,其定义包含
city和date这两个维度,并且包含SUM(price)这个指标。
-
匹配 Cube 并生成执行计划:
- 假设找到了一个匹配的 Cube,
sales_cube。 - Query Engine 根据 Cube 的
Row Key设计和查询的GROUP BY条件,生成一个 HBase Scan 请求,这个 Scan 请求会精确地定位到 HBase 中存储了city和date组合的数据行。
- 假设找到了一个匹配的 Cube,
-
执行查询:
- Query Engine 将 HBase Scan 请求发送给 HBase 集群。
- HBase 在其分布式存储中并行查找数据,并将结果返回给 Kylin。
-
返回结果:
Kylin 收到 HBase 返回的数据后,进行必要的后处理(如转换数据类型),然后将最终结果集返回给用户。
整个过程非常快,因为所有的聚合计算都已经提前完成,Kylin 只做了一次高效的“点查”操作。
关键设计理念
- 预计算:核心中的核心,用空间换时间,牺牲存储成本换取极致的查询性能。
- 维度模型:基于星型或雪花模型设计 Cube,符合业务分析人员的思维模式。
- 分层架构:清晰的分层(查询、计算、存储、元数据)使得系统模块化、易于扩展和维护。
- 可扩展性:
- 计算扩展: 依赖 Hadoop/Spark 集群,可以通过增加节点来提升构建速度。
- 存储扩展: 依赖 HBase 或其他分布式存储,可以通过增加 RegionServer 节点来存储更多的 Cube 数据和支撑更高的并发查询。
- 标准接口:提供标准的 JDBC 和 ODBC 接口,可以无缝接入现有的 BI 工具生态。
Apache Kylin 的技术架构是一个精心设计的系统,它通过 预计算 的方式,将复杂的 OLAP 分析问题转化为简单的 “存储+检索” 问题,其成功的关键在于将计算任务从昂贵的实时查询转移到了廉价的离线批处理阶段,从而在 Hadoop 生态之上构建了一个高性能的交互式分析平台,理解其 Cube 模型、Row Key 设计、构建流程和查询路由 是掌握和使用 Kylin 的必备知识。
