TL;DR
- 场景: 业务数据每日新增,需增量构建 Cube 而非全量重算
- 结论: 增量构建显著降低构建时间,查询时自动跨 Segment 聚合
- 产出: 增量构建完整流程、Segment 管理策略、查询差异对比
增量构建核心概念
为什么需要增量构建
在实际业务场景中,Hive 表中的数据通常是持续增长的:
- 每日新增分区数据
- 历史数据基本不变
- 全量构建会重复计算历史数据,浪费资源
增量构建允许只处理新增时间范围的数据,避免对历史数据的重复计算。
Segment 是什么
Kylin 将 Cube 按时间范围划分为多个 Segment:
- 每个 Segment 对应一个 HBase 表
- 每个 Segment 代表一个特定时间段的预计算数据
- 查询时 Kylin 会自动聚合多个 Segment 的结果
增量构建流程
1. 创建分区表
CREATE TABLE fact_sales (
order_id STRING,
region_id STRING,
product_id STRING,
amount DECIMAL(18,2),
quantity INT
) PARTITIONED BY (dt STRING) -- 日期分区
STORED AS PARQUET;
-- 插入测试数据
INSERT INTO fact_sales PARTITION (dt='2024-01-01')
SELECT 'o001', 'r001', 'p001', 100.0, 1;
INSERT INTO fact_sales PARTITION (dt='2024-01-02')
SELECT 'o002', 'r002', 'p002', 200.0, 2;
2. 在 Kylin 中加载表
# 刷新元数据,加载新表
curl -X POST --user ADMIN:KYLIN \
http://h122.wzk.icu:7070/kylin/api/tables/refresh
3. 创建 Model(带分区字段)
在 Kylin Web UI 创建 Model:
- 事实表: fact_sales
- 分区字段: dt(Partition Date Column)
- 维度: region_id, product_id
- 度量: SUM(amount), SUM(quantity)
4. 创建 Cube
基于 Model 创建 Cube,配置与普通 Cube 相同。
5. 增量构建 Segment
首次构建(Full Build)
# 首次全量构建
curl -X PUT --user ADMIN:KYLIN \
-H "Content-Type:application/json;charset=utf-8" \
-d '{
"startTime": "",
"endTime": "20240101000000",
"buildType": "BUILD"
}' \
http://h122.wzk.icu:7070/kylin/api/cubes/ecommerce_cube/build
第二次增量构建
# 增量构建第二天数据
curl -X PUT --user ADMIN:KYLIN \
-H "Content-Type:application/json;charset=utf-8" \
-d '{
"startTime": "20240101000000",
"endTime": "20240102000000",
"buildType": "BUILD"
}' \
http://h122.wzk.icu:7070/kylin/api/cubes/ecommerce_cube/build
第三次增量构建
# 增量构建第三天数据
curl -X PUT --user ADMIN:KYLIN \
-H "Content-Type:application/json;charset=utf-8" \
-d '{
"startTime": "20240102000000",
"endTime": "20240103000000",
"buildType": "BUILD"
}' \
http://h122.wzk.icu:7070/kylin/api/cubes/ecommerce_cube/build
全量 vs 增量对比
构建差异
| 特性 | 全量构建 | 增量构建 |
|---|---|---|
| Segment 数量 | 1个 | 多个(随构建增加) |
| 构建时间 | 长(每次全量计算) | 短(仅计算新增数据) |
| 存储 | 集中 | 分散在多个 Segment |
| 历史数据 | 每次重算 | 保持不变 |
查询差异
全量构建查询:
- 只涉及一个 Segment
- 直接返回结果
增量构建查询:
- 涉及多个 Segment
- Kylin 在查询时进行运行时聚合
- 示例:查 1月1日~1月3日总和 = Segment1 + Segment2 + Segment3
-- 增量构建后,查询语法不变
SELECT dt, SUM(amount)
FROM fact_sales
WHERE dt BETWEEN '2024-01-01' AND '2024-01-03'
GROUP BY dt;
Segment 管理
查看 Segment
在 Kylin Web UI 的 Model 页面,可以看到 Cube 的所有 Segment:
- Segment 名称
- 时间范围(Start Time ~ End Time)
- 状态(NEW/READY/ERROR)
- 大小
Segment 合并
多个小 Segment 可以合并成一个大 Segment,减少查询时的聚合开销:
# 合并 Segment
curl -X PUT --user ADMIN:KYLIN \
-H "Content-Type:application/json;charset=utf-8" \
-d '{
"mergeStartTime": "20240101000000",
"mergeEndTime": "20240103000000"
}' \
http://h122.wzk.icu:7070/kylin/api/cubes/ecommerce_cube/merge
自动合并策略
在 Cube Designer 的 Refresh Settings 中配置:
- Auto Merge Thresholds: 7天、28天
- 新 Segment 变为 READY 时自动触发合并
错误速查
| 症状 | 根因定位 | 修复 |
|---|---|---|
| 增量构建失败 | 分区数据不存在 | 确认 Hive 分区已创建 |
| 查询结果不准 | Segment 时间范围重叠 | 检查构建时间范围是否连续 |
| 查询变慢 | Segment 过多 | 配置自动合并,减少 Segment 数量 |
| 构建报错无权限 | Kerberos/权限问题 | 检查 Hive/HBase 访问权限 |
| Segment 状态为 ERROR | 构建过程异常 | 查看 Job 日志定位问题 |