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 日志定位问题