BUILD任务用于将实时写入的数据转换为历史数据格式。在该过程中会构建索引、清理冗余数据、执行异步DDL任务等,将数据从写优化转变为读优化。
注意事项
BUILD期间,不能执行INSERT OVERWRITE SELECT
导入任务,需等待BUILD任务结束才能执行。
功能说明
BUILD
命令可以对实时写入的数据及其涉及到的历史分区,进行合并、构建索引、执行异步DDL等操作。如果用户通过INSERT/UPDATE/DELETE等修改分区的数据,那么该分区需要执行BUILD,与实时数据结合后,生成新的分区。如果用户没有修改分区的数据,则该分区不会被BUILD任务修改。
BUILD任务开始后,不能停止任务。
当前BUILD任务是以表为粒度进行调度的。BUILD任务开始执行后,表级的BUILD任务会切分为以Shard为粒度的BUILD子任务,每个Shard的3个副本都有一个BUILD子任务,当所有的子任务都执行完成后,BUILD任务完成。不同表的BUILD任务可以并行执行,并行度默认为3。
自动触发BUILD任务
自动触发BUILD任务需要满足以下其中一个条件:
达到最小BUILD时间间隔(数仓版预留模式:0.5小时,数仓版弹性模式:1.5小时,湖仓版:1.5小时),且单表的某个一级分区满足新增数据达到5万条。
距离上次BUILD,时间已过去24小时且至少修改1行数据。
手动触发BUILD任务
可通过以下方式手动触发BUILD任务:
BUILD
BUILD TABLE <table_name>;
只会对变动的分区进行BUILD。
强制全表BUILD
BUILD TABLE <table_name> force = true;
对表的所有分区进行强制BUILD。
指定分区BUILD
BUILD TABLE test force=true partitions='partition1,partition2';
重要仅3.1.6.0及以上版本的集群支持指定分区BUILD。如何查看集群内核版本,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。
当表较大时,
BUILD TABLE <table_name> force = true;
的执行时间会很长。AnalyticDB for MySQL支持通过partition
指定需要BUILD的分区,减少长时间的BUILD资源占用,尽快完成BUILD任务。
配置BUILD自动调度时间
配置方法
SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`<start>,<end>`;
start
和end
取0~24之间的整数,表示在start~end整点时间段内可以调度BUILD任务。可以配置多个时间段,以英文分号(;)隔开。重要该配置只限制任务调度时间段,不限任务执行时间段。即某任务在该时间内调度,会出现因执行时间较长,超出该时间段的情况。
示例
配置0~6点和18~24点调度BUILD任务。
SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6;18,24`;
配置BUILD调度优先级
BUILD调度是按照单表某个一级分区新增数据量排序下发任务,新增数据量大的分区先下发任务,根据下发时间的先后排序执行任务。当需要按业务紧急程度调度BUILD任务时,可以通过Hint或者SET ADB_CONFIG
调整单表或多表BUILD调度的优先级。
仅3.1.5.0及以上版本的集群支持配置BUILD调度的优先级。如何查看集群内核版本,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。
Hint仅支持对单张表配置优先级,且调度优先级仅针对当前提交的任务生效。
SET ADB_CONFIG
既支持对单张表配置优先级,也支持对多张表配置优先级,且优先级一直生效,直至再次配置该表优先级时,才会改变。如果同时使用Hint和
SET ADB_CONFIG
为同一个表配置了不同的优先级,在当前提交的任务中,该表的BUILD调度优先级采纳Hint方式配置的优先级。
BUILD调度的优先级由参数task_priority
控制,取值为整数,默认值为30。数值越大,下发调度的优先级越高。配置优先级后,前端节点在调度BUILD任务时会自动加上优先级。若task_priority
取值小于0,则表示关闭该表自动调度BUILD任务,前端节点不再对该表发起BUILD任务。
配置方法如下:
通过Hint配置BUILD调度的优先级
/*+ build_task_priority = <task_priority> */ BUILD TABLE <db_name>.<table_name>;
例如,配置数据库
adb_demo
中表test
的BUILD调度优先级为30。/*+ build_task_priority = 30 */ Build TABLE adb_demo.test;
通过Config配置BUILD调度的优先级
配置不同数据库中多张表的BUILD调度优先级:
SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.<table1_name>.<task_priority>;<db2_name>.<table2_name>.<task_priority>`;
说明不同的表使用英文分号(;)隔开。
例如,配置数据库
adb_demo1
中表test1
的BUILD调度优先级为30,数据库adb_demo2
中表test2
的BUILD调度优先级为10。SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.test1.30;adb_demo2.test2.10`;
配置同一数据库的所有表具有相同的BUILD调度优先级:
SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.*.<task_priority>`;
例如,配置数据库
adb_demo1
中所有表的BUILD调度优先级均为30。SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.*.30`;
配置同一数据库中某张表与其他表具有不同的BUILD调度优先级:
SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.*.<task_priority>;<db1_name>.<table_name>.<task_priority>`;
例如,配置数据库
adb_demo1
中test1
表的BUILD调度优先级为30,其他所有表的调度优先级为10。SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.*.10;adb_demo1.test1.30`;
您可以通过SHOW ADB_CONFIG查看表当前BUILD调度的优先级。
查看BUILD任务的状态
自动或手动触发BUILD任务后,执行如下SQL,查看最近3天BUILD任务的状态。
SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;
根据status
的值,判断BUILD任务状态。状态说明如下。
| 说明 |
INIT | 任务初始化。 |
RUNNING | 任务运行中。 |
FINISH | 任务已完成。 |