TL;DR

  • 场景: 增量构建产生多个小 Segment,需合并优化查询性能并清理过期数据
  • 结论: 自动合并 + 保留策略可简化运维,JDBC 方便 BI 工具集成
  • 产出: 手动/自动合并操作、保留策略配置、JDBC 查询示例

手动合并(Merge Segment)

操作步骤

  1. 登录 Kylin Web UI
  2. 选择目标 Cube
  3. 点击 ActionMerge
  4. 选择要合并的连续 Segment
  5. 提交 Merge Job

合并条件

  • 只能合并连续的 Segment
  • 所有参与合并的 Segment 状态必须为 READY
  • 合并期间不允许其他构建任务

Merge Job 流程

  1. Extract Fact Table - 读取各 Segment 数据
  2. Merge Cuboid - 合并 Cuboid 数据
  3. Convert to HBase - 生成新 HBase 表
  4. Cleanup - 清理临时文件

自动合并(Auto Merge)

配置位置

在 Cube Designer 的 Refresh Settings 中配置:

多级阈值策略

Auto Merge Thresholds:
- 7 天:每天的小 Segment 自动合并成 7 天
- 28 天:每 7 天的 Segment 自动合并成 28 天

触发机制

  1. 新 Segment 变为 READY 状态时触发
  2. 从最大阈值向下尝试合并
  3. 例如:已有 30 天数据,新 Segment 触发后尝试合并成 28 天

配置示例

{
  "auto_merge_time_ranges": "7,28",
  "retention_threshold": 90
}

保留策略(Retention Threshold)

作用

自动清理过期不再使用的 Segment,减少存储成本。

计算逻辑

差值 = 最新 Segment 结束时间 - 当前 Segment 结束时间
差值 >= 阈值 → 自动删除

配置示例

{
  "retention_threshold": 90  // 保留最近 90 天数据
}

删除 Segment 流程

步骤

  1. Disable Segment - 禁用 Segment
  2. 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 中的项目名称