1. 引言

Apache Kylin 是一个开源的 OLAP 引擎,专为海量数据集提供亚秒级查询性能而设计。最初由 eBay 开发并捐赠给 Apache 软件基金会,如今已成为 大数据分析 领域的标杆工具,尤其擅长处理跨越复杂数据管道的万亿级记录。

这个平台巧妙融合了 OLAP 性能与分布式系统规模,在大型复杂数据存储和现代商业智能工具的速度需求之间架起了桥梁,让用户能在更新鲜的数据上快速决策。

本文将深入探讨 Kylin 的核心特性、架构设计,以及它如何改变大数据分析的游戏规则。让我们开始吧!

2. 解析 Apache Kylin 的核心能力

先看看 Kylin 的强项在哪里:

Apache Kylin 即使在处理万亿行数据时也能实现亚秒级延迟。这得益于它对预计算数据模型和优化索引的深度应用。当性能和速度成为关键时,Kylin 绝对是首选。

同样,Kylin 也能轻松处理高并发场景。无论是同时响应数百个查询,还是执行重度聚合操作,其底层架构都能无瓶颈地横向扩展。

另一个优势是 Kylin 统一的 大数据仓库 架构。它原生集成 Hadoop 生态和 数据湖 平台,非常适合已投入分布式存储的组织。在可视化和报表方面,Kylin 与 Tableau、Superset、Power BI 等工具无缝集成,提供查询接口让用户无需理解底层复杂性即可探索数据。

更重要的是,Kylin 提供企业级生产特性:强大的安全机制、元数据管理和多租户能力,使其成为大规模企业部署的理想选择。Kylin 的性能绝非偶然——其组件从设计之初就采用多维建模、智能索引和高效数据加载管道。

下面我们深入分析每个元素如何贡献其核心能力。

2.1. 多维建模与模型的角色

Kylin 的核心是数据模型,采用星型或雪花型架构定义底层表关系。在这个结构中:

  • 维度:分析视角或分类(如地区、产品、时间)
  • 度量:聚合数值(如总销售额、平均价格)
  • 计算列:通过表达式或转换派生新字段(✅ 标准化日期格式或创建衍生属性)

Kylin 在模型定义阶段处理表连接,使其理解关系并优化模型。模型一旦建立,就成为索引创建和数据加载的基础。

2.2. 索引设计与预计算(CUBES)

为达成极速查询,Kylin 深度依赖预计算。它基于模型维度和度量构建索引(即 CUBES),主要包含两种类型:

  • **聚合索引**:存储预聚合的维度-度量组合(如按产品/月份统计的总收入)
  • **表索引**:多级索引,支持明细查询或下钻操作(如获取特定用户的最近50笔订单)

通过预计算所有可能组合并高效存储,Kylin 避免了查询时扫描原始数据,显著降低延迟——即使面对复杂分析查询。

⚠️ 索引设计至关重要:索引越精准高效,查询时消耗的存储和计算资源就越少。

2.3. 数据加载流程

模型和索引就绪后,需要加载数据。Kylin 的数据加载涉及构建 CUBES 并填充预计算结果。

传统方式采用批处理模式加载离线数据。Kylin 从源表(通常是 Hive 或 HDFS 中的 Parquet 文件)读取数据,处理成索引结构。

此外,还支持 Apache Kafka 等流式数据源,实现近实时摄取和分析。这让 Kylin 能在混合批流场景中无缝工作,无需改变分析层。

关键点:数据加载后,查询直接命中预构建索引而非原始数据集——无论数据量多大,性能都稳定可预测。

3. 在 Docker 中运行 Apache Kylin

探索 Kylin 最快的方式是使用 Docker 容器。这特别适合本地测试新特性或评估 最新版本

看这个 docker run 命令启动 Kylin:

$ 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 版本独立镜像并启动。参数说明:

  • --name:容器命名
  • --hostname:设置容器主机名(便于内部引用)
  • -e TZ=UTC:时区设为 UTC
  • -m 10G:限制内存 10GB(建议至少分配 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

确认容器运行后,通过 http://localhost:7070 访问 Kylin Web UI。这个自包含环境已满足构建模型和探索数据集的所有需求。

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 组件入口。

从这里可以创建项目、上传数据模型、构建 CUBES,并管理元数据、监控构建任务、交互式测试 SQL 查询。

4. 使用 SQL 在 Apache Kylin 中定义模型和构建 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)拉取该表元数据。示例输出:

{
    "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

通过 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)"]
}

Kylin 直接从 SQL 推断元数据创建模型 sales_cube_model,自动将分组字段标记为维度,聚合操作标记为度量。

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 构建(覆盖所有时间范围)。时间戳范围设为开放值,适合全量构建。

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_status": "FINISHED" 时,即可开始查询。

⚠️ Kylin 支持基于查询模式的索引剪枝。执行几次查询后,可通过 API 查看索引使用统计。若发现某些维度组合极少使用,可从索引定义中移除——这能缩短构建时间、减少存储,且不影响查询覆盖范围。

简单说:我们已完成数据集建模、定义聚合并物化了 CUBE。接下来可以查询,或将此流程集成到 CI/CD 分析流水线中。对于定期数据加载,可通过 cron 任务或 CI 流水线自动化 CUBE 构建。Kylin 的 REST API 对脚本友好,轻松实现午夜、每小时或新数据到达时触发构建。

5. 总结

本文深入探讨了 Apache Kylin——这个专为大数据分析极致规模和性能而生的利器。它融合 OLAP 建模与分布式计算能力,在超大规模数据集上提供快速可靠的分析洞察。

平台的核心特性包括流式支持、原生计算引擎、自动化建模和智能元数据处理。这些改进使其更易用、更高效,更贴合现代数据架构。

无论是构建仪表盘、驱动实时指标,还是实现数据民主化,Kylin 都提供在大规模场景下高速实现目标的工具箱。


原始标题:Introduction to Apache Kylin | Baeldung