doris 有三大表模型,分别为 Duplicate 模型(明细模型)、Aggregate 模型(聚合模型)、Unique 模型(唯一模型),具体要创建哪种类型的表模型,取决于数据场景。
其中:
适用于原始数据存储、海量数据存储等场景,特点是无预聚合。
适用于报表统计、指标分析等场景,特点是预聚合、查询性能好、节省存储。
适用于用户画像,维表等场景,特点是有主键,支持更新操作。
doris 支持创建分区,但是,是否需要创建分区还是要看数据场景。
比如说:
维表、数据量较小的表一般不需要创建分区。
只有一天的、每日全量更新的数据,不需要创建分区,创建了分区反而会产生大量的空分区,造成元数据爆炸。
其他数据场景,推荐创建分区。
doris 表存储按照分桶(Tablet)进行,分桶的设计方式与查询性能密切相关。因此,分桶的设计方案非常重要。
doris 创建表时,即使你不指定分桶,它也会默认创建分桶。
但是,很遗憾,doris 表创建时的默认分桶设计方案并不是最优的。
比如说:
doris 默认分桶列为表的第一个字段,而表的第一个字段一般为日期,离线 T-1 场景下,分桶字段为一个值 **Hash(day_id) % BUCKETS_NUM**。这意味着,同一天的所有数据都会放入同一个分桶,这个分桶的主副本位于哪个 BE 节点上,那个 BE 节点会承担几乎所有的写入负载和数据存储,这个 BE 节点异常繁忙,磁盘I/O、网络、CPU压力都很大。但是,另外的 BE 节点却只能眼睁睁的看着他干活,这就是典型的数据倾斜。
那么,我们该怎么设计分桶呢?这里有几个最佳实践可以参考:
1、选择数据列中取值丰富、分布均匀的列作为分桶列,比如 user_id, order_id, device_no。
2、分桶数 BUCKETS 应为 2 的 N 次方。
3、单个 Bucket 的数据量:推荐在 100MB 到 1GB 之间(压缩后)。
4、小表:直接设置 BUCKETS 1。
5、分桶数避免设置为质数。
6、分桶数是 BE 数的较小整数倍。(与第2条冲突时,选择最接近的 N 次方)