Apache Kylin 深入
概述
Apache Kylin 是"预计算"型 OLAP:提前把维度组合的计算结果存成 Cube,查询直接查预计算结果,毫秒级返回海量数据聚合。代价是构建时间长、维度组合爆炸。本文讲透 Cube 原理、构建优化、查询下压、增量构建与 BI 集成。
一、Kylin 定位
| 特性 | 说明 |
|---|---|
| 类型 | 预计算 OLAP |
| 核心 | Cube 多维预聚合 |
| 引擎 | 构建走 Hadoop/Spark,查询走存储 |
| 场景 | 固定维度的大规模报表 |
| 特点 | 查询极快、数据量大 |
| 对比 | 预计算 | 实时计算 |
|---|---|---|
| 查询 | 秒级 | 计算耗时 |
| 延迟 | 构建延迟 | 实时 |
| 场景 | 固定报表 | 动态查询 |
Kylin = 以空间换时间
构建时把所有可能聚合算好二、Cube 原理
2.1 基本概念
| 概念 | 说明 |
|---|---|
| Cube | 多维数据集 |
| Cuboid | 一个维度组合的结果 |
| Dimension | 维度 |
| Measure | 度量(聚合值) |
示例:维度(地区,商品,日期)
组合:Cuboid 数 = 2^3 = 8 种
(地区,商品,日期)、(地区,商品)、(地区,日期)...
(全部聚合)2.2 Cuboid 数量
Cuboid 数 = 2^n(n 个维度)
维度多 → 组合爆炸
优化:剪枝(不常用组合不建)| 维度数 | Cuboid 数 |
|---|---|
| 5 | 32 |
| 10 | 1024 |
| 20 | 100 万+ |
剪枝策略:
只建常用组合(Mandatory/层级/联合维度)
减少构建与存储2.3 构建流程
1. 数据源 → 抽取到中间表(星型模型事实表+维表)
2. 预计算:按 Cuboid 聚合
3. 结果存 HBase/对象存储
4. 元数据记录 Cube构建 = 批量聚合计算
常用引擎:MapReduce / Spark三、Cube 构建优化
3.1 维度剪枝
| 策略 | 说明 |
|---|---|
| Mandatory 维度 | 必须出现的组合 |
| 层级维度 | 如 国家→省→市(减少组合) |
| 联合维度 | 一起出现的列 |
| 派生维度 | 维表字段投影 |
剪枝目标:
减少 Cuboid 数
减少构建时间与存储3.2 度量优化
| 优化 | 说明 |
|---|---|
| 去重度量 | 用 HyperLogLog 近似 |
| 计数度量 | 预聚合 COUNT |
| 精简度量 | 只建需要的 |
3.3 构建并行
| 参数 | 说明 |
|---|---|
| 资源 | Spark 并行度 |
| 分段 | 按时间分段构建 |
| 调度 | 批量构建 |
四、查询下压
4.1 查询流程
SQL → Kylin
→ 解析(识别 Cube)
→ 下压到对应 Cuboid
→ 直接返回预计算结果
→ 秒级响应4.2 命中规则
| 条件 | 说明 |
|---|---|
| 维度匹配 | 查询维度 ∈ Cuboid |
| 度量匹配 | 查询度量 ∈ 预聚合 |
| 无命中 | 无法加速(需调整 Cube) |
查询未命中:
重新构建或改查询
维度/粒度不匹配4.3 无 Cube 查询
| 情况 | 处理 |
|---|---|
| 未命中 | 走 Hive/其他引擎 |
| 提示 | 建议建 Cube |
五、增量构建
5.1 问题
全量构建:
数据量大 → 构建久
频繁构建 → 资源浪费5.2 增量方案
| 方案 | 说明 |
|---|---|
| 分段构建 | 按时间分区构建 |
| 增量合并 | 新段合并进 Cube |
| 分区裁剪 | 查询合并各段 |
分段:
每日/每小时构建新段
查询合并所有段结果5.3 增量步骤
1. 建立 Cube(含分区列)
2. 每日增量构建当天段
3. 定期合并段(减少段数)
4. 清理过期段| 注意 | 说明 |
|---|---|
| 段粒度 | 与数据频率匹配 |
| 段合并 | 防段数过多 |
| 补数据 | 重建对应段 |
六、与 BI 工具集成
6.1 集成方式
Kylin 提供标准 SQL/OLAP 接口:
JDBC/ODBC
REST API| 工具 | 接入 |
|---|---|
| Tableau | ODBC/JDBC |
| Superset | SQL 连接 |
| 自研 BI | REST API |
| Excel | ODBC |
6.2 使用模式
BI 查询 → Kylin(Cube 命中)→ 秒级
Kylin 内置 SQL 引擎(Calcite)| 优势 | 说明 |
|---|---|
| 透明 | 标准 SQL |
| 快 | 预计算 |
| 大 | 支持百亿级 |
七、架构组件
| 组件 | 职责 |
|---|---|
| Kylin 服务 | 元数据/查询 |
| 构建引擎 | Spark/MapReduce |
| 存储 | HBase/对象存储 |
| 数据源 | Hive/Kafka |
Kylin 4.x:
构建 → Spark(更快)
存储 → Parquet + 对象存储八、适用与限制
8.1 适用
| 场景 | 说明 |
|---|---|
| 固定报表 | 维度确定 |
| 超大历史 | 百亿级聚合 |
| BI 加速 | 报表查询提速 |
8.2 限制
| 限制 | 说明 |
|---|---|
| 构建延迟 | 非实时 |
| 维度爆炸 | 组合多成本高 |
| 动态查询弱 | 未命中无加速 |
| 运维复杂 | 依赖 Hadoop |
常见问题速查
| 问题 | 原因与处理 |
|---|---|
| 构建慢 | 剪枝/并行/分段 |
| 查询不加速 | Cube 未命中 |
| 存储膨胀 | 维度剪枝 |
| 数据新查不到 | 增量构建 |
| 段太多 | 定期合并 |