Doris--动态分区

本文详细介绍了Doris数据库的动态分区功能,包括原理、使用方式、规则参数(如enable、time_unit、start、end等)、创建历史分区参数以及示例。帮助用户理解如何配置和管理动态分区以降低维护成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原理

  • 动态分区是在 Doris 0.12 版本中引入的功能。旨在对表级别的分区实现生命周期管理 (TTL),减少用户的使用负担。
  • 目前实现了动态添加分区及动态删除分区的功能。动态分区只支持 Range 分区
  • 在某些使用场景下,用户会将表按照天进行分区划分,每天定时执行例行任务,这时需要使用方手动管理分区,否则可能由于使用方没有创建分区导致数据导入失败,这给使用方带来了额外的维护成本。
  • 通过动态分区功能,用户可以在建表时设定动态分区的规则。FE 会启动一个后台线程, 根据用户指定的规则创建或删除分区。用户也可以在运行时对现有规则进行变更。

二、使用方式

  • 动态分区的规则可以在建表时指定,或者在运行时进行修改
  • 当前仅支持对单分区列的 分区表设定动态分区规则。
  • 建表时指定
CREATE TABLE tbl1
(...)
PROPERTIES
(
"dynamic_partition.prop1" = "value1", 
"dynamic_partition.prop2" = "value2", 
...
)
  • 运行时修改
ALTER TABLE tbl1 SET
(
"dynamic_partition.prop1" = "value1",
"dynamic_partition.prop2" = "value2",
...
)
 

三、动态分区规则参数

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

3.1 主要参数

dynamic_partition.enable是否开启动态分区特性,可指定 true 或 false,默认为 true
dynamic_partition.time_unit动态分区调度的单位,可指定 HOUR、DAY、WEEK、MONTHHOUR,后缀格式为 yyyyMMddHH,分区列数据类型不能为 DATE。DAY,后缀格式为 yyyyMMdd。WEEK,后缀格式为 yyyy_ww。即当前日期属于这一年的第几周。 MONTH,后缀格式为 yyyyMM。
dynamic_partition.time_zone动态分区的时区,如果不填写,则默认为当前机器的系统的时区
dynamic_partition.start动态分区的起始偏移,为负数。根据 time_unit 属性的不同,以当 天(星期/月)为基准,分区范围在此偏移之前的分区将会被删除。 如果不填写默认值为 Interger.Min_VALUE 即-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 号 为起始日,以避免因闰年或闰月带来的歧义

3.2 创建历史分区的参数

dynamic_partition.create_history_partition默认为 false。当置为 true 时,Doris 会自动创建所有分区,当期望创建的分区个数大于 max_dynamic_partition_num 值时,操作将被禁止。当不指定 start 属性时,该参数不生效。
dynamic_partition.history_partition_num当 create_history_partition 为 true 时,该参数用于指定创建历史分区数量。默认值为 - 1, 即未设置。
dynamic_partition.hot_partition_num指定最新的多少个分区为热分区。hot_partition_num 是往前 n 天和未来所有分区。对于热分区,系统会自动设置其 storage_medium 参数为 SSD,并且设置 storage_cooldown_time。
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”。

dynamic_partition.hot_partition_num

  • hot_partition_num 是往前 n 天和未来所有分区
  • 我们举例说明。假设今天是 2021-05-20,按天分区,动态分区的属性设置为: hot_partition_num=2, end=3, start=-3。则系统会自动创建以下分区,并且设置 storage_medium 和 storage_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

dynamic_partition.reserved_history_periods

  • 需要保留的历史分区的时间范围。
  • reserved_history_periods 的每一个 […,…] 是一对设置项,两者需要同时被设置,且第一个时间不能大于第二个时间。
  • 我们举例说明。假设今天是 2021-09-06,按天分类,
动态分区的属性设置为:
time_unit="DAY/WEEK/MONTH", 
end=3, 
start=-3,  
reserved_history_periods="[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"

则系统会自动保留:
["2020-06-01","2020-06-20"],
["2020-10-31","2020-11-15"]


或者
time_unit="HOUR", 
end=3, 
start=-3, 
reserved_history_periods="[2020-06-01 00:00:00,2020-06-01 03:00:00]" 

则系统会自动保留:
["2020-06-01 00:00:00","2020-06-01 03:00:00"]

3.3 创建历史分区规则

  • 假设需要创建的历史分区数量为 expect_create_partition_num,根据不同的设置具体数量如下:
    • create_history_partition = true
      • dynamic_partition.history_partition_num 未设置,即 -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)时,禁止
      创建过多分区。

3.4 创建历史分区举例

  • 假设今天是 2021-05-20,按天分区,动态分区的属性设置为:create_history_partition=true,
    end=3, start=-3, history_partition_num=1,则系统会自动创建以下分区:
p20210519
p20210520
p20210521
p20210522
p20210523
  • history_partition_num=5,其余属性与 1 中保持一直,则系统会自动创建以下分区:
p20210517
p20210518
p20210519
p20210520
p20210521
p20210522
p20210523
  • history_partition_num=-1 即不设置历史分区数量,其余属性与 1 中保持一直,则系统 会自动创建以下分区:
p20210517
p20210518
p20210519
p20210520
p20210521
p20210522
p20210523 

3.5 注意事项

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

四、示例

-- step1:创建动态分区表
-- 分区列 time 类型为 DATE,创建一个动态分区规则。
-- 按天分区,只保留最近 7 天的分区,并且预先创建未来 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"
 )
 ;

-- step2:查看动态分区表调度情况
show dynamic partition tables;

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


-- step3:查看表的分区
show partitions from student_dynamic_partition1;

-- step4:插入测试数据,可以全部成功(修改成对应时间)

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

-- step5:设置创建历史分区
ALTER TABLE student_dynamic_partition1 
SET ("dynamic_partition.create_history_partition" = "true");

-- 查看分区情况
show partitions from student_dynamic_partition1;

-- step6:动态分区表与手动分区表相互转换
对于一个表来说,动态分区和手动分区可以自由转换,但二者不能同时存在,有且只有一种状态。
(1)手动分区转换为动态分区
如果一个表在创建时未指定动态分区,可以通过 ALTER TABLE 在运行时修改动态分区相关属性来转化为动态分区,具体示例可以通过 HELP ALTER TABLE 查看。 
注意:如果已设定 dynamic_partition.start,分区范围在动态分区起始偏移之前的历史分区将会被删除。
(2)动态分区转换为手动分区
ALTER TABLE tbl_name SET ("dynamic_partition.enable" = "false")
关闭动态分区功能后,Doris 将不再自动管理分区,需要用户手动通过 ALTER TABLE 的方式创建或删除分区。

<think>好的,我现在需要处理用户关于Apache Doris的查询。首先,用户提供了两个引用链接,我需要仔细查看这些资料,确保回答准确。用户希望了解Apache Doris数据库介绍和使用场景,所以得从这两个方面入手。 先看引用[1],里面提到Apache Doris的前身是百度Doris团队开发的,后来部分成员离职创业,基于之前的版本做了DorisDB,也就是StarRocks的前身。这可能涉及Doris的起源和发展历程,需要在介绍部分提到。同时,引用中还提到了Doris的使用场景,比如实时数据分析、多维度查询等,这些是用户关心的重点,需要详细说明。 引用[2]是关于单机部署流程的,里面提到了下载二进制安装包、传输到Linux系统,以及具体的wget命令。这部分内容可能需要放在使用部分,比如部署步骤,但用户的问题主要是介绍和使用场景,所以可能需要简要提及部署方法,或者作为使用的一部分。 接下来,我需要组织回答结构。根据用户的要求,回答需要结构清晰,分点说明。先介绍Apache Doris的基本情况,包括定义、特点和适用场景。然后说明其使用场景,具体举几个例子,比如实时数据分析、日志分析、数据仓库等,每个场景可以简要说明Doris的优势所在。最后,可能需要提到如何部署或使用,但根据用户的问题,可能不需要太详细的步骤,而是概括性的描述,比如支持标准SQL、高并发查询等。 需要注意的是,用户要求使用中文回答,并且行内数学公式用$...$,独立公式用$$...$$。不过当前问题涉及数据库技术,可能数学公式较少,但如果有性能指标或算法,可能需要用LaTeX表达。例如,如果提到查询延迟在毫秒级,可以写成$<100ms$。不过目前资料中没有涉及太多数学内容,可能需要根据情况处理。 另外,用户要求生成相关问题,需要根据回答内容提出几个相关问题,比如技术架构、性能优化、应用案例等。需要确保问题与Doris相关,并且能够引导用户进一步探索。 检查是否有遗漏的信息。引用[1]中提到Doris适用于实时分析、多维度查询和高并发场景,这些都需要在回答中体现。引用[2]中的部署步骤可能作为使用部分的一个小点,但用户可能更关注应用场景而非具体安装步骤,所以可能简要提及部署简便即可。 最后,确保回答符合格式要求,没有使用markdown,分点清晰,正确引用来源。引用标识要放在相关句子的末尾,例如在介绍使用场景时引用[^1],在部署方法时引用[^2]。 总结回答结构: 1. Apache Doris简介:定义、起源、特点。 2. 核心特点:列式存储、MPP架构、易用性、高性能。 3. 使用场景:实时分析、日志分析、数据仓库、即席查询。 4. 使用方式:部署、数据导入、查询。 5. 相关问题。 现在需要将这些内容用中文流畅表达,并自然插入引用标识。确保技术术语准确,比如MPP架构、OLAP等。同时,避免使用复杂术语时适当解释,比如说明列式存储的优势,提高查询效率。</think>### Apache Doris 数据库介绍 Apache Doris 是一款高性能、实时的分析型数据库,适用于在线分析处理(OLAP)场景。其前身是百度 Doris 团队开发的分布式数据库系统,后成为 Apache 顶级项目。Doris 采用**列式存储**和**MPP(大规模并行处理)架构**,支持高并发查询、实时数据更新和多维分析,具备低延迟(毫秒级响应)和高吞吐量的特点[^1]。 #### 核心特点 1. **列式存储与压缩**:数据按列存储,减少 I/O 开销,并通过压缩算法降低存储成本。 2. **分布式 MPP 架构**:支持水平扩展,节点间并行计算,适用于 PB 级数据分析。 3. **易用性**:兼容 MySQL 协议,支持标准 SQL,提供与 BI 工具无缝集成。 4. **实时性**:支持数据实时写入与查询,适用于流批一体场景。 ### 使用场景 1. **实时数据分析** - 例如:电商实时订单分析、广告点击率统计,支持在数据写入后 $<1s$ 内查询[^1]。 2. **日志分析** - 快速分析海量日志数据,如用户行为日志、系统监控日志。 3. **数据仓库加速** - 作为查询加速层,提升传统数据仓库(如 Hive)的响应速度。 4. **即席查询(Ad-hoc)** - 支持复杂多维度查询,满足业务灵活分析需求。 ### 如何使用 1. **部署** - 通过二进制安装包快速部署单机或集群环境,支持 Linux 系统(参考命令): ```bash wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.1.7-bin-x64.tar.gz ``` [^2] 2. **数据导入** - 支持 Kafka、MySQL、HDFS 等多种数据源,通过 Broker Load 或 Stream Load 实现实时/批量导入。 3. **查询** - 使用标准 SQL 或 BI 工具(如 Tableau)直接连接 Doris 进行数据分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值