Doris 数据划分:分区与分桶策略全解析

embedded/2025/3/14 7:48:30/

在这里插入图片描述
Doris 的分布式架构里,数据划分策略是实现高效存储和查询的关键所在。它主要依靠分区(Partition)和分桶(Bucket)这两层逻辑划分,对数据的分布进行精细化管理。本文将深入探讨这两种策略的设计思路、实际应用场景以及常见问题的解决办法。

一、分区策略:数据管理的逻辑基石

1. 分区的类型

Range 分区:按照指定列的数值范围对数据进行划分,比较适合时间序列数据或者连续数值型数据的场景。例如,我们可以按月对数据进行分区,像 202501、202502 这样的分区设置。

List 分区:依据列的具体值来分配数据,这种方式更适用于离散值的场景,比如根据省份或者城市来进行分区。

2. 分区的模式

手动分区:用户可以通过ALTER语句来灵活地创建或者调整分区,这种模式在数据管理方面具有很强的可控性。

动态分区:系统会根据预先设定的时间规则自动生成新的分区,不过需要用户提前定义好分区的范围。

自动分区:当数据写入时,系统会自动创建对应的分区,但这种模式需要用户对分区的数量进行严格监控,以防止出现脏数据的问题。

3. 分区的优势

提升查询性能:在查询过程中,系统可以通过分区裁剪快速过滤掉无关的数据,从而减少 I/O 的开销。

简化数据管理:用户能够针对不同的分区进行独立操作,比如删除旧数据或者进行冷热分层存储等。

二、分桶策略:数据分布的物理优化

1. 分桶的方式

Hash 分桶:系统会对分桶列的值计算哈希值,然后根据分桶数量取模,将数据均匀地分布到各个分片中。这种方式适用于 JOIN 或者聚合查询的场景。


推荐在以下场景中使用 Hash 分桶:

  • 业务需求频繁基于某个字段进行过滤时,可将该字段作为分桶键,利用 Hash 分桶提高查询效率。
  • 当表中的数据分布较为均匀时,Hash 分桶同样是一种有效的选择。

Random 分桶:数据会被随机分配到不同的分片中,当处理小规模数据时,可以使用load_to_single_tablet参数来优化写入速度。


在以下场景中,建议使用 Random 分桶:

  • 在任意维度分析的场景中,业务没有特别针对某一列频繁进行过滤或关联查询时,可以选择 Random 分桶;
  • 当经常查询的列或组合列数据分布极其不均匀时,使用 Random 分桶可以避免数据倾斜。
  • Random 分桶无法根据分桶键进行剪裁,会扫描命中分区的所有数据,不建议在点查场景下使用;
  • 只有 DUPLICATE 表可以使用 Random 分区,UNIQUE 与 AGGREGATE 表无法使用 Random 分桶;

2. 分桶的作用

避免数据倾斜:Hash 分桶能够让数据在物理存储上更加均匀,从而减少热点问题的出现。

增强查询并行度:合理设置分桶数量可以充分利用计算资源,提升查询的并发处理能力。

优化 Colocate Join:如果多个表采用相同的分桶键和分桶数量,那么在进行 JOIN 操作时,可以减少跨节点的数据传输。

三、常见问题及应对策略

1. 数据倾斜问题

当数据分布不均匀时,会导致某些分片的负载过高。可以通过以下方法来解决:

  • 优先选择高基数的列作为分桶键。
  • 适当增加分桶的数量,例如将分桶数设置为 128 个(单个tablet的数据量推荐1-10GB)。
  • 对倾斜的字段进行预处理,比如添加随机前缀。

2. 分片数量过多问题

分片数量过多会增加元数据的管理负担。可以采取以下措施:

  • 控制每个 BE 节点承载的分片数量不超过 2 万个。
  • 对于冷数据,合并小分片。
  • 避免使用过度细化的分区策略。

3. 冷热数据管理问题

可以将热数据存储在 SSD 上,冷数据存储在 HDD 上。

定期删除或者归档历史分区,例如按天删除 30 天前的数据。

利用 TTL(生存时间)策略来自动清理过期的数据。

4. JOIN 性能优化问题

启用 Colocate Join 功能,确保关联表的分桶键和分桶数量一致。

对于小表,可以采用广播 JOIN 的方式。

避免在倾斜的键上进行 JOIN 操作。

四、最佳实践建议

分区策略选择:如果查询条件中包含时间或者地域等范围条件,优先选择 Range 分区;如果需要对离散值进行管理,则优先选择 List 分区。

分桶数量设置:分桶数量建议设置在 32 到 128 之间,并且要根据集群的规模进行动态调整。

数据分布验证:可以通过SHOW REPLICA DISTRIBUTION命令来检查数据的分布是否均匀。

写入优化:在写入数据时,尽量控制单次写入的分区数量,避免同时写入过多的分区。

通过合理地设计分区和分桶策略,Doris 能够充分发挥分布式架构的性能优势,满足大规模数据分析的需求。在实际应用中,需要根据业务场景的特点,平衡好查询效率、存储成本和管理复杂度之间的关系。


http://www.ppmy.cn/embedded/172443.html

相关文章

4-002:如何使用 MySQL 的 EXPLAIN 语句进行查询分析?

EXPLAIN 是 MySQL 中用于分析查询性能的工具,能够帮助你理解查询的执行计划。通过 EXPLAIN,你可以查看 MySQL 如何执行查询,包括使用的索引、表连接顺序等信息。 基本用法 在查询前加上 EXPLAIN 即可: EXPLAIN SELECT * FROM y…

在 Linux 64 位系统上安装 Oracle 11g R2 数据库的完整指南

linux.x64_11gR2_database 是 Oracle 数据库 11g 第 2 版(11g Release 2)的安装包,适用于 64 位 Linux 操作系统。这个安装包包含了在 64 位 Linux 系统上安装 Oracle 数据库所需的全部文件和组件。 安装步骤概述 以下是在 Linux 系统上安装…

c语言闯算法--常用技巧

双指针 类别&#xff1a; 同向快慢指针 异常情况&#xff0c;慢指针才动 双向指针 视情况&#xff0c;左右指针动 最长无重复子串 int max(int a, int b){if(a < b){return b;}else{return a;} } int lengthOfLongestSubstring(char* s) {int count[300];for(int i 0; i …

红帆 iOffice M2 移动端密码爆破的渗透测试思路,绕过客户端实现Burpsuite批量跑,分享渗透思路,共建网络安全

一、本文概述 今天来自于领导的一个需求,需要对甲方的红帆 ioffice M2进行一次渗透测试【有授权书的】,拿到对应的APP和接口以后,我发现了进行不下去的一个关键点,他家的OA只有APP端,没有Web端,而且密码被加密了。 二、开始分析 红帆 iOffice M2,在登录的过程中,涉及…

自定义日志回调函数实现第三方库日志集成:从理论到实战

一、应用场景与痛点分析 在开发过程中&#xff0c;我们经常会遇到以下场景&#xff1a; 日志格式统一&#xff1a;第三方库使用自己的日志格式&#xff0c;导致系统日志混杂&#xff0c;难以统一管理和分析。日志分级过滤&#xff1a;需要动态调整第三方库的日志输出级别&…

完全二叉树节点的数量 平衡二叉树

1.给出一个完全二叉树&#xff0c;求出该树的节点个数 #include <bits/stdc.h> using namespace std; struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x) { valx; leftNULL; rightNULL; } …

无人机快速发展,无人机反制如何应对?

无人机&#xff0c;即无人驾驶飞机&#xff0c;是一种不搭载驾驶员、依靠遥控或预设程序自主飞行的航空器。随着技术的不断进步和应用领域的不断拓展&#xff0c;无人机已经在军事、民用、商业等多个领域展现出巨大的潜力和价值。 无人机反制是指采取一系列措施来防范、干扰、…

Linux入门 2025 全面整理终端 Bash、Vim 命令速记

Linux入门 2025 超详细全面整理 Bash、Vim 基础命令速记 刚面对高级感满满的 终端窗口是不是有点懵&#xff1f;于是乎&#xff0c;这份手册就是为你准备的高效学习指南&#xff01;我把那些让人头大的系统设置、记不住的命令都整理成了对你更友好的格式&#xff0c;让你快速学…