当前位置: 首页 > news >正文

Starrocks Compaction的分析

背景

本文基于 Starrocks 3.1.7

结论

Starrocks 会启动一个线程周期性的去进行Compaction,该周期间隔为 200 MS, 该Compaction以table的partition为切入点,tablet(也就是bucket)为粒度进行task的创建。

分析

CompactionMgr start 方法会启动一个CompactionScheduler 用来启动一个 合并的周期性任务.
这里的周期会由 LOOP_INTERVAL_MS参数控制,默认是 200ms.
然后每个周期内会调用 runOneCycle 方法:

    protected void runOneCycle() {cleanPartition();// Schedule compaction tasks only when this is a leader FE and all edit logs have finished replay.// In order to ensure that the input rowsets of compaction still exists when doing publishing version, it is// necessary to ensure that the compaction task of the same partition is executed serially, that is, the next// compaction task can be executed only after the status of the previous compaction task changes to visible or// canceled.if (stateMgr.isLeader() && stateMgr.isReady() && allCommittedCompactionsBeforeRestartHaveFinished()) {schedule();history.changeMaxSize(Config.lake_compaction_history_size);failHistory.changeMaxSize(Config.lake_compaction_fail_history_size);}}
  • cleanPartition 这里会清除无效的分区,便于后续进行Compaction
  • 这里会有个 FE leader的判断(这里所涉及到的GlobalStateMgr只是单个FE的状态),只有是leader节点才可以进行Compaction,最主要的逻辑还是在schedule
    方法中:
      for (Iterator<Map.Entry<PartitionIdentifier, CompactionJob>> iterator = runningCompactions.entrySet().iterator();...if (job.isCompleted()) {job.getPartition().setMinRetainVersion(0);try {commitCompaction(partition, job);assert job.transactionHasCommitted();} catch (Exception e) {...}} else if (job.isFailed()) {job.getPartition().setMinRetainVersion(0);errorMsg = Objects.requireNonNull(job.getFailMessage(), "getFailMessage() is null");job.abort(); // Abort any executing task, if present.}if (errorMsg != null) {iterator.remove();job.finish();failHistory.offer(CompactionRecord.build(job, errorMsg));compactionManager.enableCompactionAfter(partition, MIN_COMPACTION_INTERVAL_MS_ON_FAILURE);abortTransactionIgnoreException(partition.getDbId(), job.getTxnId(), errorMsg);continue;}...int index = 0;int compactionLimit = compactionTaskLimit();int numRunningTasks = runningCompactions.values().stream().mapToInt(CompactionJob::getNumTabletCompactionTasks).sum();if (numRunningTasks >= compactionLimit) {return;}List<PartitionIdentifier> partitions = compactionManager.choosePartitionsToCompact(runningCompactions.keySet());while (numRunningTasks < compactionLimit && index < partitions.size()) {PartitionIdentifier partition = partitions.get(index++);CompactionJob job = startCompaction(partition);if (job == null) {continue;}numRunningTasks += job.getNumTabletCompactionTasks();runningCompactions.put(partition, job);if (LOG.isDebugEnabled()) {LOG.debug("Created new compaction job. partition={} txnId={}", partition, job.getTxnId());}}
    • 选取正在进行的Compaction的job,如果该任务完成了compaction(每个tablets都完成了compaction) ,但是事务没有提交,则完成compaction事务的提交,
      否则如果任务失败了,则abort该job。最终会把该任务从runnning队列中移除掉。如果是失败任务的话,还会记录到failHistory中,并会重新进行Compaction的任务的延迟提交(延迟间隔为LOOP_INTERVAL_MS*10,其中LOOP_INTERVAL_MS 为200ms)

    • 如果Compaction事务已经提交了,则会记录到history中,并会重新进行Compaction的任务的延迟提交(延迟间隔为LOOP_INTERVAL_MS*2,其中LOOP_INTERVAL_MS 为200ms)

    • 处理完正在运行的Compaction任务后,会构建当前的Compaction任务

      • 首先会通过compactionTaskLimit方法获取本次Compaction任务的个数限制,如果lake_compaction_max_tasks大于等于0,则会根据lake_compaction_max_tasks配置来,否则会根据系统的BE数和CN数乘以16来计算。
      • 如果 运行的task(以Tablets为粒度计数的)大于了该compactionTaskLimit,则此次Compaction结束,否则继续下一步
      • compactionManager.choosePartitionsToCompact 从已有的分区中。并且排除掉 runningCompactions里正在运行的Compaction任务中涉及的partition。
        choosePartitionsToCompact 涉及到Sorter(默认ScoreSorter) 和selector(ScoreSelector),
        ScoreSelector 会选择 lake_compaction_score_selector_min_score(默认为10)并且到了合并的时间的分区
        ScoreSorter 会按照compactionScore 从高到低进行排序
      • 对于每一个被选出来的分区,会进行调用startCompaction方法进行compaction任务的构建
        这里会调用collectPartitionTablets方法,用来选择tablet以及对应的该tablet对应的backend
      • 调用createCompactionTasks创建CompactionTask,这里有多少个backend就有多少个task
        调用thrift rpc服务往对应的backend发送Compact请求,并组装成CompactionJob
          List<CompactionTask> tasks = new ArrayList<>();for (Map.Entry<Long, List<Long>> entry : beToTablets.entrySet()) {ComputeNode node = systemInfoService.getBackendOrComputeNode(entry.getKey());if (node == null) {throw new UserException("Node " + entry.getKey() + " has been dropped");}LakeService service = BrpcProxy.getLakeService(node.getHost(), node.getBrpcPort());CompactRequest request = new CompactRequest();request.tabletIds = entry.getValue();request.txnId = txnId;request.version = currentVersion;request.timeoutMs = LakeService.TIMEOUT_COMPACT;CompactionTask task = new CompactionTask(node.getId(), service, request);tasks.add(task);}return tasks;
        
    • 累计numRunningTasks计数,便于控制Compaction的并发执行,并且回放到 runningCompactions

其他

前文提到的 一些 FE的配置 ,如lake_compaction_max_tasks 都是可以配置的,
可以通过 命令* admin set frontend config (“lake_compaction_max_tasks” = “0”);* ,具体的参考ADMIN_SET_CONFIG,
注意: 这个命令只是修改了当前内存中的变量的值,如果需要永久的修改,需要配置到fe.conf

相关文章:

Starrocks Compaction的分析

背景 本文基于 Starrocks 3.1.7 结论 Starrocks 会启动一个线程周期性的去进行Compaction&#xff0c;该周期间隔为 200 MS, 该Compaction以table的partition为切入点&#xff0c;tablet(也就是bucket)为粒度进行task的创建。 分析 CompactionMgr start 方法会启动一个Com…...

淘淘商城实战高并发分布式项目(有源码)

通过百度网盘分享的文件&#xff1a;淘淘商城实战高并发分布式项目(有源码) 链接&#xff1a;https://pan.baidu.com/s/1V94gRALxHgMVwpcXoE-miA?pwdglu7 提取码&#xff1a;glu7 在互联网技术飞速发展的当下&#xff0c;高并发分布式项目成为了众多电商平台等大型应用的核心…...

内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?

相关技术 要实现“内网部署&#xff0c;外网访问”&#xff0c;可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释&#xff1a; 一、内网穿透 内网穿透是一种技术&#xff0c;它通过将内网设备映射到公网上的方式&#xff0c;实现外网访问内…...

Jenkins系列

jenkins 1、搭建Jenkins 搭建Jenkins 2、这是什么 3、这是什么 4、 这是什么 5、这是什么 文章目录 jenkins1、搭建Jenkins2、这是什么3、这是什么4、 这是什么5、这是什么 前言 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随…...

技术总结(二十四)

一、Redis 分布式锁的常见使用场景有哪些&#xff1f; 资源竞争控制 数据库事务控制&#xff1a;在分布式系统中&#xff0c;多个服务可能会同时对数据库中的同一行数据进行操作。例如&#xff0c;在一个电商系统里&#xff0c;多个订单处理服务可能会同时尝试更新同一个订单的…...

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移&#xff1a;早发现&#xff0c;早解决技术细节&#xff1a;静态代码分析与兼容性测试应用场景 按需加载&#xff1a;优化性能&#xff0c;提升用户体验技术细节&#xff1a;模块化与懒加载实现应用场景 应用加密&#xff1a;保护应用代码安全&…...

深入解析TOML、XML、YAML和JSON:优劣对比与场景应用

摘要&#xff1a;本文将介绍四种常见的配置文件和数据交换格式&#xff1a;TOML、XML、YAML和JSON&#xff0c;通过具体的使用例子分析它们的优缺点&#xff0c;并探讨在不同场景下的应用选择。 正文&#xff1a; 一、TOML 优点&#xff1a; 易于阅读和编写&#xff1a;TOML的…...

前端UniApp面试题及参考答案(100道题)

目录 UniApp 支持哪些平台? UniApp 在不同平台上的表现有何差异? 如何处理 UniApp 中的平台差异? UniApp 项目创建与目录结构 项目创建 目录结构 如何创建一个 UniApp 项目? UniApp 项目的基本目录结构是什么样的? 解释一下 UniApp 中的页面生命周期钩子函数有哪…...

MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!

2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头&#xff0c;用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用&#xff0c;也可以用于模式匹配。常量的值目前只能是字面量&#xff1a; const MIN_…...

Linux相关概念和易错知识点(20)(dentry、分区、挂载)

目录 1.dentry &#xff08;1&#xff09;路径缓存的原因 &#xff08;2&#xff09;dentry的结构 ①多叉树结构 ②file和dentry之间的联系 ③路径概念存在的意义 2.分区 &#xff08;1&#xff09;为什么要确认分区 &#xff08;2&#xff09;挂载 ①进入分区 ②被挂…...

论 ONLYOFFICE:开源办公套件的深度探索

公主请阅 引言第一部分&#xff1a;ONLYOFFICE 的历史背景1.1 开源软件的崛起1.2 ONLYOFFICE 的发展历程 第二部分&#xff1a;ONLYOFFICE 的核心功能2.1 文档处理2.2 电子表格2.3 演示文稿 第三部分&#xff1a;技术架构与兼容性3.1 技术架构3.2 兼容性 第四部分&#xff1a;部…...

兵马未动,粮草先行-InnoDB统计数据是如何收集的

我们前面介绍查询成本的时候经常用到一些统计数据&#xff0c;比如通过SHOW TABLE STATUS可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;本章将聚焦…...

oracle服务器意外宕机数据库启动失败故障处理记录

客户反馈由于服务器意外宕机&#xff0c;导致数据库业务不能正常运行&#xff0c;经过一番努力后通过redo日志恢复成功&#xff01; 故障描述&#xff1a;ORA-00600: 内部错误代码, 参数: [krctcr_4], [1179922061], [1179942042], [], [], [], [], [], [], [], [], [] 现将主要…...

学习笔记——MathType公式编号:右编号和随章节变化

1.如何在word文档中插入带有编号的公式&#xff1f; 步骤&#xff1a;(前提是已经安装mathtype) 2.MathType公式编号怎么随章节变化&#xff1f; 想要编号级数也随标题级数进行自动变化&#xff0c;则需要插入或修改文档的“分隔符” 步骤&#xff1a;...

如何使用 SSH 连接并管理你的 WordPress 网站

在当今数字化的世界里&#xff0c;网站的管理与维护至关重要。对于使用 WordPress 搭建网站的用户而言&#xff0c;掌握基本的 SSH&#xff08;安全壳&#xff09;命令能够极大地简化网站管理工作。本指南将向你介绍 SSH 的基本知识&#xff0c;并教你如何通过 SSH 连接和管理你…...

力扣60. 排列序列

描述 力扣60. 排列序列 给出集合 [1,2,3,…,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; “123” “132” “213” “231” “312” “321” 给定 n 和 k&#xff0c;返回…...

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…...

时间管理应用(可复制源码)

创建一个简单的时间管理应用程序&#xff0c;结合 Pomodoro 技术使用 HTML、CSS 和 JavaScript 1. HTML 创建一个基本的 HTML 文件 (index.html)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"&…...

SQL server 列转行

在 SQL Server 中&#xff0c;将列转换为行的操作通常被称为“透视”&#xff08;Pivot&#xff09;的逆操作&#xff0c;即“反透视”&#xff08;Unpivot&#xff09;。SQL Server 提供了 UNPIVOT 关键字来实现这一功能。假设你有一个表 EmployeeDetails&#xff0c;其中包含…...

aws申请ssl证书的方法【该证书仅供aws】

这里先声明&#xff0c;过程是对的&#xff0c;最终没有达到目的。 原本想着申请ssl证书替代&#xff0c;结果发现aws证书只能给自己的服务器用 但是整套申请证书以及下载&#xff0c;以及使用aws控制台的过程可以参考借鉴。 起因&#xff1a; 腾讯云的ssl证书越来越没法用了…...

5步清理60GB重复视频:Krokiet视频查重工具全攻略

5步清理60GB重复视频&#xff1a;Krokiet视频查重工具全攻略 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: https://gitcode.…...

Magisk完整实践指南:从Root权限获取到系统级定制

Magisk完整实践指南&#xff1a;从Root权限获取到系统级定制 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk Magisk作为Android系统Root权限管理的主流解决方案&#xff0c;提供了系统级定制能力而无需修…...

告别布局跳动!Android Dialog+EditText+软键盘的终极适配指南(含Kotlin代码)

Android Dialog软键盘适配全攻略&#xff1a;从布局跳动到完美交互 在Android开发中&#xff0c;Dialog与软键盘的交互一直是让开发者头疼的问题。当EditText获得焦点时&#xff0c;弹出的软键盘经常会遮挡输入框或导致布局跳动&#xff0c;严重影响用户体验。本文将深入探讨Di…...

CHORD-X深度研究报告生成:集成MySQL进行数据存储与管理的配置指南

CHORD-X深度研究报告生成&#xff1a;集成MySQL进行数据存储与管理的配置指南 如果你正在使用CHORD-X这类强大的研究报告生成工具&#xff0c;可能会遇到一个甜蜜的烦恼&#xff1a;生成的内容越来越多&#xff0c;数据越来越杂&#xff0c;怎么才能把它们管得井井有条&#x…...

Umi-OCR服务化集成解决方案:将离线OCR能力无缝嵌入你的技术栈

Umi-OCR服务化集成解决方案&#xff1a;将离线OCR能力无缝嵌入你的技术栈 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.c…...

DirectX兼容性解决方案:让经典游戏在Windows 10重获新生

DirectX兼容性解决方案&#xff1a;让经典游戏在Windows 10重获新生 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10 by wrapping DirectX dlls. Also allows loading custom libraries with the file extension .asi into gam…...

共享店铺模式小程序开发方案

共享店铺模式是一种将线下实体店铺资源通过数字化手段进行整合与共享的商业模式&#xff0c;小程序作为轻量级应用非常适合实现这一目标。以下是开发共享店铺模式小程序的关键要点&#xff1a;核心功能模块设计用户端功能需包含注册登录、店铺浏览、预约下单、支付系统、评价反…...

【LangGraph】 官方demo调整为本地大模型实现

官网文档链接&#xff1a; https://docs.langchain.com/oss/python/langgraph/quickstart#full-code-example 样例代码&#xff1a; # 第一步&#xff1a;定义工具与大模型 # 导入LangChain工具装饰器&#xff0c;用于将普通函数封装为Agent可调用的工具 from langchain.tool…...

十字头零件的机械加工工艺规程及工装夹具设计 (论文+CAD图纸+任务书+过程卡+工序卡+外文翻译+参考文献……)

十字头零件作为机械传动系统中的关键构件&#xff0c;其加工精度直接影响设备运行的稳定性与寿命。制定科学合理的机械加工工艺规程及配套工装夹具设计方案&#xff0c;是确保零件质量、提升加工效率的核心环节。工艺规程需系统规划从毛坯准备到成品检验的全流程&#xff0c;涵…...

QT:Tab Widget的进阶应用与实战技巧

1. Tab Widget的动态管理技巧 第一次用QT做带标签页的界面时&#xff0c;我习惯在设计器里把Tab页都固定好。直到接手一个需要动态加载配置文件的仪表盘项目&#xff0c;才发现动态增删Tab才是真实开发中的常态。比如用户点击"新建图表"按钮时&#xff0c;我们需要实…...