大数据Doris(十七):Random Distribution和复合分区使用场景

2023-05-13 14:52:37 浏览数 (3)

Random Distribution和复合分区使用场景

一、Random Distribution

如果 OLAP 表没有更新类型的字段,将表的数据分桶模式设置为 RANDOM,则可以避免严重的数据倾斜(数据在导入表对应的分区的时候,单次导入作业每个 batch 的数据将随机选择一个tablet进行写入),分桶模式设置为RANDOM只需要建表是设置如下:

代码语言:javascript复制
...
DISTRIBUTED BY RANDOM  BUCKETS 10
...

也可以不跟" BUCKETS 10"直接指定RANDOM,默认BUCKETS为10。使用RANDOM分桶模式建表如下:

代码语言:javascript复制
CREATE TABLE IF NOT EXISTS example_db.example_list_tbl3
(
`id` LARGEINT NOT NULL COMMENT "用户id",
`date` DATE NOT NULL COMMENT "数据灌入日期时间",
`city` VARCHAR(20) NOT NULL COMMENT "用户所在城市",
`age` SMALLINT COMMENT "用户年龄",
`cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费"
)
ENGINE=olap
AGGREGATE KEY(`id`, `date`, `city`, `age`)
PARTITION BY LIST(`id`, `city`)
(
	PARTITION `p1_city` VALUES IN (("1", "Beijing"), ("1", "Shanghai")),
	PARTITION `p2_city` VALUES IN (("2", "Beijing"), ("2", "Shanghai")),
	PARTITION `p3_city` VALUES IN (("3", "Beijing"), ("3", "Shanghai"))
)
DISTRIBUTED BY RANDOM  BUCKETS 10
PROPERTIES
(
"replication_num" = "3"
);

当表的分桶模式被设置为RANDOM 时,因为没有分桶列,无法根据分桶列的值仅对几个分桶查询,对表进行查询的时候将对命中分区的全部分桶同时扫描,该设置适合对表数据整体的聚合查询分析而不适合高并发的点查询。

如果OLAP表的是Random Distribution的数据分布,那么在数据导入的时候可以设置单tablet导入模式(将load_to_single_tablet 设置为 true),那么在大数据量的导入的时候,一个任务在将数据写入对应的分区时将只写入一个tablet分片,这样将能提高数据导入的并发度和吞吐量,减少数据导入和Compaction导致的写放大问题,保障集群的稳定性。

二、复合分区使用场景

以下场景推荐使用复合分区:

  1. 有时间维度或类似带有有序值的维度,可以以这类维度列作为分区列。 分区粒度可以根据导入频次、分区数据量等进行评估。
  2. 历史数据删除需求: 如有删除历史数据的需求(比如仅保留最近N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE 语句进行数据删除。
  3. 解决数据倾斜问题: 每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。

当然用户也可以不使用复合分区,即使用单分区,则数据只做 HASH 分布。


0 人点赞