编程

开源 OLAP 引擎:Apache Kylin

17 2025-07-03 12:09:00

1. 介绍

Apache Kylin 是一个开源 OLAP 引擎,旨在为海量数据集带来亚秒级的查询性能。Kylin 最初由 eBay 开发,后来捐赠给 Apache 软件基金会,现已发展成为一种广泛采用的大数据分析工具,特别是在处理复杂管道中数万亿条记录的环境中。

该平台以将 OLAP 性能与分布式系统的规模相结合而闻名。它弥合了复杂的大规模数据存储与现代商业智能工具的速度要求之间的差距,从而能够对更新的数据做出更快的决策。

在本教程中,我们将探索使 Kylin 脱颖而出的核心功能,了解其架构,并了解它如何改变大数据分析的游戏规则。让我们开始吧!

2. 理解 Apache Kylin 的核心能

让我们先看看 Apache Kylin 在那些方面表现良好。

Apache Kylin 即使在处理跨越数万亿行的数据集时,也会提供亚秒级的延迟。这是可能的,因为它大量使用预先计算的数据模型和优化的索引。当性能和速度至关重要时,Kylin 大放异彩。

同样,Kylin 也很容易处理高并发性。无论系统是同时处理数百个查询还是执行大量聚合,底层架构都是可扩展的,不会成为瓶颈。

另一个优势是麒麟统一的大数据仓库架构。它与 Hadoop 生态系统和数据湖平台原生集成,使其非常适合已经投资于分布式存储的组织。对于可视化和业务报告,Kylin 与 Tableau、Superset 和 Power BI 等工具无缝集成。它提供了查询接口,使我们能够在不了解底层复杂性的情况下探索数据。

此外,如果我们需要生产环境特性,Kylin 提供了强大的安全性、元数据管理和多租户能力,使其适合企业大规模使用。Kylin 的性能不只是运气;它的组件是使用多维建模、智能索引和高效的数据加载管道从头开始设计的。

让我们仔细看看这些元素中的每一个是如何为其能力做出贡献的。

2.1. 多维建模和模型的作用

Kylin 的核心是它的数据模型,该模型使用星形或雪花 Schema 构建,以定义底层数据表之间的关系。在这种结构中,我们定义了维度,即我们想要分析的视角或类别(如地区、产品或时间)。除此之外,还有衡量标准和汇总数值,如总销售额或平均价格。
同样,Kylin 也支持计算列,这允许我们使用表达式或 transformation 来定义新字段,这对于标准化日期格式或创建派生属性非常有用。它在模型定义阶段处理 join,使 Kylin 能够理解关联并相应地优化模型。

一旦建立了模型,它就成为索引创建和数据加载的基础。

2.2. 索引设计和预计算(CUBE)

为了实现它的速度,Kylin 在很大程度上依赖于预计算。它构建索引(也称为 CUBE),根据模型维度和度量提前聚合数据。Kylin 中有两种主要类型的索引:

  • 聚合索引:这些存储了预先聚合的维度和度量组合,如按产品和月份划分的总收入。

表索引:这些是多级索引,有助于提供详细或深入的查询,例如获取特定用户最近下的 50 个订单。

通过预先计算可能的组合并高效地存储它们,Kylin 避免了在查询时扫描原始数据的需要。这大大降低了延迟,即使对于复杂的分析查询也是如此。

值得注意的是,索引设计至关重要。索引的针对性和效率越高,查询过程中消耗的存储和处理能力就越小。

2.3. 数据加载处理

一旦模型和索引就位,我们就需要加载数据。Kylin 中的数据加载涉及构建 CUBE 并用预先计算的结果填充它们。

传统上,这是使用离线数据以批处理模式完成的。Kylin 从源表(通常是 HDFS 中的 Hive  或Parquet 文件)读取数据,并将数据处理到其索引结构中。

此外,还支持 Apache Kafka 等流媒体源,实现了近乎实时的摄取和分析。这使得在混合批处理流场景中使用 Kylin 成为可能,而无需更改分析层。

重要的是,一旦我们加载了数据,查询就会针对预构建的索引而不是原始数据集运行,从而提供一致和可预测的性能,而不管其底层是什么。

3. 如何在 Docker 中运行 Apache Kylin

探索 Apache Kylin 的最快方法是在 Docker 容器中运行。如果我们想在本地测试新功能或评估最新版本,这是完美的。

让我们通过 docker run 命令来开始使用:

$ docker run -d \
  --name Kylin5-Machine \
  --hostname localhost \
  -e TZ=UTC \
  -m 10G \
  -p 7070:7070 \
  -p 8088:8088 \
  -p 9870:9870 \
  -p 8032:8032 \
  -p 8042:8042 \
  -p 2181:2181 \
  apachekylin/apache-kylin-standalone:5.0.0-GA

在这里,我们拉取 5.0 版本的独立映像并启动它。我们将 Apache Kylin 5.0 作为独立容器启动,并公开一些常见端口以便于访问:

  • –name:为容器指定一个名称
  • –hostname:设置容器主机名 (用于内容引用)
  • -e TZ=UTC: 将时区设置为 UTC
  • -m 10G: 将容器使用的内存限制为 10 GB (建议至少分配 10GB内存以获得流畅的体验)
  • -p 选项: 将基本的Kylin和Hadoop相关服务端口从容器映射到主机
  • apachekylin/apache-kylin-standalone:5.0.0-GA: 镜像名称,包括所有必须的服务捆绑包

既然 docker run 命令本身在容器 ID 之外输出,我们可以使用 使用 docker ps 验证它是否在运行:

$ docker ps --filter name=Kylin5-Machine
CONTAINER ID   IMAGE                                         STATUS          PORTS                                             NAMES
abc123456789   apachekylin/apache-kylin-standalone:5.0.0-GA   Up 10 seconds   0.0.0.0:7070->7070/tcp, ...                      Kylin5-Machine

一旦我们确认了其容器已经启动,我们可以访问 Kylin web UI:http://localhost:7070  并开始探索。这一设置让我们获得了在齐备环境中创建模型和探索数据集所需的一切。

3.1. 验证 Kylin 实例

容器运行后,我们可以通过 curl 进行简单的健康状态检查来验证实例:

$ curl http://localhost:7070/kylin/api/system/health

如果一切如期生效,我们将会看到标明服务器状态为 UP 的响应,如下:

{
    "status": "UP",
    "storage": {
        "status": "UP"
    },
    "metadata": {
        "status": "UP"
    },
    "query": {
        "status": "UP"
    }
}

这证实了 Kylin 的内部服务、元数据、查询引擎和存储正在运行并准备接受操作。

3.2. 访问 Kylin Web 接口

Kylin UI 可以在 http://localhost:7070 中访问。我们可以使用默认登录凭证进行登录:

Username: ADMIN
Password: KYLIN

一旦启动,Kylin 的 web 界面还可以通过其他端口访问 Spark 和 Hadoop UI 组件。

从这里,我们可以创建一个项目,上传数据模型,并开始构建 CUBE。该界面还包括用于管理元数据、监视构建作业和交互式测试 SQL 查询的部分。

4. 如何在 Apache Kylin 中使用 SQL 定义模型和构建 CUBE

有了 Kylin,我们还可以使用普通 SQL 和 REST API 定义模型并启动 CUBE 构建。这使得该过程更清洁、自动化,非常适合开发密集型环境。让我们一起探索以下。

4.1. 将表加载到Kylin中

假设源表 sales_data 存在于 Hive 或类似的目录中,我们首先告诉 Kylin。

为此,我们可以通过 curl/tables API 发出 POST 请求:

$ curl -X POST http://localhost:7070/kylin/api/tables/default.sales_data \
  -H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)" \
  -d '{"project":"sales_analytics"}'

在这里,我们将源表 sales_data 注册到 sales_analytics 项目中。这告诉 Kylin 从配置的目录(如 Hive 或 JDBC)中提取 sales_data 表的元数据。让我们来看一个输出示例:

{
    "uuid": "fcbe5a9a-xxxx-xxxx-xxxx-87d8c1e6b2c5",
    "database": "default",
    "name": "sales_data",
    "project": "sales_analytics"
}

正如我们所看到的,一旦注册,它就可以用于模型创建。

4.2. 通过 SQL 创建模型

这就是事情变得有趣的地方。我们现在可以使用 SQL 语句定义模型,Kylin 会自动推断维度、度量值和连接。

让我们来看一个 SQL 示例:

SELECT
  order_id,
  product_id,
  region,
  order_date,
  SUM(order_amount) AS total_sales
FROM sales_data
GROUP BY order_id, product_id, region, order_date

这个 SQL 语句告诉了 Kylin 维度(dimension)和尺度(measure)是什么。

现在,让我们通过 API 将此 SQL 发送到 Kylin 的建模引擎:.

$ curl -X POST http://localhost:7070/kylin/api/models/sql \
  -H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "project": "sales_analytics",
    "modelName": "sales_cube_model",
    "sql": "SELECT order_id, product_id, region, order_date, SUM(order_amount) AS total_sales FROM sales_data GROUP BY order_id, product_id, region, order_date"
  }'

如期请求成功,Kylin 将创建包含所有以上提到的字段的新模型,同时在 order_amount 上进行基本聚合:

{
    "model_id": "sales_cube_model",
    "status": "ONLINE",
    "fact_table": "sales_data",
    "dimensions": ["order_id", "product_id", "region", "order_date"],
    "measures": ["SUM(order_amount)"]
}

在这里,这通过直接从 SQL 推断元数据创建了一个新模型 sales_cube_model。它会自动将分组字段标记为维度(measure),并将聚合作为 measure 应用。

4.3. 触发 CUBE 构建任务

一旦模型创建完,我们可以触发构建任务来实现索引

首先,我们获得了模型 ID (或名称),然后发送创建请求:

$ curl -X PUT http://localhost:7070/kylin/api/jobs \
  -H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "model_name": "sales_cube_model",
    "project": "sales_analytics",
    "build_type": "BUILD",
    "start_time": 0,
    "end_time": 2000000000000
  }'

运行完这些命令后,Kylin 开始使用默认聚合分组创建 CUBE 并输出状态:

{
    "uuid": "job_3f23c498-xxxx-xxxx-xxxx-9eab1a66f79c",
    "status": "PENDING",
    "exec_start_time": 1711700000000,
    "model_name": "sales_cube_model"
}

这将为模型安排一个完整的 CUBE 构建(涵盖所有时间范围)。Kylin 预先计算模型中定义的聚合。这里的时间戳范围是开放的,这对于完整的构建非常有效。

4.4. 监测构建状态

要监控构建状态,我们可以不断使用任务 API 检查构建任务的状态:

$ curl -X GET "http://localhost:7070/kylin/api/jobs?projectName=sales_analytics" \
  -H "Authorization: Basic $(echo -n 'ADMIN:KYLIN' | base64)"

[
    {
        "job_status": "FINISHED",
        "model_name": "sales_cube_model",
        "duration": 52300,
        "last_modified": 1711700150000
    }
]

响应显示了任务(job)阶段、状态、持续时间以及构建是否成功。一旦它达到 “job_status”:“FINISHED”,我们就可以进行查询了。

值得注意的是,Kylin 支持基于查询模式的索引修剪。经过几次查询,我们可以检查 API 中的索引使用情况统计信息。我们可能会发现,一些维度很少一起使用,从索引定义中修剪这些组合可以缩短构建时间并减少存储,而不会影响查询覆盖率。

简而言之,我们已经完全建模了一个数据集,定义了聚合,并实现了一个 CUBE。我们现在可以查询下一个,甚至可以作为 CI/CD 分析管道的一部分自动执行此流程。对于重复的数据加载,我们可以使用 cron 作业或 CI 管道自动化 CUBE 构建过程。Kylin 的 REST API 是脚本友好型的,因此很容易在午夜、每小时或每当新数据到达源系统时触发构建。

5. 小结

本文中,我们探讨了 Apache Kylin,这是一个专门为大数据分析中的极端规模和性能而构建的工具。它将 OLAP 建模的强大功能与分布式计算相结合,在海量数据集上提供快速、可靠的见解。

凭借重要的组件和功能,该平台引入了流媒体支持、原生计算引擎、自动化建模和更智能的元数据处理。这些变化使其更易于接近、更高性能,并且更符合现代数据架构。

无论是构建仪表板、支持实时指标,还是使数据访问民主化,Kylin 都提供了大规模、快速完成这些工作的工具。