• 【大数据 - Doris 实践】数据表的基本使用(四):动态分区


    动态分区是在 Doris 0.12 版本中引入的新功能。旨在对表级别的分区实现生命周期管理(Time to LiveTTL),减少用户的使用负担。

    目前实现了 动态添加分区动态删除分区 的功能。动态分区只支持 Range 分区。

    1.原理

    在某些使用场景下,用户会将表按照天进行分区划分,每天定时执行例行任务,这时需要使用方手动管理分区,否则可能由于使用方没有创建分区导致数据导入失败,这给使用方带来了额外的维护成本。

    通过动态分区功能,用户可以在建表时设定动态分区的规则。FE 会启动一个后台线程,根据用户指定的规则创建或删除分区。用户也可以在运行时对现有规则进行变更。

    2.使用方式

    动态分区的规则可以在建表时指定,或者在运行时进行修改。当前仅支持对单分区列的分区表设定动态分区规则。

    建表时指定:

    CREATE TABLE tbl1
    ...
    PROPERTIES
    (
    	"dynamic_partition.prop1" = "value1",
    	"dynamic_partition.prop2" = "value2",
    	...
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行时修改:

    ALTER TABLE tbl1 SET
    (
    	"dynamic_partition.prop1" = "value1",
    	"dynamic_partition.prop2" = "value2",
    	...
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.动态分区规则参数

    3.1 主要参数

    动态分区的规则参数都以 dynamic_partition. 为前缀:

    参数名解释
    dynamic_partition.enable是否开启动态分区特性,可指定 truefalse,默认为 true
    dynamic_partition.time_unit动态分区调度的单位,可指定 HOUR、DAY、WEEK、MONTH。HOUR 的后缀格式为 yyyyMMddHH,分区列数据类型不能为 DATE。DAY 的后缀格式为 yyyyMMdd。WEEK 的后缀格式为 yyyy_ww,即当前日期属于这一年的第几周。MONTH 的后缀格式为 yyyyMM
    dynamic_partition.time_zone动态分区的时区,如果不填写,则默认为当前机器的系统的时区
    dynamic_partition.start动态分区的起始偏移,为负数。根据 time_unit 属性的不同,以当天(星期 / 月)为基准,分区范围在此偏移之前的分区将会被删除。如果不填写,默认值为 Interger.Min_VALUE,即 − 2147483648 -2147483648 2147483648,即不删除历史分区
    dynamic_partition.end动态分区的结束偏移,为正数。根据 time_unit 属性的不同,以当天(星期 / 月)为基准,提前创建对应范围的分区
    dynamic_partition.prefix动态创建的分区名前缀
    dynamic_partition.buckets动态创建的分区所对应分桶数量
    dynamic_partition.replication_num动态创建的分区所对应的副本数量。如果不填写,则默认为该表创建时指定的副本数量
    dynamic_partition.start_day_of_weektime_unit 为 WEEK 时,该参数用于指定每周的起始点。取值为 1 1 1 7 7 7。其中 1 1 1 表示周一, 7 7 7 表示周日。默认为 1 1 1,即表示每周以周一为起始点
    dynamic_partition.start_day_of_monthtime_unit 为 MONTH 时,该参数用于指定每月的起始日期。取值为 1 1 1 28 28 28。其中 1 1 1 表示每月 1 1 1 号, 28 28 28 表示每月 28 28 28 号。默认为 1 1 1,即表示每月以 1 1 1 号位起始点。暂不支持以 29 29 29 30 30 30 31 31 31 号为起始日,以避免因闰年或闰月带来的歧义

    3.2 创建历史分区的参数

    • dynamic_partition.create_history_partition:默认为 false。当置为 true 时,Doris 会自动创建所有分区,当期望创建的分区个数大于 max_dynamic_partition_num 值时,操作将被禁止。当不指定 start 属性时,该参数不生效。

    • dynamic_partition.history_partition_num:当 create_history_partitiontrue 时,该参数用于指定创建历史分区数量。默认值为 − 1 -1 1, 即未设置。

    • dynamic_partition.hot_partition_num:指定最新的多少个分区为热分区。对于热分区,系统会自动设置其 storage_medium 参数为 SSD,并且设置 storage_cooldown_timehot_partition_num 是往前 n n n 天和未来所有分区。

    我们举例说明。假设今天是 2021-05-20,按天分区,动态分区的属性设置为:hot_partition_num=2end=3start=-3。则系统会自动创建以下分区,并且设置 storage_mediumstorage_cooldown_time 参数:

    p20210517 : ["2021-05-17", "2021-05-18") storage_medium=HDD storage_cooldown_time=9999-12-31 23:59:59
    p20210518 : ["2021-05-18", "2021-05-19") storage_medium=HDD storage_cooldown_time=9999-12-31 23:59:59
    p20210519 : ["2021-05-19", "2021-05-20") storage_medium=SSD storage_cooldown_time=2021-05-21 00:00:00
    p20210520 : ["2021-05-20", "2021-05-21") storage_medium=SSD storage_cooldown_time=2021-05-22 00:00:00
    p20210521 : ["2021-05-21", "2021-05-22") storage_medium=SSD storage_cooldown_time=2021-05-23 00:00:00
    p20210522 : ["2021-05-22", "2021-05-23") storage_medium=SSD storage_cooldown_time=2021-05-24 00:00:00
    p20210523 : ["2021-05-23", "2021-05-24") storage_medium=SSD storage_cooldown_time=2021-05-25 00:00:00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • dynamic_partition.reserved_history_periods:需要保留的历史分区的时间范围。
      • dynamic_partition.time_unit 设置为 “DAY/WEEK/MONTH/YEAR” 时,需要以 [yyyy-MM-dd,yyyy-MM-dd], […,…] 格式进行设置。
      • dynamic_partition.time_unit 设置为 “HOUR” 时,需要以 [yyyy-MM-dd HH:mm:ss,yyyyMM-dd HH:mm:ss], […,…] 的格式来进行设置。如果不设置,默认为 NULL。

    举例说明,假设今天是 2021-09-06,按天分类,动态分区的属性设置为:

    time_unit = "DAY/WEEK/MONTH/YEAR", end=3, start=-3,
    reserved_history_periods = "[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"
    
    • 1
    • 2

    则系统会自动保留:

    ["2020-06-01","2020-06-20"], 
    ["2020-10-31","2020-11-15"]
    
    • 1
    • 2

    或者

    time_unit = "HOUR", end=3, start=-3,
    reserved_history_periods = "[2020-06-01 00:00:00,2020-06-01 03:00:00]"
    
    • 1
    • 2

    则系统会自动保留:

    ["2020-06-01 00:00:00","2020-06-01 03:00:00"]
    
    • 1

    这两个时间段的分区。其中,reserved_history_periods 的每一个 […,…] 是一对设置项,两者需要同时被设置,且第一个时间不能大于第二个时间。

    3.3 创建历史分区规则

    假设需要创建的历史分区数量为 expect_create_partition_num,根据不同的设置具体数量如下:

    • create_history_partition = true
      • dynamic_partition.history_partition_num 未设置,即 − 1 -1 1。则 expect_create_partition_num = end - start
      • dynamic_partition.history_partition_num 已设置,则 expect_create_partition_num = end - max(start, -histoty_partition_num)
    • create_history_partition = false,不会创建历史分区,expect_create_partition_num = end - 0
    • expect_create_partition_num > max_dynamic_partition_num(默认 500 500 500)时,禁止创建过多分区。

    3.4 创建历史分区举例

    (1)假设今天是 2021-05-20,按天分区,动态分区的属性设置为:create_history_partition=trueend=3start=-3history_partition_num = 1,则系统会自动创建以下分区:

    p20210519
    p20210520
    p20210521
    p20210522
    p20210523
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (2)history_partition_num = 5,其余属性与(1)保持一致,则系统会自动创建以下分区:

    p20210517
    p20210518
    p20210519
    p20210520
    p20210521
    p20210522
    p20210523
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)history_partition_num = -1,即不设置历史分区数量,其余属性与(1)保持一致,则系统会自动创建以下分区:

    p20210517
    p20210518
    p20210519
    p20210520
    p20210521
    p20210522
    p20210523
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 注意事项

    动态分区使用过程中, 如果因为一些意外情况导致 dynamic_partition.startdynamic_partition.end 之间的某些分区丢失,那么当前时间与 dynamic_partition.end 之间的丢失分区会被重新创建,dynamic_partition.start 与当前时间之间的丢失分区不会重新创建。

    4.示例

    4.1 创建动态分区表

    分区列 time 类型为 DATE,创建一个动态分区规则。按天分区,只保留最近 7 7 7 天的分区,并且预先创建未来 3 3 3 天的分区。

    create table student_dynamic_partition1
    (
    	id int,
    	time date,
    	name varchar(50),
    	age int
    )
    duplicate key(id,time)
    PARTITION BY RANGE(time)()
    DISTRIBUTED BY HASH(id) buckets 10
    PROPERTIES(
    	"dynamic_partition.enable" = "true",
    	"dynamic_partition.time_unit" = "DAY",
    	"dynamic_partition.start" = "-7",
    	"dynamic_partition.end" = "3",
    	"dynamic_partition.prefix" = "p",
    	"dynamic_partition.buckets" = "10",
    	"replication_num" = "1"
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4.2 查看动态分区表调度情况

    mysql> SHOW DYNAMIC PARTITION TABLES;
    +-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
    | TableName | Enable | TimeUnit | Start       | End  | Prefix | Buckets | StartOf   | LastUpdateTime | LastSchedulerTime   | State  | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods  |
    +-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
    | d3        | true   | WEEK     | -3          | 3    | p      | 1       | MONDAY    | N/A            | 2020-05-25 14:29:24 | NORMAL | N/A                    | N/A                  | [2021-12-01,2021-12-31] |
    | d5        | true   | DAY      | -7          | 3    | p      | 32      | N/A       | N/A            | 2020-05-25 14:29:24 | NORMAL | N/A                    | N/A                  | NULL                    |
    | d4        | true   | WEEK     | -3          | 3    | p      | 1       | WEDNESDAY | N/A            | 2020-05-25 14:29:24 | NORMAL | N/A                    | N/A                  | NULL                    | 
    | d6        | true   | MONTH    | -2147483648 | 2    | p      | 8       | 3rd       | N/A            | 2020-05-25 14:29:24 | NORMAL | N/A                    | N/A                  | NULL                    |
    | d2        | true   | DAY      | -3          | 3    | p      | 32      | N/A       | N/A            | 2020-05-25 14:29:24 | NORMAL | N/A                    | N/A                  | NULL                    |
    | d7        | true   | MONTH    | -2147483648 | 5    | p      | 8       | 24th      | N/A            | 2020-05-25 14:29:24 | NORMAL | N/A                    | N/A                  | NULL                    |
    +-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
    7 rows in set (0.02 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • LastUpdateTime:最后一次修改动态分区属性的时间。
    • LastSchedulerTime:最后一次执行动态分区调度的时间。
    • State:最后一次执行动态分区调度的状态。
    • LastCreatePartitionMsg:最后一次执行动态添加分区调度的错误信息。
    • LastDropPartitionMsg:最后一次执行动态删除分区调度的错误信息。

    4.3 查看表的分区

    SHOW PARTITIONS FROM student_dynamic_partition1;
    
    • 1

    4.4 插入测试数据

    insert into student_dynamic_partition1 values(1,'2022-03-31 11:00:00','name1',18);
    insert into student_dynamic_partition1 values(1,'2022-04-01 11:00:00','name1',18);
    insert into student_dynamic_partition1 values(1,'2022-04-02 11:00:00','name1',18);
    
    • 1
    • 2
    • 3

    4.5 设置创建历史分区

    ALTER TABLE student_dynamic_partition1 SET 
    (
    	"dynamic_partition.create_history_partition" = "true"
    );
    
    • 1
    • 2
    • 3
    • 4

    4.6 动态分区表与手动分区表相互转换

    对于一个表来说,动态分区和手动分区可以自由转换,但二者不能同时存在,有且只有一种状态。

    4.6.1 手动分区转换为动态分区

    如果一个表在创建时未指定动态分区,可以通过 ALTER TABLE 在运行时修改动态分区相关属性来转化为动态分区,具体示例可以通过 HELP ALTER TABLE 查看。

    注意:如果已设定 dynamic_partition.start,分区范围在动态分区起始偏移之前的历史分区将会被删除。

    4.6.2 动态分区转换为手动分区

    ALTER TABLE tbl_name SET ("dynamic_partition.enable" = "false") 
    
    • 1

    关闭动态分区功能后,Doris 将不再自动管理分区,需要用户手动通过 ALTER TABLE 的方式创建或删除分区。

  • 相关阅读:
    LeetCode 290. 单词规律
    uniapp使用pinia状态管理永久缓存方法
    WebAssembly与Rust:高性能计算的前端应用
    HttpServletRequest对象与RequestDispatcher对象
    论文精读:GHM:Gradient Harmonized Single-stage Detector
    Docker部署
    MySQL学习(二)——MySQL内置函数
    [附源码]Python计算机毕业设计Django社区生活废品回收APP
    遥感图像应用:在低分辨率图像上实现洪水损害检测(迁移学习)
    Nmap列举远程机器开放的端口
  • 原文地址:https://blog.csdn.net/be_racle/article/details/133968528