前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Doris建表注意事项,实时数仓的同学记得收藏

Doris建表注意事项,实时数仓的同学记得收藏

作者头像
小晨说数据
发布于 2022-03-10 02:48:57
发布于 2022-03-10 02:48:57
1.8K00
代码可运行
举报
文章被收录于专栏:小晨讲Flink小晨讲Flink
运行总次数:0
代码可运行

为什么发这篇文章?

  • 新入场的小伙伴不知道doris的优势在哪里
  • 数据划分的原理是什么不适很清晰,也不知道分桶的作用是干啥的
  • 帮助新人快速了解doris的数据存储原理。

目录

基本概念

  1. Row & Column
  2. Tablet & Partition

数据划分

列定义

分区与分桶

  1. Partition
  2. Bucket
  3. 关于 Partition 和 Bucket 的数量和数据量的建议。

PROPERTIES

  1. replication_num
  2. storage_medium & storage_cooldown_time

ENGINE

基本概念

Row & Column

一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。

Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列和指标列。从聚合模型的角度来说,Key 列相同的行,会聚合成一行。其中 Value 列的聚合方式由用户在建表时指定。

Tablet & Partition

在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行,各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。

多个 Tablet 在逻辑上归属于不同的分区(Partition)。一个 Tablet 只属于一个 Partition,而一个 Partition 包含若干个 Tablet。因为 Tablet 在物理上是独立存储的,所以可以视为 Partition 在物理上也是独立。Tablet 是数据移动、复制等操作的最小物理存储单元。

若干个 Partition 组成一个 Table。Partition 可以视为是逻辑上最小的管理单元,数据的导入与删除,都可以或仅能针对一个 Partition 进行。

数据划分

以一个建表操作来说明 Doris 的数据划分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE IF NOT EXISTS example_db.expamle_tbl
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `date` DATE NOT NULL COMMENT "数据灌入日期时间",
    `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
    `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
    `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
    `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
PARTITION BY RANGE(`date`)
(
    PARTITION `p202001` VALUES LESS THAN ("2020-02-01"),
    PARTITION `p202002` VALUES LESS THAN ("2020-03-01"),
    PARTITION `p202003` VALUES LESS THAN ("2020-04-01")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
(
    "replication_num" = "3",
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2021-01-01 12:00:00"
);

列定义

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

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

  1. Key 列必须在所有 Value 列之前。
  2. 尽量选择整型类型。因为整型类型的计算和查找比较效率远高于字符串。
  3. 对于不同长度的整型类型的选择原则,遵循 够用即可。
  4. 对于 VARCHAR 和 STRING 类型的长度,遵循 够用即可。
  5. 所有列的总字节长度(包括 Key 和 Value)不能超过 100KB。

分区与分桶

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

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

1.Partition

  • Partition 列可以指定一列或多列。分区类必须为 KEY 列。多列分区的使用方式在后面 多列分区 小结介绍。
  • 不论分区列是什么类型,在写分区值时,都需要加双引号。
  • 分区列通常为时间列,以方便的管理新旧数据。
  • 分区数量理论上没有上限。
  • 当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的 Partition。该 Partition 对用户不可见,并且不可删改。
  • Partition 支持通过 VALUES LESS THAN (...) 仅指定上界,系统会将前一个分区的上界作为该分区的下界,生成一个左闭右开的区间。通过,也支持通过 VALUES [...) 指定同时指定上下界,生成一个左闭右开的区间。
  • 通过 VALUES [...) 同时指定上下界比较容易理解。

2.Bucket

  • 如果使用了 Partition,则 DISTRIBUTED ... 语句描述的是数据在各个分区内的划分规则。如果不使用 Partition,则描述的是对整个表的数据的划分规则。
  • 分桶列可以是多列,但必须为 Key 列。分桶列可以和 Partition 列相同或不同。
  • 分桶列的选择,是在 查询吞吐 和 查询并发 之间的一种权衡:
    1. 如果选择多个分桶列,则数据分布更均匀。如果一个查询条件不包含所有分桶列的等值条件,那么该查询会触发所有分桶同时扫描,这样查询的吞吐会增加,单个查询的延迟随之降低。这个方式适合大吞吐低并发的查询场景。
    2. 如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。此时,当多个点查询并发时,这些查询有较大的概率分别触发不同的分桶扫描,各个查询之间的IO影响较小(尤其当不同桶分布在不同磁盘上时),所以这种方式适合高并发的点查询场景。
  • 分桶的数量理论上没有上限。

3.关于 Partition 和 Bucket 的数量和数据量的建议。

  • 一个表的 Tablet 总数量等于 (Partition num * Bucket num)。
  • 一个表的 Tablet 数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。
  • 单个 Tablet 的数据量理论上没有上下界,但建议在 1G - 10G 的范围内。如果单个 Tablet 数据量过小,则数据的聚合效果不佳,且元数据管理压力大。如果数据量过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。
  • 当 Tablet 的数据量原则和数量原则冲突时,建议优先考虑数据量原则。
  • 在建表时,每个分区的 Bucket 数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数量。可以利用这个功能方便的应对数据缩小或膨胀。
  • 一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。比如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度。
  • 举一些例子:假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总大小为 500MB,则可以考虑4-8个分片。5GB:8-16个。50GB:32个。500GB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。5TB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。

注:表的数据量可以通过 show data 命令查看,结果除以副本数,即表的数据量。

PROPERTIES

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

1.replication_num

  • 每个 Tablet 的副本数量。默认为3,建议保持默认即可。在建表语句中,所有 Partition 中的 Tablet 副本数量统一指定。而在增加新分区时,可以单独指定新分区中 Tablet 的副本数量。
  • 副本数量可以在运行时修改。强烈建议保持奇数。
  • 最大副本数量取决于集群中独立 IP 的数量(注意不是 BE 数量)。Doris 中副本分布的原则是,不允许同一个 Tablet 的副本分布在同一台物理机上,而识别物理机即通过 IP。所以,即使在同一台物理机上部署了 3 个或更多 BE 实例,如果这些 BE 的 IP 相同,则依然只能设置副本数为 1。
  • 对于一些小,并且更新不频繁的维度表,可以考虑设置更多的副本数。这样在 Join 查询时,可以有更大的概率进行本地数据 Join。

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

ENGIN

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`IF NOT EXISTS` 表示如果没有创建过该表,则创建。
注意这里只判断表名是否存在,而不会判断新建表结构是否与已存在的表结构相同。
所以如果存在一个同名但不同构的表,该命令也会返回成功,但并不代表已经创建了新的表和新的结构。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小晨说数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
下一代实时数据库:Apache Doris 【六】数据划分
以 AGGREGATE KEY 数据模型为例进行说明。更多数据模型参阅 Doris 数据模型。 列的基本类型, 可以通过在 mysql-client 中执行 HELP CREATE TABLE; 查看。
Maynor
2023/12/19
4070
下一代实时数据库:Apache Doris 【六】数据划分
下一代实时数据库:Apache Doris 【五】数据表的创建
一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一
Maynor
2023/09/25
7050
下一代实时数据库:Apache Doris 【五】数据表的创建
深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节
Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满足报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
公众号:码到三十五
2024/05/24
6.9K0
深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节
悄悄学习Doris,偷偷惊艳所有人 | Apache Doris四万字小总结
DorisDB是由Apache Doris核心研发团队打造的新一代企业级MPP数据库。它继承了Apache Doris项目十多年研发成果,累积了线上数千台服务器稳定运行经验,并在此基础上,对传统MPP数据库进行了开创性的革新。
王知无-import_bigdata
2021/09/22
7.8K1
「硬刚Doris系列」Doris高级用法
Rollup 可以理解为 Table 的一个物化索引结构。物化 是因为其数据在物理上独立存储,而 索引 的意思是,Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度。
王知无-import_bigdata
2022/06/05
2.1K0
Apache Doris 入门 10 问
基于 Apache Doris 在读写流程、副本一致性机制、 存储机制、高可用机制等方面的常见疑问点进行梳理,并以问答形式进行解答。在开始之前,我们先对本文相关的名词进行解释:
SelectDB技术团队
2024/01/10
1.4K0
Apache Doris 助力中国联通万亿日志数据分析提速 10 倍
在数据安全管理体系的背后,离不开对安全日志数据的存储与分析。以终端设备为例,中国联通每天会产生百亿级别的日志数据,对于保障网络安全、提高系统稳定性和可靠性具有至关重要的作用。目前,Apache Doris 在联通体系的落地已支持了 30 多条业务线和数百个实时作业,不仅帮助联通实现了万亿级安全日志的高效分析和低成本,也为其他运营商提供了成功的参考案例和学习经验,对推动运营商的数字化转型进程具有重要意义。
SelectDB技术团队
2023/08/16
6430
聊聊分布式 SQL 数据库Doris(三)
Table (逻辑描述) -- > Partition(分区:管理单元) --> Bucket(分桶:存储,每个分桶就是一个数据分片:Tablet,数据划分的最小逻辑单元。称为子表) ,如下图:
Ryan_OVO
2023/11/22
6480
聊聊分布式 SQL 数据库Doris(三)
查询提速11倍、资源节省70%,Apache Doris 在网易日志和时序场景的实践
随着信息技术的飞速发展,企业数据量呈现爆炸式增长。对于像网易这样规模庞大的互联网公司,无论是内部办公系统还是外部提供的服务,每天都会产生大量的日志和时序数据。这些数据已成为故障排查、问题诊断、安全监测、风险预警以及用户行为分析及体验优化的重要基石。充分挖掘这些数据的价值,有利于提升产品的可靠性、性能、安全性以及用户满意度。
SelectDB技术团队
2024/05/06
6530
「硬刚Doris系列」官方常见问题小汇总
在下线过程中,通过 show backends 查看下线节点的 tabletNum ,会观察到 tabletNum 数量在减少,说明数据分片正在从这个节点迁移走。当数量减到0时,系统会自动删除这个节点。但某些情况下,tabletNum 下降到一定数值后就不变化。这通常可能有以下两种原因:
王知无-import_bigdata
2022/06/05
5K0
大数据Doris(十五):Doris分区Partition
第一层是 Partition,即分区。用户可以指定某一维度列作为分区列,并指定每个分区的取值范围,分区支持 Range 和 List 的划分方式。
Lansonli
2023/05/11
5.6K0
StarRocks学习-初识
StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。
chimchim
2022/11/13
2.4K0
StarRocks学习-初识
如何消化每天 150 亿条日志,让大查询保持在 1 秒内
该数据仓库用例与规模有关。用户是中国联通,全球最大的电信服务提供商之一。使用 Apache Doris 在数十台机器上部署多个 PB 级集群,以支持 30 多个业务线每日添加的 150 亿条日志。如此庞大的日志分析系统是网络安全管理的一部分。出于实时监控、威胁追踪和警报的需求,用户需要一个能够自动收集、存储、分析和可视化日志和事件记录的日志分析系统。
大数据杂货铺
2023/09/28
8060
如何消化每天 150 亿条日志,让大查询保持在 1 秒内
Doris磁盘均衡问题排查指南
在Doris集群运维中,磁盘均衡是保证数据高效存储和查询性能的关键。然而,由于数据分布不均、参数配置不当或环境异常,磁盘不均衡问题时有发生。本文将深入解析Doris磁盘均衡的优化方法、排查流程及常见问题解决方案,助你快速定位并解决问题。
数据微光
2025/02/27
1410
Doris磁盘均衡问题排查指南
【Apache Doris】Compaction 原理 | 实践全析
导读 本文主要分享 Doris Compaction 机制的版本策略、类型说明、工程实现和生产实践。
一臻数据
2024/12/24
4270
【Apache Doris】Compaction 原理 | 实践全析
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。目前已经稳定运行 3 个季度,规模达到 50 台服务器,2PB 数据,每天新增日志量超过万亿条,峰值写入吞吐 6GB/s 。
深度学习与Python
2025/03/03
1280
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
ES存储账单太吓人?且看Doris倒排索引,如何把老板的血压和成本一起降下来!
❝凌晨3点,线上日志系统分析突然告警,用户反馈交易失败! 运维小张急忙点开日志平台开始排查,输入几个关键词,等待结果...10秒...30秒...1分钟过去了,系统仍在"努力加载中" 小张叹了口气:"又要等到天亮了。" "为什么查询日志这么慢?有没有更高效的解决方案?" 正巧,Apache Doris 从2.0版本开始推出了倒排索引技术,让日志查询速度大幅度提升,并且同样的原始数据,Doris 的存储成本只需要 Elasticsearch 的 20% 左右。 本文将带你深入了解Apache Doris倒排索引技术,从原理到实践,全方位掌握这把日志分析的利器。
一臻数据
2025/02/28
1690
ES存储账单太吓人?且看Doris倒排索引,如何把老板的血压和成本一起降下来!
【Apache Doris】周FAQ集锦:第 23 期
在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。
一臻数据
2024/12/24
750
【Apache Doris】周FAQ集锦:第 23 期
国产数据库 - 架构设计 - 初识Doris
Doris是一款基于MPP架构的分析型数据库。整体架构很简单,只有两类进程FE和BE。其中FE(Frontend)主要负责用户请求的接入、查询解析规划、元数据管理和节点管理相关工作;BE(Backend)主要负责数据存储、查询计划的执行。
yzsDBA
2024/06/03
1.6K0
国产数据库 - 架构设计 - 初识Doris
硬刚Doris系列」Apache Doris基本使用和数据模型
我们使用 event_day 列作为分区列,建立3个分区: p201706, p201707, p201708
王知无-import_bigdata
2022/06/05
2.7K0
硬刚Doris系列」Apache Doris基本使用和数据模型
推荐阅读
相关推荐
下一代实时数据库:Apache Doris 【六】数据划分
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验