Doris--基础--11--动态分区

Doris–基础–11–动态分区


1、介绍

对表级别的分区实现生命周期管理(TTL),减少用户的使用负担。

1.1、功能

  1. 动态添加分区
  2. 动态删除分区

1.2、原理

在某些使用场景下,用户会将表按照天进行分区划分数据,在没有动态分区功能的时候,用户需要手动管理分区数据。这会给使用方带来额外的维护成本。

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

1.3、局限性

  1. 仅支持 单分区列的分区表 设定动态分区规则

2、使用方式

  1. 可以在 建表时 指定分区规则
  2. 可以在 运行时 修改分区规则

2.1、建表时指定

CREATE TABLE tbl1
(...)
PROPERTIES
(
    "dynamic_partition.prop1" = "value1",
    "dynamic_partition.prop2" = "value2",
    ...
)

2.2、运行时修改

ALTER TABLE tbl1 SET
(
    "dynamic_partition.prop1" = "value1",
    "dynamic_partition.prop2" = "value2",
    ...
)

3、动态分区规则 参数

3.1、配置文件

fe.conf

3.2、参数命名规则

dynamic_partition.参数

3.3、参数

3.3.1、dynamic_partition.enable

  1. 是否开启动态分区特性。
  2. 值:
    1. TRUE(默认)
    2. FALSE:Doris 会忽略该表的动态分区规则。

3.3.2、dynamic_partition.time_unit

  1. 动态分区调度的单位,表示按照什么时间(按天、按星期、按月)进行 分区的创建或分区的删除
  2. 值:
    1. HOUR:
      1. 分区名后缀格式为:yyyyMMddHH,例如2020032501。
      2. 小时为单位的分区列数据类型不能为DATE
    2. DAY:
      1. 分区名后缀格式为: yyyyMMdd,例如20200325。
    3. WEEK:
      1. 分区名后缀格式为: yyyy_ww,即当前日期属于这一年的第几周。
      2. 举例:例如 2020-03-25 创建的分区名后缀为 2020_13, 表明目前为2020年第13周。
    4. MONTH:
      1. 分区名后缀格式为:yyyyMM,例如 202003。

3.3.3、dynamic_partition.time_zone

  1. 动态分区的时区
  2. 默认值:当前机器的系统的时区,例如 Asia/Shanghai

3.3.4、dynamic_partition.start

  1. 动态分区的起始偏移,为负数。根据 time_unit 属性的不同,以当天(星期/月)为基准,分区范围在此偏移之前的分区将会被删除。
  2. 默认值: -2147483648,即不删除历史分区。

3.3.5、dynamic_partition.end

  1. 动态分区的结束偏移,为正数。根据 time_unit 属性的不同,以当天(星期/月)为基准,提前创建对应范围的分区。

3.3.6、dynamic_partition.prefix

  1. 分区名前缀。

3.3.7、dynamic_partition.buckets

  1. 动态创建的分区所对应的分桶数量。

3.3.8、dynamic_partition.replication_num

  1. 动态创建的分区所对应的副本数量
  2. 默认值:该表创建时指定的副本数量。

3.3.9、dynamic_partition.start_day_of_week

  1. 当 time_unit 为 WEEK 时,该参数用于指定每周的起始点。
  2. 值范围:
    1. 1 到 7。
    2. 1 表示周一
    3. 7 表示周日
  3. 默认值:1,即表示每周以周一为起始点。

3.3.10、dynamic_partition.start_day_of_month

  1. 当 time_unit 为 MONTH 时,该参数用于指定每月的起始日期。
  2. 值范围
    1. 1 到 28
    2. 1 表示每月1号
    3. 28 表示每月28号
  3. 默认值:1,即表示每月以1号位起始点。暂不支持以29、30、31号为起始日,以避免因闰年或闰月带来的歧义。

3.4、注意事项

动态分区使用过程中,如果因为一些意外情况导致dynamic_partition.start和dynamic_partition.end 之间的某些分区丢失

  1. 那么 当前时间 与 dynamic_partition.end 之间的丢失分区会被重新创建
  2. 那么 dynamic_partition.start 与 当前时间 之间的丢失分区不会重新创建。

4、演示1

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

4.1、开启动态分区功能

  1. 可以 在fe.conf中设置
  2. 可以 使用命令 修改
  3. 可以 使用http请求 修改

4.1.1、使用http请求 修改

# 开启动态分区功能
curl --location-trusted -u root:123456 -XGET http://node1:8030/api/_set_config?dynamic_partition_enable=true


# 调度时间设置为5秒,意思是每过5秒根据配置刷新分区,这里设置为5秒,真实场景可以设置为12小时
curl --location-trusted -u root:123456 -XGET http://node1:8030/api/_set_config?dynamic_partition_check_interval_seconds=5

4.1.2、使用命令 修改

ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable"="true");
ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds"="5");

Doris--基础--11--动态分区_第1张图片

4.2、创建分区表

4.2.1、创建一张调度单位为天,可以删除历史分区的动态分区表

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"
);


4.2.2、假设当前日期为 2023-02-25。则根据以上规则,tbl1 会产生以下分区:

p20230225: ["2023-02-25", "2023-02-26")
p20230226: ["2023-02-26", "2023-02-27")
p20230227: ["2023-02-27", "2023-02-28")
p20230228: ["2023-02-28", "2023-03-01")

show partitions from order_dynamic_partition1; 

Doris--基础--11--动态分区_第2张图片
Doris--基础--11--动态分区_第3张图片

4.3、分区 变化

  1. 在第二天,即2023-02-26,会创建新的分区 p20230229: [“2023-03-01”, “2023-03-02”)
  2. 在 2023-03-04 时,因为 dynamic_partition.start 设置为 7,则将删除7天前的分区,即删除分区 p20230225

4.3、查看分区表情况,更新最后调度时间

SHOW DYNAMIC PARTITION TABLES; 

Doris--基础--11--动态分区_第4张图片

4.4、插入测试数据

insert into order_dynamic_partition1 values(1,'2023-02-25 11:00:00', 200.0, '北京');
insert into order_dynamic_partition1 values(1,'2023-02-26 11:00:00', 200.0, '北京');
insert into order_dynamic_partition1 values(1,'2023-02-27 11:00:00', 200.0, '北京');

4.5、使用命令查看表下的所有分区

show partitions from order_dynamic_partition1;

Doris--基础--11--动态分区_第5张图片

5、演示2

  1. 表 tbl1,分区列 k1,类型为 date,创建一个动态分区规则。
  2. 按星期分区,只保留最近2个星期的分区,并且预先创建未来2个星期的分区

5.1、创建一张调度单位为周,保留最近两周的分区数据

 
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" = "8"
);

	 

5.2、假设当前日期为 2023-02-15,tbl1 会产生以下分区

因为当前日期为 2023-02-15,是 2023 年的第8周。默认每周起始为星期一。则根于以上规则,tbl1 会产生以下分区

show partitions from order_dynamic_partition1;

Doris--基础--11--动态分区_第6张图片


p2023_08: ["2023-02-20", "2023-02-27")
p2023_09: ["2023-02-27", "2023-03-06")
p2023_10: ["2023-03-06", "2023-03-13")

  1. 每个分区的起始日期为当周的周一

5.3、分区 变化

  1. 在 2023-03-13,即第11周时,会删除2周前的分区,即删除 p2023_08。
  2. 在 2023-03-13,即第11周时,会创建新的分区 p2023_11: [“2023-03-13”, “2023-03-20”)

6、演示3

  1. 表 tbl1,分区列 k1,类型为 DATE,创建一个动态分区规则。
  2. 按月分区,不删除历史分区,并且预先创建未来2个月的分区。同时设定以每月3号为起始日。

6.1、创建一张调度单位为月,不删除历史数据

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"
);

  1. 因为没有设置 dynamic_partition.start,则不会删除历史分区。

6.2、假设当前日期为 2023-02-15,tbl1 会产生以下分区

show partitions from order_dynamic_partition3;

Doris--基础--11--动态分区_第7张图片

	
p202302: ["2023-02-03", "2023-03-03")
p202303: ["2023-03-03", "2023-04-03")
p202304: ["2023-04-03", "2023-05-03")

7、查看动态分区表调度情况

MySQL [test_db]> SHOW DYNAMIC PARTITION TABLES\G;
*************************** 1. row ***************************
             TableName: order_dynamic_partition2
                Enable: true
              TimeUnit: WEEK
                 Start: -2
                   End: 2
                Prefix: p
               Buckets: 8
        ReplicationNum: 3
     ReplicaAllocation: tag.location.default: 3
               StartOf: MONDAY
        LastUpdateTime: 2023-02-25 17:41:11
     LastSchedulerTime: 2023-02-25 18:05:41
                 State: NORMAL
LastCreatePartitionMsg: NULL
  LastDropPartitionMsg: NULL
ReservedHistoryPeriods: NULL
*************************** 2. row ***************************
......
*************************** 3. row ***************************
...... 

  1. LastUpdateTime: 最后一次修改动态分区属性的时间
  2. LastSchedulerTime: 最后一次执行动态分区调度的时间
  3. State: 最后一次执行动态分区调度的状态
  4. LastCreatePartitionMsg: 最后一次执行动态添加分区调度的错误信息
  5. LastDropPartitionMsg: 最后一次执行动态删除分区调度的错误信息

你可能感兴趣的:(Doris,数据库,linux,运维)