Apache Doris的动态分区dynamic_partition

1. 背景

表按date或datetime类型字段进行分区,对于新的数据,需要我们手动添加分区,和删除旧的分区,维护工作量太大。所以Apache Doris启动了一个后台进程,默认每隔1小时(由fe.conf的dynamic_partition_check_interval_seconds参数设置)根据当前的日期时间来添加分区和删除分区

动态分区只支持Range分区

2. 创建动态分区表

表创建于2021-11-05 22:30:00,星期五

mysql> 
mysql> create table dynamic_partition(
    -> user_id bigint,
    -> partition_datetime datetime,
    -> send_msg varchar(512)
    -> )
    -> unique key(user_id, partition_datetime)
    -> partition by range(partition_datetime) ()
    -> distributed by hash(user_id)
    -> properties
    -> (
    -> 'dynamic_partition.enable' = 'true',
    -> 'dynamic_partition.time_unit' = 'week',
    -> 'dynamic_partition.start' = '-1',
    -> 'dynamic_partition.end' = '2',
    -> 'dynamic_partition.prefix' = 'p_week',
    -> 'dynamic_partition.buckets' = '10'
    -> );
Query OK, 0 rows affected (0.10 sec)

mysql> 
  • 每周划分成一个分区,数据的插入根据partition_datetime字段来判断进入哪个partition
  • 到2021-11-08 星期一,又会添加一个分区[(‘2021-11-22 00:00:00’), (‘2021-11-29 00:00:00’))
  • 到2021-11-15 星期一,会添加一个分区[(‘2021-11-29 00:00:00’), (‘2021-12-06 00:00:00’)),也会删除分区p_week2021_45
  • 如果将dynamic_partition.end设置为15,在年交汇的时间会有如下分区现象:
mysql> show create table dynamic_partition;
......省略部分......
PARTITION p_week2021_53 VALUES [('2021-12-27 00:00:00'), ('2022-01-03 00:00:00')),
PARTITION p_week2022_02 VALUES [('2022-01-03 00:00:00'), ('2022-01-10 00:00:00')),
......省略部分......
1 row in set (0.00 sec)

mysql> 

建表语句执行完的分区结果如下:

PARTITION p_week2021_45 VALUES [('2021-11-01 00:00:00'), ('2021-11-08 00:00:00')),
PARTITION p_week2021_46 VALUES [('2021-11-08 00:00:00'), ('2021-11-15 00:00:00')),
PARTITION p_week2021_47 VALUES [('2021-11-15 00:00:00'), ('2021-11-22 00:00:00'))

3. 动态分区表的查看

查看分区的调度情况

mysql> show dynamic partition tables;
+-------------------+--------+----------+-------+------+--------+---------+----------------+-------------------------+---------+---------------------+---------------------+--------+------------------------+----------------------+------------------------+
| TableName         | Enable | TimeUnit | Start | End  | Prefix | Buckets | ReplicationNum | ReplicaAllocation       | StartOf | LastUpdateTime      | LastSchedulerTime   | State  | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |
+-------------------+--------+----------+-------+------+--------+---------+----------------+-------------------------+---------+---------------------+---------------------+--------+------------------------+----------------------+------------------------+
| dynamic_partition | true   | WEEK     | -1    | 2    | p_week | 10      | 3              | tag.location.default: 3 | MONDAY  | 2021-11-05 22:30:00 | 2021-11-05 22:30:00 | NORMAL | NULL                   | NULL                 | NULL                   |
+-------------------+--------+----------+-------+------+--------+---------+----------------+-------------------------+---------+---------------------+---------------------+--------+------------------------+----------------------+------------------------+
1 row in set (0.01 sec)

mysql>

字段说明如下:

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

查看表的分区

mysql> show partitions from dynamic_partition;

4. 动态分区表属性说明

  • 目前仅支持对一个date或datetime时间分区列进行动态分区。如果是date时间字段,分区粒度不能是小时hour
  • dynamic_partition.time_unit:分区时间单位可以是hour、day、week、month,各分区单位对应的分区后缀如下:
    • hour:yyyyMMddHH
    • day:yyyyMMdd
    • week:yyyy_ww,ww指这一年的第几周。针对于dynamic_partition.start_day_of_week:取值范围为1-7,默认为1,表示周一为每周的起始点
    • month:yyyyMM。dynamic_partition.start_day_of_month:取值范围为1-28,默认为1,表示1号为每月的起始点
  • dynamic_partition.start:以基准日期为准,删除指定分区单位之前的分区。默认不删除分区
  • dynamic_partition.end:以基准日期为准,创建指定分区单位内的分区。如将当前时间和dynamic_partition.end之间的分区删除,则在下次定时动态分区操作时将会创建缺失的分区
  • dynamic_partition.start_day_of_week:当time_unit为WEEK时,该参数用于指定每周的起始点。取值为1 ~ 7。其中1(默认)表示周一,7表示周日
  • dynamic_partition.start_day_of_month:当time_unit为MONTH时,该参数用于指定每月的起始日期。取值为1 ~ 28。其中1(默认)表示每月1号,28表示每月28号
  • dynamic_partition.replication_num:默认为建表时的副本数量

下面是历史分区的参数:

  • dynamic_partition.create_history_partition:默认为false,即创建表的时候不会创建历史分区,只会创建当前和未来的分区。当置为true时,Doris会自动创建所有分区,当期望创建的分区个数大于max_dynamic_partition_num(默认500)值时,操作将被禁止。当不指定start属性时,该参数不生效

  • dynamic_partition.history_partition_num:该参数用于指定创建历史分区数量。默认值为-1, 不进行设置,以start属性为准。如果设置了则以当前值为准,但必须小于等于start属性的绝对值

  • dynamic_partition.hot_partition_num:指定当前和最近的历史分区共多少个分区为热分区,但未来的分区都是热分区。对于热分区,系统会自动设置其storage_medium参数为SSD,并且设置storage_cooldown_time

  • dynamic_partition.reserved_history_periods:需要保留的历史分区的时间范围,不会被后台的定时任务删除。默认为"NULL"。当dynamic_partition.time_unit设置为"DAY/WEEK/MONTH"时,需要以[yyyy-MM-dd,yyyy-MM-dd],[…,…]格式进行设置,例如'dynamic_partition.reserved_history_periods' = '[2022-06-01,2022-06-15],[2022-07-01,2022-07-15]'。当dynamic_partition.time_unit设置为"HOUR"时,需要以[yyyy-MM-dd HH:mm:ss,yyyyMM-dd HH:mm:ss],[…,…]的格式来进行设置,例如'reserved_history_periods' = '[2022-07-01 00:00:00,2022-07-01 03:00:00]'

4.1 dynamic_partition_check_interval_seconds

定时检测分区是否符合创建或删除的条件,如果符合,则创建或删除。默认时间为1小时(3600秒)。修改方式有以下几种:

  1. 在fe.conf中进行修改,然后重启FE
  2. 通过mysql命令:admin set frontend config('dynamic_partition_check_interval_seconds' = '7200');

5. 动态分区表属性的修改

mysql>
mysql> alter table dynamic_partition set
    -> (
    -> 'dynamic_partition.time_unit' = 'month',
    -> 'dynamic_partition.start' = '-5',
    -> 'dynamic_partition.prefix' = 'p_month'
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> 

修改后的表分区情况如下:

PARTITION p_week2021_45 VALUES [('2021-11-01 00:00:00'), ('2021-11-08 00:00:00')),
PARTITION p_week2021_46 VALUES [('2021-11-08 00:00:00'), ('2021-11-15 00:00:00')),
PARTITION p_week2021_47 VALUES [('2021-11-15 00:00:00'), ('2021-11-22 00:00:00')),
PARTITION p_month202112 VALUES [('2021-12-01 00:00:00'), ('2022-01-01 00:00:00')),
PARTITION p_month202201 VALUES [('2022-01-01 00:00:00'), ('2022-02-01 00:00:00'))
  • 11月因为和之前已经创建的分区,时间相冲突,所以不会被创建。但11月22号到11月30号这段空白时间区间需要用户自己手动补上

5.1 动态分区表和手动分区表相互转换

一个表要么为动态分区表,要么为手动分区表

  • 手动分区表转换为动态分区表:可以通过alter table dynamic_partition set设置动态分区表的属性,来转化为动态分区表。注意:如果设置了dynamic_partition.start属性,则在分区单位之前的分区将会被自动删除
  • 动态分区表转换为手动分区表:可以通过命令alter table dynamic_partition set ('dynamic_partition.enable' = 'false');,来转化为手动分区表

6. 动态分区注意事项

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值