首页 > 其他分享 >doris:自动分桶

doris:自动分桶

时间:2025-01-12 20:33:05浏览次数:3  
标签:分桶 min 50GB 自动 数据量 128 磁盘 doris

用户经常设置不合适的 bucket,导致各种问题,这里提供一种方式,来自动设置分桶数。当前只对 OLAP 表生效。

警告

注意:这个功能在被 CCR 同步时将会失效。如果这个表是被 CCR 复制而来的,即 PROPERTIES 中包含is_being_synced = true时,在show create table中会显示开启状态,但不会实际生效。当is_being_synced被设置为 false 时,这些功能将会恢复生效,但is_being_synced属性仅供 CCR 外围模块使用,在 CCR 同步的过程中不要手动设置。

以往创建分桶时需要手动设定分桶数,而自动分桶推算功能是 Apache Doris 可以动态地推算分桶个数,使得分桶数始终保持在一个合适范围内,让用户不再操心桶数的细枝末节。首先说明一点,为了方便阐述该功能,该部分会将桶拆分为两个时期的桶,即初始分桶以及后续分桶;这里的初始和后续只是本文为了描述清楚该功能而采用的术语,Apache Doris 分桶本身没有初始和后续之分。从上文中创建分桶一节我们知道,BUCKET_DESC 非常简单,但是需要指定分桶个数;而在自动分桶推算功能上,BUCKET_DESC 的语法直接将分桶数改成"Auto",并新增一个 Properties 配置即可:

-- 旧版本指定分桶个数的创建语法
DISTRIBUTED BY HASH(site) BUCKETS 20

-- 新版本使用自动分桶推算的创建语法
DISTRIBUTED BY HASH(site) BUCKETS AUTO
properties("estimate_partition_size" = "2G")

新增的配置参数 estimate_partition_size 表示一个单分区的数据量。该参数是可选的,如果没有给出则 Doris 会将 estimate_partition_size 的默认值取为 10GB。从上文中已经得知,一个分桶在物理层面就是一个 Tablet,为了获得最好的性能,建议 Tablet 的大小在 1GB - 10GB 的范围内。

那么自动分桶推算是如何保证 Tablet 大小处于这个范围内的呢?

  • 若是整体数据量较小,则分桶数不要设置过多
  • 若是整体数据量较大,则应使桶数跟总的磁盘块数相关,充分利用每台 BE 机器和每块磁盘的能力

提示

estimate_partition_size 属性不支持 alter 操作

初始分桶推算

  1. 先根据数据量得出一个桶数 N。首先使用 estimate_partition_size 的值除以 5(按文本格式存入 Doris 中有 5 比 1 的数据压缩比计算),得到的结果为:
(, 100MB),则取 N=1
[100MB, 1GB),则取 N=2
[1GB, ),则每 GB 一个分桶

  1. 根据 BE 节点数以及每个 BE 节点的磁盘容量,计算出桶数 M。
其中每个 BE 节点算 1,每 50G 的磁盘容量算 1,
M 的计算规则为:M = BE 节点数 * ( 一块磁盘块大小 / 50GB) *磁盘块数 
举例:有 3 台 BE,每台 BE 都有 4 块 500GB 的磁盘,那么 M = 3 (500GB / 50GB) 4 = 120

  1. 得到最终的分桶个数计算逻辑:
先计算一个中间值 x = min(M, N, 128), 
如果 x < N 并且 x < BE 节点个数,则最终分桶为 y 即 BE 节点个数;
否则最终分桶数为 x

  1. x = max(x, autobucket_min_buckets), 这里 autobucket_min_buckets 是在 Config 中配置的,默认是 1

上述过程伪代码表现形式为:

int N = 计算 N 值;
int M = 计算 M 值;

int y = BE 节点个数;
int x = min(M, N, 128);

if (x < N && x < y) {
  return y;
}
return x;

  1. 示例:有了上述算法,咱们再引入一些例子来更好地理解这部分逻辑。
case1:
数据量 100 MB,10 台 BE 机器,2TB *3 块盘
数据量 N = 1
BE 磁盘 M = 10* (2TB/50GB) * 3 = 1230
x = min(M, N, 128) =  1
最终:1

case2:
数据量 1GB, 3 台 BE 机器,500GB *2 块盘盘
数据量 N = 2
BE 磁盘 M = 3* (500GB/50GB) * 2 = 60
x = min(M, N, 128) =  2
最终:2

case3:
数据量 100GB,3 台 BE 机器,500GB *2 块盘
数据量 N = 20
BE 磁盘 M = 3* (500GB/50GB) * 2 = 60
x = min(M, N, 128) =  20
最终:20

case4:
数据量 500GB,3 台 BE 机器,1TB *1 块盘
数据量 N = 100
BE 磁盘 M = 3* (1TB /50GB) * 1 = 6060
x = min(M, N, 128) =  63
最终:63

case5:
数据量 500GB,10 台 BE 机器,2TB *3 块盘*3 块盘
数据量 N =  100
BE 磁盘 M = 10* (2TB / 50GB) * 3 = 1230
x = min(M, N, 128) =  100
最终:100

case 6:
数据量 1TB,10 台 BE 机器,2TB *3 块盘
数据量 N =  205
BE 磁盘 M = 10* (2TB / 50GB) * 3 = 1230
x = min(M, N, 128) =  128
最终:128

case 7:
数据量 500GB,1 台 BE 机器,100TB *1 块盘
数据量 N = 100
BE 磁盘 M =  1* (100TB / 50GB) * 1 = 2048
x = min(M, N, 128) =  100
最终:100

case 8:
数据量 1TB, 200 台 BE 机器,4TB *7 块盘
数据量 N = 205
BE 磁盘 M = 200* (4TB / 50GB) * 7 = 114800
x = min(M, N, 128) =  128
最终:200

后续分桶推算

上述是关于初始分桶的计算逻辑,后续分桶数因为已经有了一定的分区数据,可以根据已有的分区数据量来进行评估。后续分桶数会根据最多前 7 个分区数据量的 EMA(短期指数移动平均线)值,作为 estimate_partition_size 进行评估。此时计算分桶有两种计算方式,假设以天来分区,往前数第一天分区大小为 S7,往前数第二天分区大小为 S6,依次类推到 S1。

  • 如果 7 天内的分区数据每日严格递增,则此时会取趋势值

    有 6 个 delta 值,分别是

    S7 - S6 = delta1,
    S6 - S5 = delta2,
    ...
    S2 - S1 = delta6
    

    由此得到 ema(delta) 值:那么,今天的 estimate_partition_size = S7 + ema(delta)。

  • 非第一种的情况,此时直接取前几天的 EMA 平均值

    今天的 estimate_partition_size = EMA(S1, ..., S7)。

说明

根据上述算法,初始分桶个数以及后续分桶个数都能被计算出来。跟之前只能指定固定分桶数不同,由于业务数据的变化,有可能前面分区的分桶数和后面分区的分桶数不一样,这对用户是透明的,用户无需关心每一分区具体的分桶数是多少,而这一自动推算的功能会让分桶数更加合理。

开启 autobucket 之后,在show create table的时候看到的 schema 也是BUCKETS AUTO.如果想要查看确切的 bucket 数,可以通过show partitions from ${table};来查看。

标签:分桶,min,50GB,自动,数据量,128,磁盘,doris
From: https://blog.csdn.net/qq_36070104/article/details/145098647

相关文章

  • Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]
    Cut:AC自动机简单题。思路看见多个模式串以及求前缀,很显然能想到构建一个AC自动机。那么在用\(T\)查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树insert的时候就能求出来。求出每一位的最长前缀后,因为这些部分都不能作为分割点,所以将这些区域用差分......
  • GitLab + Jenkins + Nginx + Lua 实现代码自动分发
    个人博客地址:GitLab+Jenkins+Nginx+Lua实现代码自动分发|一张假钞的真实世界在大数据Hive数据仓库的开发中,主要是shell+HQL的脚本开发。脚本的测试需要放到适当的大数据环境中进行。如果大家共用GitLab项目上的同一个Branch进行测试需要代码频繁合并,影响效率。我的......
  • Android 13.0 framework层实现点击空白处自动隐藏输入法功能
    1.前言 在13.0的系统rom产品定制化开发中,在进行一些定制开发中,在某些无源码的app中,如果app中没实现点击空白区域外自动隐藏输入法功能的时候,那么就需要在系统framework层中进行相关功能的开发,接下来看下相关功能的实现2.framework层实现点击空白处自动隐藏输入法功能的核......
  • 客梯自动监测识别摄像机
    当今社会,随着城市建设的快速发展,客梯作为现代化建筑不可或缺的一部分,其安全性与效率显得尤为重要。为了提升客梯的安全管理水平,智能监测技术应运而生,尤其是客梯自动监测识别摄像机系统的应用,为乘客和维护人员提供了有效的安全保障和管理支持。传统的客梯监控主要依赖于操作员的手......
  • 山体滑坡自动监测识别摄像机
    对于现代社会而言,山体滑坡作为自然灾害之一,给人们的生命和财产安全带来了巨大威胁。为了有效预防和管理山体滑坡风险,智能监测技术的应用显得尤为重要,尤其是山体滑坡自动监测识别摄像机系统的引入,为早期预警和应急响应提供了强有力的支持。传统的山体滑坡监测主要依赖于人工观测和......
  • 777、基于51单片机的频率计仿真设计(3挡,自动)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能1、4位十进制数显示测量结果,小数点自动定位,单位指示灯自动显示。2、测量信号频率范围1HZ-10KHZ,10KHZ-100KHZ,100KHZ-1MHZ;被测信号幅度范围V......
  • 实现windows下简单的自动化窗口管理
    转载或者引用本文内容请注明来源及原作者一、问题描述用户的应用场景非常简单:一个无主播的线上弹幕游戏,需要定时开启和关闭直播,直播平台是在Windows端的某播伴侣。二、分析需求首先需要定时任务管理。在特定的时间进行应用的管理,并且能够支持用户进行修改其次需要在对应......
  • 行政行不行——iframe在自动表单处理中的处理
    学完基础应用,打开员工网页表单练手。点击菜单什么的都很顺利,但是在定位选项框的时候,就是报错,是怎么回事?没有人教,一头雾水,连搜索都找不着关键词。在盲目搜索半天后,终于,大数据指引我们到了正确的方向——网页表单结构的原因。查看我们要定位的元素,看是否有frame标签。如果本......
  • 自动化部署工具是指一类软件工具,旨在简化和加速软件应用、系统或服务的部署过程。它们
    自动化部署工具是指一类软件工具,旨在简化和加速软件应用、系统或服务的部署过程。它们通过自动化各种部署任务,如配置、安装、更新、扩展等,帮助开发团队和运维团队提高效率,减少人为错误,确保一致性,并加速软件的交付。常见的自动化部署工具的英文全称及其简称:Jenkins英文全称:Je......
  • 自动化运维脚本编写规范是指在编写运维自动化脚本时,遵循的一系列最佳实践和标准。这些
    自动化运维脚本编写规范是指在编写运维自动化脚本时,遵循的一系列最佳实践和标准。这些规范确保脚本的可读性、可维护性、可靠性和一致性,同时减少出错的机会,并增强团队之间的协作效率。1. 是什么自动化运维脚本编写规范是为了确保脚本在自动化运维过程中能够高效、清晰、安全地......