TL;DR
- 场景: 增量构建产生多个小 Segment,需合并优化查询性能并清理过期数据
- 结论: 自动合并 + 保留策略可简化运维,JDBC 方便 BI 工具集成
- 产出: 手动/自动合并操作、保留策略配置、JDBC 查询示例
手动合并(Merge Segment)
操作步骤
- 登录 Kylin Web UI
- 选择目标 Cube
- 点击 Action → Merge
- 选择要合并的连续 Segment
- 提交 Merge Job
合并条件
- 只能合并连续的 Segment
- 所有参与合并的 Segment 状态必须为 READY
- 合并期间不允许其他构建任务
Merge Job 流程
- Extract Fact Table - 读取各 Segment 数据
- Merge Cuboid - 合并 Cuboid 数据
- Convert to HBase - 生成新 HBase 表
- Cleanup - 清理临时文件
自动合并(Auto Merge)
配置位置
在 Cube Designer 的 Refresh Settings 中配置:
多级阈值策略
Auto Merge Thresholds:
- 7 天:每天的小 Segment 自动合并成 7 天
- 28 天:每 7 天的 Segment 自动合并成 28 天
触发机制
- 新 Segment 变为 READY 状态时触发
- 从最大阈值向下尝试合并
- 例如:已有 30 天数据,新 Segment 触发后尝试合并成 28 天
配置示例
{
"auto_merge_time_ranges": "7,28",
"retention_threshold": 90
}
保留策略(Retention Threshold)
作用
自动清理过期不再使用的 Segment,减少存储成本。
计算逻辑
差值 = 最新 Segment 结束时间 - 当前 Segment 结束时间
差值 >= 阈值 → 自动删除
配置示例
{
"retention_threshold": 90 // 保留最近 90 天数据
}
删除 Segment 流程
步骤
- Disable Segment - 禁用 Segment
- Delete Segment - 删除 Segment
注意事项
- 必须先 Disable 再 Delete
- 禁用后 Segment 不参与查询
- 删除后数据不可恢复
JDBC 连接查询
Maven 依赖
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>3.1.1</version>
</dependency>
JDBC 连接示例
import java.sql.*;
public class KylinJDBCDemo {
public static void main(String[] args) throws SQLException {
// 连接 URL 格式:jdbc:kylin://host:port/project
String url = "jdbc:kylin://h122.wzk.icu:7070/wzk_project";
String user = "ADMIN";
String password = "KYLIN";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "SELECT dt, region, SUM(amount) AS total_amount " +
"FROM fact_sales " +
"WHERE dt >= '2024-01-01' AND dt <= '2024-01-31' " +
"GROUP BY dt, region " +
"ORDER BY total_amount DESC";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.printf("%s | %s | %.2f%n",
rs.getString("dt"),
rs.getString("region"),
rs.getDouble("total_amount"));
}
}
}
}
}
查询示例
-- 聚合查询
SELECT dt, category, SUM(amount) AS revenue, COUNT(*) AS orders
FROM fact_sales
JOIN dim_product ON fact_sales.product_id = dim_product.product_id
WHERE dt >= '2024-01-01'
GROUP BY dt, category
ORDER BY revenue DESC
LIMIT 10;
-- 子查询
SELECT region, AVG(avg_amount) AS avg_order_value
FROM (
SELECT region, dt, SUM(amount) AS avg_amount
FROM fact_sales
WHERE dt >= '2024-01-01'
GROUP BY region, dt
) t
GROUP BY region;
错误速查
| 症状 | 根因定位 | 修复 |
|---|---|---|
| Merge 选项灰色不可点击 | Segment 不连续或状态非 READY | 检查 Segment 时间范围 |
| 自动合并未触发 | 阈值配置或触发条件不满足 | 检查 auto_merge_time_ranges 配置 |
| 保留策略未清理 | 差值计算方式理解错误 | 确认阈值与最新 Segment 时间差 |
| Delete 失败 | 未先执行 Disable | 先 Disable 再 Delete |
| JDBC 连接失败 | 驱动/URL/权限问题 | 检查 kylin-jdbc 版本与网络 |
| 查询返回空 | 项目名或 Cube 名错误 | 确认连接 URL 中的项目名称 |