kylin智能构建工具

1. 背景介绍

Kylin作为OLAP on Hadoop的标准,查询和构建作为Kylin的两个主要功能,可以通过Kylin的界面或者调用Kylin的RestApi、odbc和Jdbc等方式查询,构建也可以通过Kylin界面或者RestApi进行调用,但构建也会有不同类型的任务,也会遇到一些异常,如:segment overlap、构建异常或构建任务已经在执行。

本文介绍的就是调用Kylin丰富的RestApi实现一个智能的构建工具。

2. 解决问题

使用Kylin进行构建时,主要会遇到下面这类问题:

  1. 频繁需要人工调用界面构建cube
  2. 自动处理构建cube中遇到的各种状况,如:已经构建、构建失败、已经有任务在执行。
  3. 构建时,还有不同的构建时间范围,如全量构建、增量构建或按指定周期构建等。

那这个时候,就需要一个能智能处理各类状况,完成不同类型构建的工具了。

3. 工具处理流程

image

4. 所使用到的RestApi

Kylin提供了全面的RestApi,可以用来查询模型,触发构建任务,执行SQL查询,获取元数据等,基于这些API,第三方系统可以与KAP紧密集成。

在智能构建工具中,需要调用到的几个不同Api有:

  1. 构建Cube-无分区
  2. 构建Cube-日期分区
  3. 删除Cube segment
  4. 查询Cube segment信息
  5. 查询构建任务状态
  6. 返回构建Job每步输出
  7. 恢复构建Job

5. 支持的功能

  • [x] 支持全量构建和增量构建
  • [x] 多种任务状态的处理
    1. 对于已经构建的Cube或segment,则刷新segment
    2. 对于正在执行的Cube或segment,则继续检测状态。
    3. 对于构建失败的Cube或segment,则恢复任务重新构建
    4. 对于已经构建了部分segment,则删除重新构建。
  • [x] 多种日期参数支持
    1. 月初至今
    2. 日、周、月、年
    3. 任意前后整数日期
  • [x] 完整的任务日志监控

6. 工具实现

6.1 segment判断

根据提交的构建任务的时间范围,判断当前cube中已经存在的segment的状态,以及是否有正在执行的任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
String str = KylinRestAPIUtil.sendGet(CommonUtils.KYLIN_HOST + "/kylin/api/cubes/" + cubeName + "/segments");
JSONObject result = JSONObject.parseObject(str);
JSONObject data = result.getJSONObject("data");
JSONArray array = data.getJSONArray("segments");
int size = array.size();
for (int i = 0; i < size; i++) {
JSONObject segment = array.getJSONObject(i);
...
String status = segment.getString("status");
if (// 分区时间跟提交的任务构建范围一致) {
if (status.equals("READY")) {
// 已经构建,需要刷新
...
} else {
// 相同分区正在构建,继续检查状态
...
}
} else if (// 分区在提交的任务构建范围内) {
// 存在子分区,刷新构建
...
} else if (// 分区时间与构建范围有交叉) {
// 已经构建,但分区时间不匹配,退出执行
...
}
}

6.2 提交构建任务

通过kylin api,指定参数提交构建任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
JSONObject json = new JSONObject();
json.put("startTime", startTime);
json.put("endTime", endTime);
json.put("buildType", "BUILD");
json.put("project", projectName);
// 1. 发起构建任务
String str = KAPRestAPIUtil.sendPut(CommonUtils.KYLIN_HOST + "/kylin/api/cubes/" + cubeName
+ "/segments/build", json.toJSONString());

JSONObject result = JSONObject.parseObject(str);
String code = result.getString("code");
JSONObject data = result.getJSONObject("data");
if (code.equals("000")) {
logger.info("构建任务提交成功");
} else {
logger.error("构建任务提交失败:" + result.getString("msg"));
System.exit(-1);
}

6.3 检测任务状态

通过kylin api,获取cube构建任务的状态

1
2
3
4
5
6
7
8
9
10
11
12
String str = KylinRestAPIUtil.sendGet(CommonUtils.KYLIN_HOST + "/kylin/api/jobs/" + uuid);
JSONObject result = JSONObject.parseObject(str);
status = result.getString("job_status");
String progress = result.getString("progress").split("\\.")[0] + "%";
if (status.equals("FINISHED")) {
// 任务完成
} else if (status.equals("PENDING") || status.equals("RUNNING")) {
// 任务运行中,继续检测状态
} else if (status.equals("DISCARDED") || status.equals("ERROR") || status.equals("STOPPED")) {
// 任务失败,获取失败步骤日志
} else {
// 其他异常

7. 使用示例

7.1 配合Crontab

1
2
3
crontab -e
// 每天0点执行,构建T+1的cube kylin_sales
0 0 * * * java -jar kylin_cube_utils.jar kylin_sales day `date +%Y-%m-%d`

7.2 运行日志

1
暂无,待补充

8. 智能调度工具带来的好处

结合contrl-M、crontab等调度工具,传入Cube名称、构建类型和构建日期,定时调用智能构建程序,自动处理构建中的各种情况,在出现异常时,也能很好的获取异常日志,无需后台查询,提高了Kylin的使用效率。