BUILD

更新时间:

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>`;

    startend取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_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,查看最近3天BUILD任务的状态。

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

任务已完成。