Doris数据划分

2023-10-28

数据划分

基本概念

Row&Column

一张表包含行(Row)和列(Column).
Column可以分为两大类:Key和Value.

Tablet & Partition

  • 在Doris的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶).每个Tablet包含若干数据行.各个Tablet之间的数据没有交集,并且在物理上是独立存储的.
  • 多个Tablet在逻辑上归属于不同的分区(Partition).一个Tablet只属于一个Partition.而一个Partition包含若干个Tablet.因为Tablet在物理上是独立存储的,所以可以视为独立存储的,所以可以视为Partition在物理上也是独立.Tablet是数据移动、复制等操作的最小物理存储单元.
  • 若干个Partition组成一个Table.Partition可以视为逻辑上最小的管理单元.数据的导入与删除,都可以或仅能针对一个Partition进行.

数据划分

列定义

  • AGGREGATE KEY数据模型中,所有没有指定聚合方式(SUM、REPLACE、MAX、MIN)的列视为Key列.而其余则为Value列.
  • 定义Key列时,可参照如下建议:
  1. Key 列必须在所有 Value 列之前。
  2. 尽量选择整型类型。因为整型类型的计算和查找比较效率远高于字符串。
  3. 对于不同长度的整型类型的选择原则,遵循 够用即可。
  4. 对于 VARCHAR 和 STRING 类型的长度,遵循 够用即可。
  5. 所有列的总字节长度(包括 Key 和 Value)不能超过 100KB。

分区与分桶

  • Doris支持两层的数据划分.第一层是Partiton,支持Range和List的划分方式.第二层是Bucket(Tablet),仅支持Hash的划分方式.
  • 也可以仅使用一层分区.使用一层分区时,只支持Bucket划分.
  1. Partition
    • Partition列可以指定一列或多列.分区类必须为KEY列.
    • 不论分区列是什么类型,在写分区值时,都需要加双引号.
    • 分区数量理论上没有上限.
    • 当不使用Partiton建表时,系统会自动生成一个和表明同名的,全值范围的Partition.该Partition对用户不可以见,并且不可删改.
Range分区
  • 分区列通常为时间列,以方便管理新旧数据.
  • Partition支持通过VALUES LESS THAN(...)仅指定上界,系统会将前一个分区的上界做为该分区的下界,生成一个左闭右开的区间.通过,也支持通过VALUES [...)同时指定上下界,生成一个左闭右开的区间.
  • 当使用VALUES LESS THAN(...)语句进行分区的增删操作时,分区范围的变化情况:
    • 分区的删除不会改变已存在分区的范围.删除分区可能出现空洞,通过VALUES LESS THAN语句增加分区时,分区的下界紧接上一个分区的上界.
    • 不可添加范围重叠的分区.
List分区
  • 分区列支持BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、DATETIME、CHAR、VARCHAR数据类型,分区值为枚举值.只有当数据为目标分区枚举值其中之一时,才可以命中分区.
  • PARTITION支持通过VALUES IN (...)来指定每个分区包含的枚举值.
  • 不可添加范围重叠的分区.
  1. Bucket
  • 如果使用了Partiton,则DISTRIBUTED...语句描述的是数据在各个分区内的划分规则.如果不使用Partition,则描述的是对整个表的数据的划分规则.
  • 分桶列可以是多列,但必须为Key列.分桶列可以和Partition列相同或不同.
  • 分桶列的选择,是在查询吞吐和查询并发之间的一种权衡:
    1. 如果选择多个分桶列,则数据分布更均匀.(适合大吞吐底并发的查询场景)
    2. 如果仅选择一个或少数分桶列,则对应的点查询仅可以触发一个分桶扫描.(适合高并发)的点查询场景.
  • 分桶的数量理论上没有上限.
  1. 关于Partition和Bucket的数量和数据量的建议
  • 一个表的Tablet总数量等于(Partition num * Bucket num).
  • 一个表的Tablet数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量.
  • 单个Tablet的数据量理论没有上下界,但建议在1G-10G的范围内.如果单个Tablet数据量过小,则数据的聚合效果不佳,且原数据管理压力大.如果数据量过大,则不利于副本的迁移、补齐,且会增加Schema Change或者Rollup操作失败重试的代价(这些操作失败重试的粒度是Tablet).
  • 当Tablet的数据量原则和数量原则冲突时,优先考虑数据量原则.
  • 在建表时,每个分区的Bucket数量统一指定.但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的Bucket数量.可以利用这个功能方便的应对数据缩小或膨胀.
  • 一个Partition的Bucket数量一旦指定,不可更改.所以在确定Bucket数量时,需要预先考虑集群扩容的情况.

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

ENGINE

在Doris中,只有olap是由Doris负责数据管理和存储的.其他ENGINE类型,如mysql、broker、es等等,本质上只是对
外部其他数据库或系统中的表的映射.

常见问题

建表操作常见问题

  1. 如果在较长的建表语句中出现语法错误,可能会出现语法错误提示不全的现象。这里罗列可能的语法错误供手动纠错:

    • 语法结构错误。请仔细阅读 HELP CREATE TABLE;,检查相关语法结构。
    • 保留字。当用户自定义名称遇到保留字时,需要用反引号 `` 引起来。建议所有自定义名称使用这个符号引起来。
    • 中文字符或全角字符。非 utf8 编码的中文字符,或隐藏的全角字符(空格,标点等)会导致语法错误。建议使用带有显示不可见字符的文本编辑器进行检查。
  2. Failed to create partition [xxx] . Timeout

    • Doris 建表是按照 Partition 粒度依次创建的。当一个 Partition 创建失败时,可能会报这个错误。即使不使用 Partition,当建表出现问题时,也会报 Failed to create partition,因为如前文所述,Doris 会为没有指定 Partition 的表创建一个不可更改的默认的 Partition。
    • 当遇到这个错误是,通常是 BE 在创建数据分片时遇到了问题。可以参照以下步骤排查:
      1. 在 fe.log 中,查找对应时间点的 Failed to create partition 日志。在该日志中,会出现一系列类似 {10001-10010} 字样的数字对。数字对的第一个数字表示 Backend ID,第二个数字表示 Tablet ID。如上这个数字对,表示 ID 为 10001 的 Backend 上,创建 ID 为 10010 的 Tablet 失败了。
      2. 前往对应 Backend 的 be.INFO 日志,查找对应时间段内,tablet id 相关的日志,可以找到错误信息。
      3. 以下罗列一些常见的 tablet 创建失败错误,包括但不限于:
        • BE 没有收到相关 task,此时无法在 be.INFO 中找到 tablet id 相关日志。或者 BE 创建成功,但汇报失败。以上问题,请参阅 [部署与升级文档] 检查 FE 和 BE 的连通性。
        • 预分配内存失败。可能是表中一行的字节长度超过了 100KB。
        • Too many open files。打开的文件句柄数超过了 Linux 系统限制。需修改 Linux 系统的句柄数限制。
    • 如果创建数据分片时超时,也可以通过在 fe.conf 中设置 tablet_create_timeout_second=xxx 以及 max_create_table_timeout_second=xxx 来延长超时时间。其中 tablet_create_timeout_second 默认是1秒, max_create_table_timeout_second 默认是60秒,总体的超时时间为min(tablet_create_timeout_second * replication_num, max_create_table_timeout_second);
  3. 建表命令长时间不返回结果。

    • Doris 的建表命令是同步命令。该命令的超时时间目前设置的比较简单,即(tablet num * replication num)秒。如果创建较多的数据分片,并且其中有分片创建失败,则可能导致等待较长超时后,才会返回错误。
    • 正常情况下,建表语句会在几秒或十几秒内返回。如果超过一分钟,建议直接取消掉这个操作,前往 FE 或 BE 的日志查看相关错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Doris数据划分 的相关文章

  • 将计算列设置为非空时遇到问题

    我在将计算列设置为时遇到问题not null 我想要实现的是C001 C002 等 同时将其设置为not null 我在论坛上读到 这可以通过使用 NULL 值的默认值 0 来实现 E g ISNULL Price Taxes 0 我尝试应
  • 如何将 PHP 会话数据保存到数据库而不是文件系统中?

    我有两个网站 一个是 TLS 一个不是 两个都适用于同一个客户端 但我需要这些网站彼此 并且仅彼此 共享通用数据users orders accounts etc 这通常可以通过以下方式完成 SESSION数据 但我显然这些不能跨其他站点工
  • FIND_IN_SET 具有多个值[重复]

    这个问题在这里已经有答案了 我想从数据库字段搜索多个值 以下是我的查询 SELECT FROM tablename WHERE FIND IN SET 12 13 15 15 category id 我如何搜索它对我不起作用 FIND IN
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • 当我尝试连接到数据库时收到“错误:无法初始化 OLE”? C#

    我正在尝试通过 C 连接到数据库 但这样做时收到一条非常无用的错误消息 08 44 17 错误 无法初始化 OLE 08 44 17 错误 无法初始化 OLE 我尝试寻找解决方案 但没有成功 我也尝试重新启动计算机 但这也没有帮助 我正在运
  • 使用 SQL Server 作为具有多个客户端的数据库队列

    给定一个充当队列的表 如何最好地配置表 查询 以便多个客户端同时处理队列 例如 下表指示了工作人员必须处理的命令 当worker完成后 它会将处理后的值设置为true ID COMMAND PROCESSED 1 true 2 false
  • 您使用的 ORM 框架的最佳功能是什么[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • Firebird数据库模式/数据差异工具

    RedGate http www red gate com为 Microsoft SQL Server 制作一个工具 允许您捕获两个数据库之间的差异 它生成更新数据库模式所需的脚本 同时保留数据 我需要为 Firebird 数据库找到这样的
  • 如何通过逗号分隔将 2 行合并为一行?

    我需要将这些单独的行合并到一列 我现在如何通过逗号分隔合并列 CID Flag Value 1 F 10 1 N 20 2 F 12 2 N 23 2 F 14 3 N 21 3 N
  • Node.js 和代码优先

    我使用代码优先方法开发实体框架 现在我正在学习 Node js 我想知道是否有一种方法可以使用 Node js 和一些库来实现相同的代码优先方法 我正在考虑使用MySql作为数据库 你可以看看续集 http docs sequelizejs
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想
  • 多个数据库连接

    我有三张桌子 categories content info and content The categories表包含类别的id及其 IDparent类别 The content info包含两列 entry id帖子的 ID 和cat
  • Python Twisted 和数据库连接

    我们的工作项目包括同步应用程序 短期 和异步 Twisted 应用程序 长期 我们正在重构我们的数据库 并将构建一个 API 模块来解耦该模块中的所有 SQL 我想创建该 API 以便同步和异步应用程序都可以使用它 对于同步应用程序 我希望
  • 如何阻止 Django 中发生级联删除?

    我的 Django 应用程序中有三个模型类 class Folder models Model folder models ForeignKey Folder null True blank True related name folder
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • 删除 mysql 数据库中超过 3 个月的行的作业

    我们使用 mysql 服务器作为集中式日志系统 我希望有一项工作来定期删除 清理超过 3 个月的表条目 做这个的最好方式是什么 提前致谢 hinling 您是否在字段中存储项目的创建日期 If so DELETE FROM myTable
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看

随机推荐

  • A*算法解八数码问题

    1 问题描述 1 1什么是八数码问题 八数码游戏包括一个33的棋盘 棋盘上摆放着8个数字的棋子 留下一个空位 与空位相邻的棋子可以滑动到空位中 游戏的目的是要达到一个特定的目标状态 标注的形式化如下 1 2 3 4 5 6 7 8 1 2问
  • [转]vue3中使用vueQuill富文本编辑器详细教程,图片上传-图片压缩

    vueQuill是支持vue3的富文本编辑器组件 使用简单方便 官方网址 https vueup github io vue quill 效果图 1 安装 在官网有详细的安装教程 npm或者yran下载 npm install vueup
  • k8s 以statefulset方式部署zookeeper集群

    k8s 以statefulset方式部署zookeeper集群 参考 k8s官网zookeeper集群的部署 数据挂着方式改成通过本地方式创建的pv https kubernetes io docs tutorials stateful a
  • [深度解剖C语言] --关键字 static

    static 最名不副实的关键字 目录 1 static修饰全局变量 2 static修饰函数 3 static修饰局部变量 static的作用 1 static修饰全局变量 我们创建两个源文件 一个test c 一个main c 现在我们
  • 【日常问题记录】visual studio 出现 E0266 “data“ 不明确 错误

    解决方法 定义的变量和内部变量冲突 将变量的把名字改成其他名字即可
  • 【Kubernetes】mac 安装minikube

    1 一 官网安装 官网 https minikube sigs k8s io 搜了下网上如何通过Mac 安装看网上文章很多 但是受限于国内网络环境 很多都不行 各种下载失败 如果你有VPN 那么官方的步骤就容易走通 brew install
  • 小酌Django3——HTTP/URL/ORM简述

    小酌Django3 HTTP URL ORM简述 HTTP Hyper Text Transfer Protocol 超文本传输协议 是客户端与服务端请求和应答的标准 TCP 封装了Web服务的整个过程 通常 由客户端发起 建立到服务器指定
  • 矩阵基本知识

    1 identity matrix 单位矩阵 除了正对角线上是1 其它地方都是0 2 square matrix 方阵 行数和列数都相等的矩阵 3 diagonal matrix 对角矩阵 只在正对角线上有值 其它地方为0 4 matrix
  • js获取昨天,今天,明天,上周,本周,下周,上月,本月,下月,去年,本年,明年,上季度,本季度,下季度,向前推日期等

    配合的elementul的日期选择器使用的 参数是这样的 1代表 上 0代表 本 1代表 下 本月 1号到今天 意思就是比如今天是10月27号 那点击这个获取的是10月1号到10月27号得 效果如图 按顺序点了一遍 从左到右 上代码
  • 双十一前4小时,CentOS 6.5server启动错误排查

    11月10日晚上8点多 眼看要到双十一了 但我要说的这段经历却和双十一毫无关系 哈哈 这天准备向CentOS6 5server的svn上传一些文件 结果开机启动时 却出现了以下的界面 这是肿么回事 依据屏幕的提示 先使用root账号登录到系
  • JSP page指令errorPage属性起什么作用呢?

    转自 JSP page指令errorPage属性起什么作用呢 下文讲述JSP中page指令的errorPage功能简介说明 如下所示 errorPage功能 errorPage 属性用于设置JSP页面 当出现异常时的跳转页面 注意事项 er
  • STM32G431控制窗帘电机-窗帘电机拆机

    前言 最近做了一个电动窗帘的控制工程 简单点说就是实现电动窗帘的校准模式 窗帘移动到任意位置 说明 本文档为原创 转载请注明出处 要进行商业合作请联系本人1151313194 qq com 一 电机爆炸图拆解 窗帘电机主要时由三部分构成 电
  • Docker的隔离机制

    Docker的隔离性主要运用Namespace 技术 传统上Linux中的PID是唯一且独立的 在正常情况下 用户不会看见重复的PID 然而在Docker采用了Namespace 从而令相同的PID可于不同的Namespace中独立存在 如
  • 自动生成GFM目录

    自动生成GFM目录 自动生成GFM目录 参考文献 引言 使用方法 对于本地文档 对于远程文档 对于多个文档 本地与远程结合 自动插入和更新目录 输出目录文件 工作流程 目前工作流程注意事项及问题 参考文献 https github com
  • Go语言--Nohup后台启动

    linux的nohup命令用法 在应用Unix Linux时 我们一般想让某个程序在后台运行 于是我们将常会用 在程序结尾来让程序自动运行 nohup命令格式 nohup root start sh 在shell中回车后提示 appendi
  • HTML5(六)preserve and recover

    HTML5 六 preserve and recover 1 save the state of canvas context 2 So we have two method to save and restore the state of
  • run nerf

    install cuda install cudnn install anoconda 2022 08 18 wget https repo anaconda com archive Anaconda3 2022 05 Linux x86
  • 接口自动化get请求一些小知识点

    get 请求 requests get get请求的参数可以写在url里 写在url里时 参数和url之间需要加 get 请求的参数可以不写在url里 可以组织为字典传给参数param get 请求可以不传参数 获取响应信息 r reque
  • React之Hook(四)——使用 Effect Hook

    Effect Hook 可以让你在函数组件中执行副作用操作 import React useState useEffect from react function Example const count setCount useState
  • Doris数据划分

    数据划分 基本概念 Row Column 一张表包含行 Row 和列 Column Column可以分为两大类 Key和Value Tablet Partition 在Doris的存储引擎中 用户数据被水平划分为若干个数据分片 Tablet