动态分区是在 Doris 0.12 版本中引入的新功能。旨在对表级别的分区实现生命周期管理(TTL),减少用户的使用负担。
目前实现了动态添加分区及动态删除分区的功能。
1 原理
在某些使用场景下,用户会将表按照天进行分区划分,每天定时执行例行任务,这时需要使用方手动管理分区,否则可能由于使用方没有创建分区导致数据导入失败,这给使用方带来了额外的维护成本。
通过动态分区功能,用户可以在建表时设定动态分区的规则。FE 会启动一个后台线程,根据用户指定的规则创建或删除分区。用户也可以在运行时对现有规则进行变更。
2 使用方式
动态分区的规则可以在建表时指定,或者在运行时进行修改。当前仅支持对单分区列的分区表设定动态分区规则。
建表时指定:
CREATE TABLE tbl1
(...)
PROPERTIES
(
"dynamic_partition.prop1" = "value1",
"dynamic_partition.prop2" = "value2",
...
)
运行时修改:
ALTER TABLE tbl1 SET
(
"dynamic_partition.prop1" = "value1",
"dynamic_partition.prop2" = "value2",
...
)
3 动态分区规则参数
在实现上,需要修改fe.conf配置文件,动态分区的规则参数都以 dynamic_partition. 为前缀:
- dynamic_partition.enable
是否开启动态分区特性。可指定为 TRUE 或 FALSE。如果不填写,默认为 TRUE。如果为 FALSE,则 Doris 会忽略该表的动态分区规则。
- dynamic_partition.time_unit
动态分区调度的单位。可指定为 HOUR、DAY、WEEK、MONTH。分别表示按天、按星期、按月进行分区创建或删除。
- 当指定为 HOUR 时,动态创建的分区名后缀格式为 yyyyMMddHH,例如2020032501。小时为单位的分区列数据类型不能为 DATE。
- 当指定为 DAY 时,动态创建的分区名后缀格式为 yyyyMMdd,例如20200325。
- 当指定为 WEEK 时,动态创建的分区名后缀格式为yyyy_ww。即当前日期属于这一年的第几周,例如 2020-03-25 创建的分区名后缀为 2020_13, 表明目前为2020年第13周。
- 当指定为 MONTH 时,动态创建的分区名后缀格式为 yyyyMM,例如 202003。
- dynamic_partition.time_zone
动态分区的时区,如果不填写,则默认为当前机器的系统的时区,例如 Asia/Shanghai,如果想获取当前支持的时区设置,可以参考 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones。
- dynamic_partition.start
动态分区的起始偏移,为负数。根据 time_unit 属性的不同,以当天(星期/月)为基准,分区范围在此偏移之前的分区将会被删除。如果不填写,则默认为 -2147483648,即不删除历史分区。
- dynamic_partition.end
动态分区的结束偏移,为正数。根据 time_unit 属性的不同,以当天(星期/月)为基准,提前创建对应范围的分区。
- dynamic_partition.prefix
动态创建的分区名前缀。
- dynamic_partition.buckets
动态创建的分区所对应的分桶数量。
- dynamic_partition.replication_num
动态创建的分区所对应的副本数量,如果不填写,则默认为该表创建时指定的副本数量。
- dynamic_partition.start_day_of_week
当 time_unit 为 WEEK 时,该参数用于指定每周的起始点。取值为 1 到 7。其中 1 表示周一,7 表示周日。默认为 1,即表示每周以周一为起始点。
- dynamic_partition.start_day_of_month
当 time_unit 为 MONTH 时,该参数用于指定每月的起始日期。取值为 1 到 28。其中 1 表示每月1号,28 表示每月28号。默认为 1,即表示每月以1号位起始点。暂不支持以29、30、31号为起始日,以避免因闰年或闰月带来的歧义。
注意事项:
动态分区使用过程中,如果因为一些意外情况导致dynamic_partition.start和dynamic_partition.end 之间的某些分区丢失,那么当前时间与 dynamic_partition.end 之间的丢失分区会被重新创建,dynamic_partition.start与当前时间之间的丢失分区不会重新创建。
4 开启分区功能
开启动态分区功能,可以在fe.conf中设置dynamic_partition.enable=true,也可以使用命令进行修改,使用命令修改,并dynamic_partition_check_interval_seconds调度时间设置为5秒,意思是每过5秒根据配置刷新分区,这里设置为5秒,真实场景可以设置为12小时
4.1 使用命令
linux下命令
curl --location-trusted -u root:123456 -XGET http://node01:8030/api/_set_config?dynamic_partition_enable=true
curl --location-trusted -u root:123456 -XGET http://node01:8030/api/_set_config?dynamic_partition_check_interval_seconds=5
或者进入Doris
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable"="true");
ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds"="5");
4.2 创建调度单位为天的分区
创建一张调度单位为天,可以删除历史分区的动态分区表
-- 创建一张调度单位为天,可以删除历史分区的动态分区表
CREATE TABLE order_dynamic_partition1
(
id int,
time date,
money double,
areaName varchar(50)
)
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"
);
查看分区表情况SHOW DYNAMIC PARTITIONS TABLES,更新最后调度时间
-- 查看分区表情况SHOW DYNAMIC PARTITIONS TABLES,更新最后调度时间
SHOW DYNAMIC PARTITION TABLES;
设当前日期为 2023-04-29。则根据以上规则,tbl1 会产生以下分区:
p20230429: ["2023-04-29", "2023-04-30")
p20230430: ["2023-04-30", "2023-05-01")
p20230501: ["2023-05-01", "2023-05-02")
p20230502: ["2023-05-02", "2023-05-03")
在第二天,即 2023-04-30,会创建新的分区 p20230430: ["2023-04-30", "2023-05-01")
在 2023-04-29 时,因为 dynamic_partition.start 设置为 7,则将删除7天前的分区,即删除分区 p20230428。
插入数据测试
insert into order_dynamic_partition1 values(4,'2023-04-29 11:00:00', 300.0, '深圳');
insert into order_dynamic_partition1 values(1,'2023-04-30 11:00:00', 100.0, '北京');
insert into order_dynamic_partition1 values(2,'2023-05-01 11:00:00', 200.0, '上海');
insert into order_dynamic_partition1 values(3,'2023-05-02 11:00:00', 500.0, '广州');
使用命令查看表下的所有分区:
show partitions from order_dynamic_partition1;
查询分区数据
select * from order_dynamic_partition1;
4.3 创建调度单位为星期的分区
按星期分区,只保留最近2个星期的分区,并且预先创建未来2个星期的分区
表分区列 k1 类型为 DATETIME,创建一个动态分区规则。按星期分区,只保留最近2个星期的分区,并且预先创建未来2个星期的分区
-- 创建一张调度单位为周,保留最近两周的分区数据
CREATE TABLE order_dynamic_partition2
(
id int,
time date,
money double,
areaName varchar(50)
)
duplicate key(id,time)
PARTITION BY RANGE(time)()
DISTRIBUTED BY HASH(id) buckets 10
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "WEEK",
"dynamic_partition.start" = "-2",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "10"
);
假设当前日期为 2023-04-29,是 2023 年的第 17 周。默认每周起始为星期一。则根于以上规则,order_dynamic_partition2会产生以下分区:
p2023_17: ["2023-04-24 00:00:00", "2023-05-01 00:00:00")
p2023_18: ["2023-05-01 00:00:00", "2023-05-08 00:00:00")
p2023_19: ["2023-05-08 00:00:00", "2023-05-15 00:00:00")
其中每个分区的起始日期为当周的周一。同时,因为分区列 k1 的类型为 DATETIME,则分区值会补全时分秒部分,且皆为 0。
在 2023-05-15,即第19周时,会删除2周前的分区,即删除 p2023_17。
在上面的例子中,假设用户指定了周起始日为 "dynamic_partition.start_day_of_week" = "3",即以每周三为起始日。则分区如下:
p2023_17: ["2023-04-26 00:00:00", "2023-05-03 00:00:00")
p2023_18: ["2023-05-03 00:00:00", "2023-05-10 00:00:00")
p2023_19: ["2023-05-10 00:00:00", "2023-05-17 00:00:00")
即分区范围为当周的周三到下周的周二。
注:2022-12-31 和 2023-01-01 在同一周内,如果分区的起始日期为 2022-12-31,则分区名为 p2022_53,如果分区的起始日期为 2023-01-01,则分区名为 p2023_01。
4.4 创建调度单位为月的分区
表分区列 k1 类型为 DATE,创建一个动态分区规则。按月分区,不删除历史分区,并且预先创建未来2个月的分区。同时设定以每月3号为起始日。
创建一张调度单位为月,不删除历史数据
-- 创建一张调度单位为月,不删除历史数据
CREATE TABLE order_dynamic_partition3
(
id int,
time date,
money double,
areaName varchar(50)
)
duplicate key(id,time)
PARTITION BY RANGE(time)()
DISTRIBUTED BY HASH(id) buckets 10
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.start_day_of_month" = "3"
);
假设当前日期为 2023-04-29。则根于以上规则,会产生以下分区:
p202304: ["2023-04-03", "2023-05-03")
p202305: ["2023-05-03", "2023-06-03")
p202306: ["2023-06-03", "2023-07-03")
因为没有设置 dynamic_partition.start,则不会删除历史分区。
假设今天为 2023-04-20,并设置以每月28号为起始日,则分区范围为:
p202304: ["2023-04-28", "2023-05-28")
p202305: ["2023-05-28", "2023-06-28")
p202306: ["2023-06-28", "2023-07-28")
5 查看动态分区表调度情况
通过以下命令可以进一步查看当前数据库下,所有动态分区表的调度情况:
SHOW DYNAMIC PARTITION TABLES;
- LastUpdateTime: 最后一次修改动态分区属性的时间
- LastSchedulerTime: 最后一次执行动态分区调度的时间
- State: 最后一次执行动态分区调度的状态
- LastCreatePartitionMsg: 最后一次执行动态添加分区调度的错误信息
- LastDropPartitionMsg: 最后一次执行动态删除分区调度的错误信息