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

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

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 个分区:

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

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

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

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

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

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

如下:

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

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

分区结果如下:

即出现了一个新的空洞: [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 个分区:

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

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

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 分区

指定 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。当用户插入数据时,分区列值会按照顺序依次比较,最终得到对应

的分区。举例如下:

  1. List 分区

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

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 表示如果没有创建过该表, 则创建。注意这里只判断表名是否存在, 而不会判断新建表结构是否与已存在的表结构相同

目录
相关文章
|
1月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
1月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
21天前
|
SQL 存储 数据处理
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
Apache Doris 物化视图进行了支持。**早期版本中,Doris 支持同步物化视图;从 2.1 版本开始,正式引入异步物化视图,[并在 3.0 版本中完善了这一功能](https://www.selectdb.com/blog/1058)。**
|
28天前
|
SQL 存储 Java
Apache Doris 2.1.7 版本正式发布
亲爱的社区小伙伴们,**Apache Doris 2.1.7 版本已于 2024 年 11 月 10 日正式发布。**2.1.7 版本持续升级改进,同时在湖仓一体、异步物化视图、半结构化数据管理、查询优化器、执行引擎、存储管理、以及权限管理等方面完成了若干修复。欢迎大家下载使用。
|
1月前
|
监控 Cloud Native BI
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
飞轮科技正式推出 Apache Doris 和 SelectDB 精选案例集 ——《走向现代化的数据仓库(2024 版)》,汇聚了来自各行各业的成功案例与实践经验。该书以行业为划分标准,辅以使用场景标签,旨在为读者提供一个高度整合、全面涵盖、分类清晰且易于查阅的学习资源库。
|
1月前
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
|
1月前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
2月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
752 13
Apache Flink 2.0-preview released
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
82 3
|
3月前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。

推荐镜像

更多