数据分布概念
在 Doris 中,数据分布的核心是通过合理的分区和分桶策略,将写入到表的数据行高效地映射到底层存储的各个 数据分片(Tablet) 上。通过数据分布策略,Doris 可以充分利用多节点的存储和计算能力,从而支持大规模数据的高效存储与查询。
数据分布概览
数据写入
数据写入时,Doris 首先根据表的分区策略将数据行分配到对应的分区。接着,根据分桶策略将数据行进一步映射到分区内的具体分片,从而确定了数据行的存储位置。
查询执行
查询运行时,Doris 的优化器会根据分区和分桶策略裁剪数据,最大化减少扫描范围。在涉及 JOIN 或聚合查询时,可能会发生跨节点的数据传输(Shuffle)。合理的分区和分桶设计可以减少 Shuffle 并充分利用 Colocate Join 优化查询性能。
节点与存储架构
节点类型
Doris 集群由以下两种节点组成:
- FE 节点(Frontend):管理集群元数据(如表、分片),负责 SQL 的解析与执行规划。
- BE 节点(Backend):存储数据,负责计算任务的执行。BE 的结果汇总后返回至 FE,再返回给用户。
数据分片(Tablet)
BE 节点的存储数据分片的数据,每个分片是 Doris 中数据管理的最小单元,也是数据移动和复制的基本单位。
分区策略
分区是数据组织的第一层逻辑划分,用于将表中的数据划分为更小的子集。Doris 提供以下两种 分区类型 和三种 分区模式:
分区类型
- Range 分区:根据分区列的值范围将数据行分配到对应分区。
- List 分区:根据分区列的具体值将数据行分配到对应分区。
分区模式
- 手动分区:用户手动创建分区(如建表时指定或通过
ALTER
语句增加)。 - 动态分区:系统根据时间调度规则自动创建分区,但写入数据时不会按需创建分区。
- 自动分区:数据写入时,系统根据需要自动创建相应的分区,使用时注意脏数据生成过多的分区。
分桶策略
分桶是数据组织的第二层逻辑划分,用于在分区内将数据行进一步划分到更小的单元。Doris 支持以下两种分桶方式:
- Hash 分桶:通过计算分桶列值的
crc32
哈希值,并对分桶数取模,将数据行均匀分布到分片中。 - Random 分桶:随机分配数据行到分片中。使用 Random 分桶时,可以使用
load_to_single_tablet
优化小规模数据的快速写入。
数据分布优化
Colocate Join
对于需要频繁进行 JOIN 或聚合查询的大表,可以启用 Colocate 策略,将相同分桶列值的数据放置在同一物理节点上,减少跨节点的数据传输,从而显著提升查询性能。
分区裁剪
查询时,Doris 可以通过过滤条件裁剪掉不相关的分区,从而减少数据扫描范围,降低 I/O 开销。
分桶并行
查询时,合理的分桶数可以充分利用机器的计算资源和 I/O 资源。
数据分布目标
-
均匀数据分布 确保数据均匀分布在各 BE 节点上,避免数据倾斜导致部分节点过载,从而提高系统整体性能。
-
优化查询性能 合理的分区裁剪可以大幅减少扫描的数据量,合理的分桶数可以提升计算并行度,合理利用 Colocate 可以降低 Shuffle 成本,提升 JOIN 和聚合查询效率。
-
灵活数据管理
- 按时间分区保存冷数据(HDD)与热数据(SSD)。
- 定期删除历史分区释放存储空间。
-
控制元数据规模 每个分片的元数据存储在 FE 和 BE 中,因此需要合理控制分片数量。经验值建议:
- 每 1000w 分片,FE 至少需 100G 内存。
- 单个 BE 承载的分片数应小于 2w。
-
优化写入吞吐
- 分桶数应合理控制(建议 < 128),以避免写入性能下降。
- 每次写入的分区数量应适量(建议每次写入少量分区)。
通过精心设计和管理分区与分桶策略,Doris 能够高效地支持大规模数据的存储与查询处理,满足各种复杂业务需求。