在大数据的领域里面,我们经常会听说分区的概念,例如hive的分区是我们经常遇到的。今天介绍下Doris的动态分区。Doris的分区partition在前面已经介绍过了,暂时不做过多的介绍。
我们知道在doris中创建表的时候我们可以直接指定分区,例如:
CREATE TABLE `user` ( `id` int(10) COMMENT "唯一id", `name` varchar(20) COMMENT "", `idcard` varchar(18) COMMENT "身份证", `age` TINYINT(3) NULL COMMENT "年龄", `cts` DATE NOT NULL COMMENT "数据创建时间" ) DUPLICATE KEY(`id`, `name`,`idcard`,`age`) PARTITION BY RANGE(`cts`) ( PARTITION p202201 VALUES LESS THAN ('2022-02-01'), PARTITION p202202 VALUES LESS THAN ('2022-03-01'), PARTITION p202203 VALUES LESS THAN ('2022-04-01') ) DISTRIBUTED BY HASH(`id`) BUCKETS 10 PROPERTIES ( "replication_num" = "1", "in_memory" = "false", "storage_format" = "V2" )
像上面这个案例,我们为user表创建了3个分区,每个分区以月为单位。但是设想一下,假设我们现在有一个业务,需要每个月把数据保存到当前月的分区里面。如果用上面的表的话,那么他是没有5月份的分区的,那么5月份的数据如何存储呢?我们是不是只能在5月1日之前手动再去新增一个分区(关于手动新增分区可以查看 这里)?但是如果遇到4月底有事情耽误了,或者忘记了这个事情,那怎么办呢?到时候就只能再手动操作原来的数据表做补救了,那有没有办法可以自动创建分区呢?这样子到了5月份,数据就会自动进入到5月份的分区里面去。
答案是有的,就是这篇文章动态分区。
doris的动态分区就是我们在创建表的时候指定下分区规则,那么doris每天会定时的执行例行的任务,如果分区不存在,则会自动创建分区。所以这样子就免去了我们很多烦恼。下面我们演示下创建动态分区。
CREATE TABLE user_login_logs ( log_id INT, log_msg VARCHAR ( 255 ), client_ip VARCHAR ( 20 ), service_name VARCHAR ( 20 ), log_cts DATETIME ) PARTITION BY RANGE ( log_cts ) () DISTRIBUTED BY HASH ( client_ip ) PROPERTIES ( "replication_allocation" = "tag.location.default: 1", "dynamic_partition.replication_allocation" = "tag.location.default: 1", "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-7", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.buckets" = "32" );
下面介绍下这些参数。
1)CREATE TABLE user_login_logs
这里就是正常的创建表即可
2)PARTITION BY RANGE(log_cts) ()
这里我们需要指定分区的字段,根据上面的场景来看,主要是使用时间类进行分区。
3)DISTRIBUTED BY HASH(client_ip)
根据实际业务来,像这个业务的话,我们是每一个agent在采集日志,所以我习惯使用这种客户端ip来操作。
4)properties
这里面主要是配置分区的规则,下面详细介绍下:
序号 | 参数 | 说明 |
1 | dynamic_partition.enable | 是否开启动态分区特性。可指定为 TRUE 或 FALSE。如果不填写,默认为 TRUE。如果为 FALSE,则 Doris 会忽略该表的动态分区规则。 |
2 | dynamic_partition.time_unit | 动态分区调度的单位。可指定为 HOUR、DAY、WEEK、MONTH。分别表示按小时、按天、按星期、按月进行分区创建或删除。 |
3 | dynamic_partition.time_zone | 动态分区的时区,如果不填写,则默认为当前机器的系统的时区,例如 Asia/Shanghai |
4 | dynamic_partition.start | 动态分区的起始偏移,为负数。根据 time_unit 属性的不同,以当天(星期/月)为基准,分区范围在此偏移之前的分区将会被删除。如果不填写,则默认为 -2147483648,即不删除历史分区。 |
5 | dynamic_partition.end | 动态分区的结束偏移,为正数。根据 time_unit 属性的不同,以当天(星期/月)为基准,提前创建对应范围的分区。 |
6 | dynamic_partition.prefix | 动态创建的分区名前缀。 |
7 | dynamic_partition.buckets | 动态创建的分区所对应的分桶数量。 |
8 | dynamic_partition.replication_num | 动态创建的分区所对应的副本数量,如果不填写,则默认为该表创建时指定的副本数量。 |
9 | dynamic_partition.start_day_of_week | 当 time_unit 为 WEEK 时,该参数用于指定每周的起始点。取值为 1 到 7。其中 1 表示周一,7 表示周日。默认为 1,即表示每周以周一为起始点。 |
10 | dynamic_partition.start_day_of_month | 当 time_unit 为 MONTH 时,该参数用于指定每月的起始日期。 |
11 | dynamic_partition.create_history_partition | 默认为 false。当置为 true 时,Doris 会自动创建所有分区,具体创建规则见下文。同时,FE 的参数 max_dynamic_partition_num 会限制总分区数量,以避免一次性创建过多分区。当期望创建的分区个数大于 max_dynamic_partition_num 值时,操作将被禁止。 当不指定 start 属性时,该参数不生效。 |
12 | dynamic_partition.history_partition_num | 当 create_history_partition 为 true 时,该参数用于指定创建历史分区数量。默认值为 -1, 即未设置。 |
13 | dynamic_partition.hot_partition_num | 指定最新的多少个分区为热分区。对于热分区,系统会自动设置其 storage_medium 参数为SSD,并且设置 storage_cooldown_time。 |
14 | dynamic_partition.reserved_history_periods | 需要保留的历史分区的时间范围。当dynamic_partition.time_unit 设置为 "DAY/WEEK/MONTH" 时,需要以 [yyyy-MM-dd,yyyy-MM-dd],[...,...] 格式进行设置。当dynamic_partition.time_unit 设置为 "HOUR" 时,需要以 [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...,...] 的格式来进行设置。如果不设置,默认为 "NULL"。 |
参数挺多的,但是一般使用示例的那几个即可。具体根据实际情况使用。
备注:
1、在这里还有另外两个参数很重要,即: "replication_allocation" = "tag.location.default: 1"和"dynamic_partition.replication_allocation" = "tag.location.default: 1" 。这两个主要是副本的数量。在官网的示例里面没有列举出来这两个参数,如果用户的doris集群be数量大于等于3个不加这两个参数是没问题的,因为这两个参数的值默认是3,如果be的数量不足3,我们会看到表创建成功了,但是确看不到数据,这就是表没有创建成功,因此也不会出现分区。
然后我们看下当前创建的表的分区。
可以看到分区被自动创建了,此时我们插入一条数据
insert into user_login_logs values(1,'张三登录了','192.168.0.1','user-service','2022-11-09 12:00:00')
也是没有任何问题的。
最后再总结下:
1、如果需要使用动态分区,那么一定要在fe.conf文件夹下配置如下选项:
dynamic_partition_enable=true dynamic_partition_check_interval_seconds=600
如果没有配置enable=true,我们是无法创建动态分区表的。
2、创建完动态分区表之后,我们一定要使用如下的sql语句查看下分区是否被正确自动创建
show partitions from table_name
3、记得start的使用,如果我们不希望自动删除掉历史的数据,那么就不要配置start这个参数。
还没有评论,来说两句吧...