目录
一、分桶Bucket
二、分区和分桶数量和数据量的建议
进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容!
一、分桶Bucket
Doris数据表存储中,如果有分区,在插入数据时,数据会按照对应规则匹配写往对应的分区中,如果表除了有分区还有分桶,那么数据在写入某个分区后,还会根据分桶规则将数据写入不同的分桶(Tablet),目前分桶Bucekt目前仅支持Hash分桶,即根据对应列的hash值将数据划分成不同的分桶(Tablet)。
建议采用区分度大的列做分桶, 避免出现数据倾斜,为方便数据恢复, 建议单个 bucket 的 size 不要太大, 保持在 10GB 以内, 所以建表或增加 partition 时请合理考虑 bucket 数目, 其中不同 partition 可指定不同的 buckets 数。
建表时创建分桶表只需要在建表语句中加入distrubution_desc即可:
...
DISTRIBUTED BY HASH(`id`) BUCKETS 16
...
之前创建的所有分区表都进行了分桶,使用Bucket分桶有以下几个注意点:
- 如果使用了 Partition,则 DISTRIBUTED ... 语句描述的是数据在各个分区内的划分规则。如果不使用 Partition,则描述的是对整个表的数据的划分规则。
- 分桶列可以是多列,Aggregate 和 Unique 模型必须为 Key 列,Duplicate 模型可以是 key 列和 value 列。分桶列可以和 Partition 列相同或不同。
- 分桶列的选择,是在”查询吞吐” 和 “查询并发” 之间的一种权衡:
- 如果选择多个分桶列,则数据分布更均匀。如果一个查询条件不包含所有分桶列的等值条件,那么该查询会触发所有分桶同时扫描,这样查询的吞吐会增加,单个查询的延迟随之降低。这个方式适合大吞吐低并发的查询场景。
- 如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。此时,当多个点查询并发时,这些查询有较大的概率分别触发不同的分桶扫描,各个查询之间的IO影响较小(尤其当不同桶分布在不同磁盘上时),所以这种方式适合高并发的点查询场景。
4. 分桶的数量理论上没有上限。
二、分区和分桶数量和数据量的建议
- 一个表必须指定分桶列,但可以不指定分区
- 对于分区表,可以在之后的使用过程中对分区进行增删操作,而对于无分区的表,之后不能再进行增加分区等操作。
- 分区列和分桶列在表创建之后不可更改,既不能更改分区和分桶列的类型,也不能对这些列进行任何增删操作。所以建议在建表前,先确认使用方式来进行合理的建表。
- 一个表的 Tablet 总数量等于 (Partition num * Bucket num)。
- 一个表的 Tablet 数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。
- 单个 Tablet 的数据量理论上没有上下界,但建议在 1G - 10G 的范围内。如果单个 Tablet 数据量过小,则数据的聚合效果不佳,且元数据管理压力大。如果数据量过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。
- 当 Tablet 的数据量原则和数量原则冲突时,建议优先考虑数据量原则。
- 在建表时,每个分区的 Bucket 数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数量。可以利用这个功能方便的应对数据缩小或膨胀。
- 一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。比如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度。
- 举一些例子:假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总大小为 500MB,则可以考虑4-8个tablet分片。5GB:8-16个tablet分片。50GB:32个tablet分片。500GB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个tablet分片。5TB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个tablet分片。
注:表的数据量可以通过 SHOW DATA 命令查看,结果除以副本数,即表的数据量。