ToB企服应用市场:ToB评测及商务社交产业平台

标题: 聊聊分布式 SQL 数据库Doris(三) [打印本页]

作者: tsx81428    时间: 2024-1-4 07:01
标题: 聊聊分布式 SQL 数据库Doris(三)
在 Doris 的存储引擎规则:
Table (逻辑描述) -- > Partition(分区:管理单元) --> Bucket(分桶:存储,每个分桶就是一个数据分片:Tablet,数据划分的最小逻辑单元。称为子表) ,如下图:

语法与示例

语法:
  1. -- 该表记录了某个时间点,在某个站点上各个用户的pv数据
  2. CREATE TABLE demo.test_tbl(
  3.     sdate      DATE,  -- 日期
  4.     site       INT,  -- 站点id
  5.     city       VARCHAR(64),  -- 城市
  6.     user       VARCHAR(32)  DEFAULT '', -- 用户名
  7.     pv         BIGINT -- pv量
  8. ) ENGINE=olap DUPLICATE KEY(sdate, site, city)
  9. [PARTITION_DESC]
  10. [BUCKET_DESC]
  11. PROPERTIES ("replication_num" = "1");
复制代码
[PARTITION_DESC] 表示创建分区的详细语句,[BUCKET_DESC] 表示创建分桶的语句.
动态分区:
  1. PARTITION BY RANGE(sdate)()
  2. -- 剩余参数需要在PARTITION进行配置:
  3. PROPERTIES (
  4.   "dynamic_partition.enable" = "true",
  5.   "dynamic_partition.time_unit" = "DAY",
  6.   "dynamic_partition.start" = "-30",
  7.   "dynamic_partition.end" = "3",
  8.   "dynamic_partition.prefix" = "p",
  9.   "dynamic_partition.create_history_partition"="true",
  10.   "replication_num" = "1"
  11. );
复制代码
分桶:
  1. DISTRIBUTED BY HASH(site) BUCKETS 20
复制代码
此时指定以 site 列的哈希值作为分桶,并且分桶个数设置为 20 个.
官方示例:
  1. CREATE TABLE tbl1
  2. (
  3.     k1 DATE,
  4.     -- ...
  5. )
  6. PARTITION BY RANGE(k1) ()
  7. DISTRIBUTED BY HASH(k1)
  8. PROPERTIES
  9. (
  10.     "dynamic_partition.enable" = "true",
  11.     "dynamic_partition.time_unit" = "DAY",
  12.     "dynamic_partition.start" = "-7",
  13.     "dynamic_partition.end" = "3",
  14.     "dynamic_partition.prefix" = "p",
  15.     "dynamic_partition.buckets" = "32"
  16. );
复制代码
批量分区与自动分桶

批量分区使得用户能够批量操作表的分区结构,一次性创建多个分区,而不是逐个单独创建。
  1. -- 当然,分区创建个数受到max_multi_partition_num参数控制,该值默认为4096,有需求可以修改
  2. PARTITION BY RANGE(sdate)
  3. (
  4.    FROM ("2013-01-01") TO ("2023-01-01") INTERVAL 1 DAY
  5. )
  6. -- 从这个 case 来看,批量分区功能的语法更为简洁,但该功能的易用性和灵活性远不止于此。
复制代码
自动分桶是基于表中某个列(或在创建表时指定咧)的值范围进行的。系统会根据该列的数据分布情况,将数据划分到不同的数据桶中。
  1. -- 旧版本指定分桶个数的创建语法
  2. DISTRIBUTED BY HASH(site) BUCKETS 20
  3. -- 新版本使用自动分桶推算的创建语法
  4. DISTRIBUTED BY HASH(site) BUCKETS AUTO
  5. properties("estimate_partition_size" = "100G")
复制代码
关键逻辑

查询路由

一个分区的数据不会跨多个不同的BE节点存储.
在 Apache Doris 中,当请求到来时,查询某个分区的数据时,Doris 使用以下的过程来定位到相应的 Backend(BE)节点:
在 Apache Doris 中,一个表的多个分区数据通常会存储在不同的 Backend(BE)节点上,以实现分布式存储和查询的优势。每个分区的数据都会被划分并存储在负责该分区的一个 BE 节点上。具体来说:
分桶算法

暂时只支持HASH.
分区算法

暂时只支持List, RANGE. 常用的有四种: (a) Round-Robin、(b) Range、(c) List、(d) Hash .
参考:
Doris数据分布
详细内容阅读: Apache Doris 分区分桶新功能数据划分. 本文在此基础上做总结与自我思考的延伸.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4