BUILD

更新时间:

BUILD任务用于将实时写入的数据转换为历史数据格式。在该过程中会构建索引、清理冗余数据、执行异步DDL任务等,将数据从写优化转变为读优化。

功能说明

BUILD命令可以对实时写入的数据及其涉及到的历史分区执行合并、构建索引、执行异步DDL等操作。如果用户通过INSERT、UPDATE、DELETE等修改分区的数据,那么该分区需要执行BUILD,与实时数据结合后,生成新的分区。如果用户没有修改分区的数据,则该分区不会被BUILD任务修改。

当前BUILD任务调度是以表为粒度的,不同表的BUILD任务可以并行执行。当BUILD任务开始执行后,表级的BUILD任务会切分为以Shard为粒度的BUILD子任务,每个Shard3个副本都有一个BUILD子任务,当所有的子任务都执行完成后,BUILD任务完成。

注意事项

  • BUILD期间,该表不能执行INSERT OVERWRITE SELECT导入任务,需等待BUILD任务结束才能执行。如果有写入需求,可以使用INSERT INTO导入。

  • BUILD任务提交后,不支持取消。

  • BUILD任务的并发数默认为核数(Core)/3,向上取整。不支持修改BUILD任务的并发数。

    例如,集群规格为32128 GB,则BUILD任务的并发数为32/3向上取整,即并发数为11。

  • BUILD期间可能会消耗CPU、内存和IO资源,CPU使用率和磁盘IO使用率等磁盘相关指标均会增加,在BUILD任务结束后,这些指标会回归业务正常值。建议您在业务低峰期执行BUILD任务。

自动触发BUILD任务

若集群满足以下条件中的任意一条,会立即触发BUILD任务:

  • 达到最小BUILD时间间隔,且单表的某个一级分区满足新增数据达到5万条。

    • 企业版、基础版或湖仓版BUILD时间间隔:1.5小时。

    • 数仓版弹性模式BUILD时间间隔:1.5小时。

    • 数仓版预留模式BUILD时间间隔:0.5小时。

  • 距离上次BUILD,时间已过去24小时且至少修改1行数据。

手动触发BUILD任务

可通过以下方式手动触发不同的BUILD任务:

  • 变动分区BUILD

    BUILD TABLE <table_name>;

    只会对变动的分区执行BUILD。

  • 指定分区BUILD

    BUILD TABLE test force partitions='partition1,partition2';
    重要

    3.1.6.0及以上版本的集群支持指定分区BUILD。如何查看集群内核版本,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。

    当表较大时,BUILD TABLE <table_name> force = true;的执行时间会很长。AnalyticDB for MySQL支持通过partitions指定需要BUILD的分区,减少长时间的BUILD资源占用,尽快完成BUILD任务。

  • 强制全表BUILD

    BUILD TABLE <table_name> force = true;

    强制全表BUILD将对全表所有分区的数据重新构建索引。该功能默认关闭。

    重要

    强制全表BUILD将对全表所有存量数据重新构建索引,耗时久,建议您使用指定分区BUILD功能若需使用强制全表BUILD功能,请谨慎评估系统风险后提交工单开启该功能。

配置BUILD自动调度时间

  • 配置方法

    SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`<start>,<end>`;

    startend取值为0~24之间的整数,需使用反引号(``)引起来,表示在start~end时间段内调度BUILD任务。可以配置多个时间段,多个时间段以英文分号(;)隔开。

    例如,startend分别配置为06,则表明在0:00~6:59时间段内调度BUILD任务。

    重要

    该配置只限制任务调度时间段,不限任务执行时间段。即某任务在该时间内调度,会出现因执行时间较长,超出该时间段的情况。

  • 示例

    配置0~6点和18~22点调度BUILD任务。

    SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6;18,22`;

    执行上述SQL后,集群会在0:00~6:5918:00~22:59时间段调度BUILD任务。

配置BUILD调度优先级

BUILD调度是按照单表某个一级分区新增数据量排序下发任务,新增数据量大的分区先下发任务,根据下发时间的先后排序执行任务。当需要按业务紧急程度调度BUILD任务时,可以通过Hint或者SET ADB_CONFIG调整单表或多表BUILD调度的优先级。

重要
  • 3.1.5.0及以上版本的集群支持配置BUILD调度的优先级。

    • 查看企业版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

    • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

  • Hint仅支持对单张表配置优先级,且调度优先级仅针对当前提交的任务生效。

  • SET ADB_CONFIG既支持对单张表配置优先级,也支持对多张表配置优先级,且优先级一直生效,直至再次配置该表优先级时,才会改变。

  • 如果同时使用HintSET ADB_CONFIG为同一个表配置了不同的优先级,在当前提交的任务中,该表的BUILD调度优先级采纳Hint方式配置的优先级。

BUILD调度的优先级由参数task_priority控制,取值为整数,默认值为0。数值越大,下发调度的优先级越高。配置优先级后,前端节点在调度BUILD任务时会自动加上优先级。若task_priority取值小于0,则表示关闭该表自动调度BUILD任务,前端节点不再对该表发起BUILD任务。

配置方法如下:

  • 通过Hint配置BUILD调度的优先级

    /*build_task_priority = <task_priority> */ BUILD TABLE <db_name>.<table_name>;

    例如,配置数据库adb_demo中表testBUILD调度优先级为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中表test1BUILD调度优先级为30,数据库adb_demo2中表test2BUILD调度优先级为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_demo1test1表的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,查看最近3BUILD任务的状态。

SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;

根据status的值,判断BUILD任务状态。状态说明如下。

status

说明

INIT

任务初始化。

RUNNING

任务运行中。

FINISH

任务已完成。

常见问题

为什么BUILD自动调度时间的配置没有生效

原因:可能在配置参数时将反引号写成了正引号,导致参数解析错误。

解决方案:使用SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD命令配置调度参数时,需要将startend参数用反引号(``)引起来。例如SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6`;,表示在0:00~6:59时间段内调度BUILD任务。