详细内容阅读: Apache Doris 分区分桶新功能数据划分. 在此基础上做总结与延伸.

在 Doris 的存储引擎规则:

  • 表的数据是以分区为单位存储的,不指定分区创建时,默认就一个分区.
  • 用户数据首先被划分成若干个分区(Partition),划分的规则通常是按照用户指定的分区列进行范围划分,比如按时间划分。
  • 在每个分区内,数据被进一步的按照Hash的方式分桶,分桶的规则是要找用户指定的分桶列的值进行Hash后分桶。每个分桶就是一个数据分片(Tablet),也是数据划分的最小逻辑单元。
  • Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行。
  • Tablet直接的数据是没有交集的,独立存储的。Tablet也是数据移动、复制等操作的最小物理存储单元。

Table (逻辑描述) -- > Partition(分区:管理单元) --> Bucket(分桶:存储,每个分桶就是一个数据分片:Tablet,数据划分的最小逻辑单元。称为子表) ,如下图:

语法与示例

语法:

-- 该表记录了某个时间点,在某个站点上各个用户的pv数据
CREATE TABLE demo.test_tbl(
sdate DATE, -- 日期
site INT, -- 站点id
city VARCHAR(64), -- 城市
user VARCHAR(32) DEFAULT '', -- 用户名
pv BIGINT -- pv量
) ENGINE=olap DUPLICATE KEY(sdate, site, city)
[PARTITION_DESC]
[BUCKET_DESC]
PROPERTIES ("replication_num" = "1");

[PARTITION_DESC] 表示创建分区的详细语句,[BUCKET_DESC] 表示创建分桶的语句.

动态分区:

PARTITION BY RANGE(sdate)()

-- 剩余参数需要在PARTITION进行配置:
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition"="true",
"replication_num" = "1"
);

分桶:

DISTRIBUTED BY HASH(site) BUCKETS 20

此时指定以 site 列的哈希值作为分桶,并且分桶个数设置为 20 个.

官方示例:

CREATE TABLE tbl1
(
k1 DATE,
-- ...
)
PARTITION BY RANGE(k1) ()
DISTRIBUTED BY HASH(k1)
PROPERTIES
(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);

批量分区与自动分桶

批量分区使得用户能够批量操作表的分区结构,一次性创建多个分区,而不是逐个单独创建。

-- 当然,分区创建个数受到max_multi_partition_num参数控制,该值默认为4096,有需求可以修改
PARTITION BY RANGE(sdate)
(
FROM ("2013-01-01") TO ("2023-01-01") INTERVAL 1 DAY
)
-- 从这个 case 来看,批量分区功能的语法更为简洁,但该功能的易用性和灵活性远不止于此。

自动分桶是基于表中某个列(或在创建表时指定咧)的值范围进行的。系统会根据该列的数据分布情况,将数据划分到不同的数据桶中。

-- 旧版本指定分桶个数的创建语法
DISTRIBUTED BY HASH(site) BUCKETS 20 -- 新版本使用自动分桶推算的创建语法
DISTRIBUTED BY HASH(site) BUCKETS AUTO
properties("estimate_partition_size" = "100G")

底层逻辑

查询路由

一个分区的数据不会跨多个不同的BE节点存储.

在 Apache Doris 中,当请求到来时,查询某个分区的数据时,Doris 使用以下的过程来定位到相应的 Backend(BE)节点:

  1. 分区键(Partition Key): 在 Doris 中,表的分区是按照某一列的值范围进行划分的,这个列通常被称为分区键。用户在创建表时可以选择分区键。

  2. 查询请求中的分区键值: 当查询请求到达 Doris 时,请求中通常包含了要查询的分区键值。

  3. 分区键值与分区映射关系: Doris 通过分区键值与分区的映射关系,确定具体的分区。这个映射关系通常存储在系统的元数据中,其中包括每个分区所在的 BE 节点信息。

  4. BE 节点负责的分区: 根据分区键值的映射关系,Doris 确定了负责该分区的 BE 节点。

  5. 查询计划的生成和执行: Doris 生成查询计划,其中包含了具体的查询操作。该计划会被发送到负责该分区的 BE 节点上执行。

在 Apache Doris 中,一个表的多个分区数据通常会存储在不同的 Backend(BE)节点上,以实现分布式存储和查询的优势。每个分区的数据都会被划分并存储在负责该分区的一个 BE 节点上。具体来说:

  1. 表的分区: Doris 中的表通常根据某一列的值范围进行分区。每个分区是表的逻辑组织单元,用于提高查询性能、管理数据、支持按范围删除等操作。

  2. 分布式存储: Doris 的设计目标之一是分布式存储和查询。因此,一个表的多个分区数据会被分布存储在不同的 BE 节点上。这样的设计有助于提高系统的横向扩展性,允许系统有效地处理大规模数据和高并发的查询请求。

  3. 负责分区的 BE 节点: Doris 通过元数据信息记录每个分区所在的 BE 节点。当执行查询请求时,Doris 会根据查询涉及的分区,确定负责这些分区的 BE 节点。每个 BE 节点负责存储和管理分配给它的分区数据。

  4. 分布式计算: 查询请求在涉及多个分区时,Doris 可以通过分布式计算的方式,在多个 BE 节点上并行执行查询计划,以提高查询性能。

分桶算法

暂时只支持HASH.

分区算法

暂时只支持List, RANGE. 常用的有四种: (a) Round-Robin、(b) Range、(c) List、(d) Hash .

参考:

Doris数据分布

聊聊分布式 SQL 数据库Doris(三)的更多相关文章

  1. 分布式SQL数据库中部分索引的好处

    在优锐课的java学习分享中,探讨了分布式SQL数据库中部分索引的优势,并探讨了性能测试,结果等. 如果使用局部索引而不是常规索引,则在可为空的列上(其中只有一小部分行的该列不具有空值),然后可以大大 ...

  2. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!

    作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...

  3. SQL数据库设计三范式

    关系型数据库将数据库设计需要遵循的一些规则叫做“范式”,最基本的三个范式(1NF.2NF.3NF)简称三范式.第一范式是满足第二范式的基础,而第一.二范式又是满足第三范式的基础. 第一范式 表中的字段 ...

  4. SQL数据库基础三

  5. C++操作 SQL数据库 实例 代码步骤

    C++连接SQL数据库第一步 系统配置 1.设置SQLSERVER服务器为SQL登录方式,并且系统安全性中的sa用户要设置登录功能为“启用”,还有必须要有密码. 2.需要在ODBC中进行数据源配置,数 ...

  6. CockroachDB学习笔记——[译]The New Stack:遇见CockroachDB,一个弹性SQL数据库

    原文链接:https://www.cockroachlabs.com/blog/the-new-stack-meet-cockroachdb-the-resilient-sql-database/ 原 ...

  7. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  8. 浅尝key-value数据库(三)——MongoDB的分布式

    浅尝key-value数据库(三)——MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replicat ...

  9. Google的分布式关系型数据库F1和Spanner

    F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...

  10. 分布式MySQL数据库TDSQL架构分析

    摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...

随机推荐

  1. 重温C#中的值类型和引用类型

    在C#中,数据类型分为值类型和引用类型两种. 引用类型变量存储的是数据的引用,数据存储在数据堆中,而值类型变量直接存储数据.对于引用类型,两个变量可以引用同一个对象.因此,对一个变量的操作可能会影响另 ...

  2. Java的readBytes是怎么实现的?

    1.前言 众所周知,Java是一门跨平台语言,针对不同的操作系统有不同的实现.本文从一个非常简单的api调用来看看Java具体是怎么做的. 2.源码分析 从FileInputStream.java中看 ...

  3. 检测文件的格式——chardet模块

    f3 = open(file=path,mode='rb') data = f3.read() # print(data) f3.close() result = chardet.detect(dat ...

  4. 从序号和确认号理解TCP三次握手

    头部信息 TCP首部存储的数据和建立连接有关,具体每个字段的用途可以参考这一篇文章,其中序号和确认号决定了发送数据的内容. 头部中间部分"保留"和"窗口"中间是 ...

  5. 从浅入深了解.NET Core MVC 2.x全面教程【第二章】

    二.Logging 1.诊断中间件 命名空间:Microsoft.AspNetCore.Diagnostics 报告信息并处理异常 2.诊断中间件 UseDeveloperExceptionPage: ...

  6. .NET Core多线程 (4) 锁机制

    合集:.NET Core多线程温故知新 .NET Core多线程(1)Thread与Task .NET Core多线程(2)异步 - 上 .NET Core多线程(3)异步 - 下 .NET Core ...

  7. AVR汇编(四):数据传送指令

    AVR汇编(四):数据传送指令 AVR指令主要分为五类:算术和逻辑指令.分支指令.位操作指令.数据传送指令.MCU控制指令,今天我们先来认识其中最常用的数据传送指令. 汇编程序的编写.编译和调试 学习 ...

  8. Codeforces Round 882 div.2 A

    Smiling&Weeping ----总有人间一两风,填我十万八千梦 A. The Man who became a God time limit per test 1 second mem ...

  9. sqoop1.4.7完全支持Hadoop3.x, Hive3.x Hbase2.x

    已经修改好 保存至云盘 自己下载 花了时间的,记得关注我... 链接:https://pan.xunlei.com/s/VNe6P6Tm1A9Q-RG5GByN08rdA1# 提取码:5nke 复制这 ...

  10. 解密Prompt系列15. LLM Agent之数据库应用设计:DIN & C3 & SQL-Palm & BIRD

    上一章我们主要讲搜索引擎和LLM的应用设计,这一章我们来唠唠大模型和DB数据库之间的交互方案.有很多数据平台已经接入,可以先去玩玩再来看下面的实现方案,推荐 sql translate:简单,文本到S ...