下一代实时数据库:Apache Doris 【六】数据划分

news2024/11/24 19:51:21

  • 3.4 数据划分
    • 3.4.1 列定义
    • 3.4.2 分区与分桶
    • 3.4.3 PROPERTIES
    • 3.4.4 ENGINE
    • 3.4.5 其他
  • 后记

3.4 数据划分

以 3.3.2 的建表示例来理解。

3.4.1 列定义

以 AGGREGATE KEY 数据模型为例进行说明。更多数据模型参阅 Doris 数据模型。 列的基本类型, 可以通过在 mysql-client 中执行 HELP CREATE TABLE; 查看。

AGGREGATE KEY 数据模型中, 所有没有指定聚合方式(SUM 、REPLACE 、MAX、 MIN) 的列视为 Key 列。而其余则为 Value 列。

定义列时, 可参照如下建议:

➢ Key 列必须在所有 Value 列之前。

➢ 尽量选择整型类型。因为整型类型的计算和查找比较效率远高于字符串。

➢ 对于不同长度的整型类型的选择原则,遵循够用即可。

➢ 对于 VARCHAR 和 STRING 类型的长度,遵循 够用即可。

➢ 所有列的总字节长度(包括 Key 和 Value)不能超过 100KB。

3.4.2 分区与分桶

Doris 支持两层的数据划分。第一层是 Partition,支持 Range 和 List 的划分方式。第二 层是 Bucket (Tablet), 仅支持 Hash 的划分方式。

也可以仅使用一层分区。使用一层分区时,只支持 Bucket 划分。

3.4.2.1 Partition

➢ Partition 列可以指定一列或多列。分区类必须为 KEY 列。多列分区的使用方式在

后面介绍。

➢ 不论分区列是什么类型, 在写分区值时, 都需要加双引号。

➢ 分区数量理论上没有上限。

➢ 当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的

Partition。该 Partition 对用户不可见, 并且不可删改。

  1. Range 分区

分区列通常为时间列,以方便的管理新旧数据。不可添加范围重叠的分区。 Partition 指定范围的方式

⚫ VALUES LESS THAN (...) 仅指定上界,系统会将前一个分区的上界作为该分区的

下界,生成一个左闭右开的区间。分区的删除不会改变已存在分区的范围。删除分 区可能出现空洞。

⚫ VALUES [...) 指定同时指定上下界, 生成一个左闭右开的区间。

通过 VALUES [...) 同时指定上下界比较容易理解。这里举例说明,当使用 VALUES LESS THAN (...) 语句进行分区的增删操作时, 分区范围的变化情况:

(1) 如上 expamle_range_tbl 示例, 当建表完成后,会自动生成如下 3 个分区:

img
img

(2) 增加一个分区 p201705 VALUES LESS THAN ("2017-06-01") ,分区结果如下:

img
img

(3) 此时删除分区 p201703 ,则分区结果如下:

img
img

注意到 p201702 和 p201705 的分区范围并没有发生变化, 而这两个分区之间, 出现了 一个空洞:[2017-03-01, 2017-04-01)。即如果导入的数据范围在这个空洞范围内,是无法导 入的。

(4) 继续删除分区 p201702 ,分区结果如下:

img
img

空洞范围变为: [2017-02-01, 2017-04-01)

(5) 现在增加一个分区 p201702new VALUES LESS THAN ("2017-03-01"),分区结果

如下:

img
img

可以看到空洞范围缩小为:[2017-03-01, 2017-04-01)

(6)现在删除分区 p201701,并添加分区 p201612 VALUES LESS THAN ("2017-01-01"),

分区结果如下:

img
img

即出现了一个新的空洞: [2017-01-01, 2017-02-01)

  1. List 分区

分 区 列 支 持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE,

DATETIME, CHAR, VARCHAR 数据类型,分区值为枚举值。只有当数据为目标分区枚举值

其中之一时,才可以命中分区。不可添加范围重叠的分区。

Partition 支持通过 VALUES IN (...) 来指定每个分区包含的枚举值。下面通过示例说明, 进行分区的增删操作时, 分区的变化。

(1) 如上 example_list_tbl 示例, 当建表完成后,会自动生成如下 3 个分区:

img
img

(2) 增加一个分区 p_uk VALUES IN ("London"),分区结果如下:

img
img

(3) 删除分区 p_jp ,分区结果如下:

img
img

3.4.2.2 Bucket

(1) 如果使用了 Partition,则 DISTRIBUTED ... 语句描述的是数据在各个分区内的划 分规则。如果不使用 Partition ,则描述的是对整个表的数据的划分规则。

(2) 分桶列可以是多列,但必须为 Key 列。分桶列可以和 Partition 列相同或不同。

(3) 分桶列的选择,是在 查询吞吐 和 查询并发 之间的一种权衡:

① 如果选择多个分桶列,则数据分布更均匀。

如果一个查询条件不包含所有分桶列的等值条件,那么该查询会触发所有分桶同时 扫描,这样查询的吞吐会增加,单个查询的延迟随之降低。这个方式适合大吞吐低并发 的查询场景。

② 如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。

此时,当多个点查询并发时, 这些查询有较大的概率分别触发不同的分桶扫描, 各 个查询之间的 IO 影响较小(尤其当不同桶分布在不同磁盘上时) ,所以这种方式适合 高并发的点查询场景。

(4) 分桶的数量理论上没有上限。

3.4.2.3 使用复合分区的场景

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

(1) 有时间维度或类似带有有序值的维度,可以以这类维度列作为分区列。分区粒度 可以根据导入频次、分区数据量等进行评估。

(2) 历史数据删除需求:如有删除历史数据的需求(比如仅保留最近 N 天的数据) 。 使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE 语句进行数据删除。

(3) 解决数据倾斜问题: 每个分区可以单独指定分桶数量。如按天分区,当每天的数 据量差异很大时, 可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择 区分度大的列。

3.4.2.4 多列分区

Doris 支持指定多列作为分区列,示例如下:

  1. Range 分区
img
img

指定 date(DATE 类型) 和 id(INT 类型) 作为分区列。以上示例最终得到的分区如下:

p201701_1000: [(MIN_VALUE, MIN_VALUE), ("2017-02-01", "1000") ) p201702_2000: [("2017-02-01", "1000"), ("2017-03-01", "2000") ) p201703_all: [("2017-03-01", "2000"), ("2017-04-01", MIN_VALUE))

注意, 最后一个分区用户缺省只指定了 date 列的分区值,所以 id 列的分区值会默 认填充 MIN_VALUE。当用户插入数据时,分区列值会按照顺序依次比较,最终得到对应

的分区。举例如下:

img
img
  1. List 分区
img
img
img
img

当用户插入数据时, 分区列值会按照顺序依次比较,最终得到对应的分区。举例如下:

img
img

3.4.3 PROPERTIES

在建表语句的最后 PROPERTIES 中, 可以指定以下两个参数:

3.4.3.1 replication_num

每个 Tablet 的副本数量。默认为 3,建议保持默认即可。在建表语句中, 所有 Partition 中的 Tablet 副本数量统一指定。而在增加新分区时,可以单独指定新分区中 Tablet 的副本 数量。

副本数量可以在运行时修改。强烈建议保持奇数。

最大副本数量取决于集群中独立 IP 的数量(注意不是 BE 数量) 。Doris 中副本分布的 原则是,不允许同一个 Tablet 的副本分布在同一台物理机上, 而识别物理机即通过 IP。所 以, 即使在同一台物理机上部署了 3 个或更多 BE 实例,如果这些 BE 的 IP 相同,则依然只 能设置副本数为 1。

对于一些小,并且更新不频繁的维度表,可以考虑设置更多的副本数。这样在 Join 查询 时,可以有更大的概率进行本地数据 Join。

3.4.3.2 storage_medium & storage_cooldown_time

BE 的数据存储目录可以显式的指定为 SSD 或者 HDD (通过 .SSD 或者 .HDD 后缀 区分)。建表时,可以统一指定所有 Partition 初始存储的介质。注意,后缀作用是显式指 定磁盘介质,而不会检查是否与实际介质类型相符。

默认初始存储介质可通过 fe 的配置文件 fe.conf 中指定 default_storage_medium=xxx, 如果没有指定, 则默认为 HDD。如果指定为 SSD,则数据初始存放在 SSD 上。

如果没有指定 storage_cooldown_time,则默认 30 天后,数据会从 SSD 自动迁移到 HDD 上。如果指定了 storage_cooldown_time,则在到达 storage_cooldown_time 时间后,数据才会 迁移。

注意, 当指定 storage_medium 时,如果 FE 参数 enable_strict_storage_medium_check 为 False 该参数只是一个“尽力而为”的设置。即使集群内没有设置 SSD 存储介质, 也不会报 错, 而是自动存储在可用的数据目录中。 同样, 如果 SSD 介质不可访问、空间不足,都可 能导致数据初始直接存储在其他可用介质上。而数据到期迁移到 HDD 时, 如果 HDD 介质 不 可 访 问 、 空 间 不 足 , 也 可 能 迁 移 失 败 (但 是 会 不 断 尝 试 ) 。 如果 FE 参数 enable_strict_storage_medium_check 为 True 则当集群内没有设置 SSD 存储介质时,会报错 Failed to find enough host in all backends with storage medium is SSD。

3.4.4 ENGINE

本示例中, ENGINE 的类型是 olap,即默认的 ENGINE 类型。在 Doris 中,只有这个 ENGINE 类型是由 Doris 负责数据管理和存储的。其他 ENGINE 类型,如mysql 、broker、 es 等等,本质上只是对外部其他数据库或系统中的表的映射,以保证 Doris 可以读取这些数 据。而 Doris 本身并不创建、管理和存储任何非 olap ENGINE 类型的表和数据。

3.4.5 其他

IF NOT EXISTS 表示如果没有创建过该表, 则创建。注意这里只判断表名是否存在, 而不会判断新建表结构是否与已存在的表结构相同

后记

📢博客主页:https://manor.blog.csdn.net

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 Maynor 原创,首发于 CSDN博客🙉

📢不能老盯着手机屏幕,要不时地抬起头,看看老板的位置⭐

📢专栏持续更新,欢迎订阅:https://blog.csdn.net/xianyu120/category_12401955.html

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vSphere | VM】虚拟机自定义规范Ⅳ —— 使用虚拟机自定义规范创建 Linux 和 Windows VM

目录 5. 使用虚拟机自定义规范创建VM5.1 Linux 虚拟机示例Rocky Linux 9.2(1)克隆虚拟机(2)模板部署虚拟机 5.2 Windows 虚拟机示例Windows 10(1)克隆虚拟机(2)模板部署 Windows 10 …

Unity Meta Quest 一体机开发(十一):【手势追踪】远距离抓取

文章目录 📕教程说明📕玩家配置 DistanceHandGrabInteractor📕物体配置 DistanceHandGrabInteractable📕调整物体飞向手部的速度📕调整探测物体的范围⭐HandFrustumNarraw⭐HandFrustumWide⭐HeadFrustum 此教程相关的…

高德地图画线,适用于在地图上画出各种道路

addPolyline() {let AMap this.AMaplet polyline new AMap.Polyline({// map: this.map,// polyline 路径path: [new AMap.LngLat("119.368904", "30.913423"),new AMap.LngLat("119.382122", "30.901176"),],strokeColor: #F3D930,…

MapReduce基础编程

文章目录 第1关:合并去重第2关:整合排序第3关:信息挖掘 第1关:合并去重 编程要求 对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容…

Ngnix之反向代理、负载均衡、动静分离

目录 1. Ngnix 1.1 Linux系统Ngnix下载安装 1.2 反向代理 正向代理(Forward Proxy): 反向代理(Reverse Proxy): 1.3 负载均衡 1.4 动静分离 1. Ngnix Nginx是一个高性能的开源Web服务器&#xff0…

无惧数据泄露风险:迅软科技与电子科技公司共同谱写的安全合奏

当今,电子信息产品已广泛渗透到我们生活的各个领域,涵盖通信、医疗、计算机及其周边视听产品、玩具、军工等多个领域。电子信息科技行业作为典型的知识技术密集型行业,具备科技含量高、专利众多、知识产权丰富、核心数据密级高等特点。随着行…

猫头虎博主揭秘:令人叹为观止的编程语言与代码技巧 ‍

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

GEE:根据像素数量删除非常分散且面积较小的对象(斑块/超像素)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上,斑块(对象/超像素)的像素数量计算方法,并根据斑块的像素数量删除某一类土地利用数据中面积低于指定阈值的斑块(对象/超像素)的代码。 结果如下图所示,简言之,就是将下图中面积小的对象删除,只…

MybatisPlus【进阶】--悲观锁,乐观锁,生成后台数据:javafaker

什么是悲观锁 悲观锁:十分悲观,认为总是出现问题,无论干什么都会上锁,再去操作 悲观锁是基于一种悲观的态度类来防止一切数据冲突,它是以一种预防的姿态在修改数据之前把数据锁住,然后再对数据进行读写&…

山西电力市场日前价格预测【2023-12-19】

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-19)山西电力市场全天平均日前电价为562.84元/MWh。其中,最高日前电价为1168.60元/MWh,预计出现在18:00。最低日前电价为361.89元/MWh,预计…

分享!!!(一)小编总结的base64、blob、图片文件二进制相互转换的方式以及源码

目录 第一章 了解 1.1 大概结构 1.2 准备阶段 1.2.1 了解canvas 1.2.2 了解imageData 1.2.3 了解imgUrl 1.2.4 了解base64 1.2.5 了解blob/文件二进制流 1.2.6 了解arraybuffer 1.2.7 文件、图片 第二章 掌握图中的相互转换 2.1 cavas 与 imageData的互相转换 2.1…

基于OpenVidu的视频会议解决方案

OpenVidu是什么 OpenVidu 是一个开源的实时音视频通信平台,基于 Apache 2.0 协议开源的 WebRTC 视频会议平台,源码仓库地址:https://github.com/OpenVidu/openvidu。它提供了一组 API 和 SDK ,使开发人员能够轻松地在 Web 和移动…

山区老人爱的礼物丨走进武隆区土地乡为山区老人送温暖

从车水马龙的城市到人烟稀少的乡村,穿越重峦叠嶂的高山,见到的是独属于大山的辽阔和山区老人眼中的星河。近日,传益千里为爱出发,在三棵柚公益基金会的支持下开展“山区老人爱的礼物”公益计划,走进武隆区土地乡&#…

GeoTrust SSL证书:您的网络信任卫士

在如今的数字化时代,我们的网络交易如脉搏般不断跳动,在这个过程中,安全保障尤其重要。于是像GeoTrust这样的品牌应运而生,它向我们承诺一件事情:无论在什么时候,我们的数据和交易都能得到最强的保护。下面…

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

关于 Redis 与传统关系型数据库的选择

当需要为你的应用程序选择合适的数据库时,选择何种数据库通常取决于你项目的特定要求。Redis 是一种高性能的内存数据存储,而 MySQL 等传统关系型数据库也各自具有自己的优势和劣势。在本期文章中,我们将探讨在 Redis 和传统关系型数据库之间…

minio异常处理:S3 API Requests must be made to API port

1、创建minio服务时候需要映射出console端口和api端口&#xff0c;指定console端口和api端口 docker run -p 9000:9000 -p 9099:9099 --name minio -d --restartalways -e "MINIO_ACCESS_KEYadmin" -e "MINIO_SECRET_KEYMINIOE:<&G5*;dL?(fr" -v…

【✅如何针对大Excel做文件读取?】

✅如何针对大Excel做文件读取&#xff1f; &#x1f7e9;如何针对大Excel做文件读取&#x1f7e9;XSSFWorkbook文件读取&#x1f7e9;EasyExcel文件读取 ✅扩展知识&#x1f7e9; EasyExcel简介&#x1f7e9;EasyExcel 为什么内存占用小&#xff1f; &#x1f7e9;如何针对大Ex…

JavaScript中的一些惊艳的编程技巧

你见过哪些令你膛目结舌的代码技巧&#xff1f; 代码世界有很多令人大呼小叫的技巧&#xff01;有的代码像魔术师一样巧妙地隐藏了自己&#xff0c;有的像魔法师一样让你眼花缭乱&#xff0c;还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已&#xff0c;让我们觉得自己仿佛…

检测当前目录,将文件名输出到excel文件并建立链接

EXCEL是一个非常使用的软件,虽然我们平时仅使用他做一些报表,仅此而已; 我在工作中,由于很懒,不愿意做考试重复的工作,就想着使用vba的宏来完成重复的工作,这样就能省出一部分的时间来了。 本人不喜欢在博客里面写以下教程类的东西,我的理念是将工作中的痛点的解决办法…