Apache Doris 中Compaction问题分析和典型案例
说明
此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括
- Compaction socre高
- Compaction失败
- compaction占用资源多
- Compaction core
如果问题紧急,可联系社区同学处理
如果阅读中有问题,可以反馈给社区同学。
1 compaction score高
找出score最高的若干个tablet,一般是用户比较高频导入的表
分析score最高的tablet形成的原因,以下几个为常见的原因
1.1 compaction持续失败导致的compaction socre高
判断方式:
1 grep ${tablet_id} be.INFO | grep compaction,看是否有持续失败的日志

2 curl ip:port/api/compaction/show?tablet_id=${tablet_id} ,可以看curl命令查看compaction status,目前只有base的status。

处理方式:参照第2节进行处理
1.2 用户使用不当
1.2.1 建表时,bucket数量设置的不合适。
设置的太小,导致的compaction可能不能充分并发执行。
设置的太多,可能会有比较多的compaction任务调度。
建议根据tablet 1GB - 10GB的最佳实践,设置bucket数量
其他使用不当的方式,待补充…
1.3 compaction策略问题
score很高的tablet,却很久没有执行过compaction
判断方式:
1 通过curl ip:port/api/compaction/show?tablet_id=${tablet_id} 查看tablet compaction上一次执行的时间。

2 grep ${tablet_id} be.INFO | grep compaction,看该tablet compaction执行的历史,是否该tablet很长时间没有进行compaction
处理方式:
1 临时处理手段,手动触发compaction:
curl -X POST http://be_host:webserver_port/api/compaction/run?tablet_id=xxxx&compact_type=cumulative
2 这类问题可能是策略的bug,需要联系社区同学跟进处理,需要以下信息
Compaction score的监控
Compaction score从低到高涨上来时BE的日志
Compaction score比较高的tablet的rowset 布局,通过curl ip:port/api/compaction/show?tablet_id=${tablet_id} 可以拿到
1.4 导入速度超过了compaction的速度
这里又分为两种情况
1.4.1 cpu负载不高
可能是compaction的并发不够,需要调整下面这些配置(根据情况修改)
max_base_compaction_threads 默认是4
max_cumu_compaction_threads 默认是每个盘1个
compaction_task_num_per_disk,默认是4
compaction_task_num_per_fast_disk,默认是8
判断方式:
1 查看compaction 一段时间内的平均并发数
cloud使用这个命令
grep -i compaction be.INFO | grep -i finish | awk '{print $8}' | awk -F\| '{print $1}' | awk -Fms '{print $1}' | awk -F= '{sum+=$2} END {print sum}'
开源doris使用这个命令
cat be/log/be.INFO | grep -E "succeed to do base compaction|succeed to do cumulative compaction" | awk '{print $23}' | awk -F= '{print $2}' | awk -Fs '{sum+=$1} END {print sum}'
- 用上述的命令统计一段时间内compaction的总耗时(注意,cloud统计出的耗时单位是毫秒,而社区统计出的耗时单位是秒)。比如耗时是4000秒
- 计算统计的clock time,比如统计的日志文件包含14:00 到 14:20日志,那clock time = 20min * 60 = 1200秒
- compaction的平均并发 4000 / 1200 = 3.3 并发
2 获取BE的配置的并发限制和compaction线程数量,查看BE conf,如果没有配置则为默认
如果实际的并发已经接近设置的并发,则是并发不足
1.4.2 cpu负载比较高
处理方式:
1 如果BE的负载比较高,且用户的导入比较高频,看下能否攒批导入,降低导入频率
2 如果导入频率也不高,则需要考虑扩容
1.5 compaction score持续升高,导致导入报-235
这种现象之前出现的比较多,单独列出来,这是一个现象,原因可能还是上述的一种,针对此现象有一个临时的处理手段,如果对报-235的表没有频繁的导入和查询,可以适当调大max_tablet_version_num。这只是一个临时手段,还是要找到compaction score升高的原因
max_tablet_version_num,默认值是2000
2 Compaction 失败
2.1 定位问题
通过grep compaction be.INFO | grep {tablet_id} 查看compaction失败的具体原因。
原因包括但不限于,内存分配失败,compaction数据校验失败
2.1.1 内存问题
内存分配失败会有类似一下日志
W0427 19:40:58.254163 7873 compaction.cpp:372] fail to do CloudBaseCompaction. res=[MEM_LIMIT_EXCEEDED]PreCatch error code:11, [E11] Allocator sys memory check failed: Cannot alloc:5148, consuming tracker:<BaseCompaction:135202205>, peak used 1435738416, current used 1164740816, exec node:<>, process memory used 105.03 GB exceed limit 109.63 GB or sys available memory 11.71 GB less than low water mark 12.18 GB.
no enable stack, _FILE:/home/ec2-user/selectdb-core/be/src/olap/rowset/segment_v2/segment_iterator.cpp, __LINE:2000, __FUNCTION_:auto doris::segment_v2::SegmentIterator::next_batch(vectorized::Block *)::(anonymous class)::operator()() const, tablet=135202205.758764227.6e8b36c0cc1b4ac2-9f14bb5b6d058fe6, output_version=[2-8237]
内存问题又分为以下几种情况
- compaction本身占用内存不多,BE其他的请求(比如导入,查询)占用了过多的内存,导致的compaction偶发失败。
- 单个compaction占用内存多
- 多个compaction占用内存多
对于上述细分的原因需要查看memtracker,当前compaction内存使用的情况来定位。

2.1.2 compaction校验失败
if (_input_row_num != _output_rowset->num_rows() + _stats.merged_rows + _stats.filtered_rows) {return Status::Error<CHECK_LINES_ERROR>("row_num does not match between cumulative input and output! tablet={}, ""input_row_num={}, merged_row_num={}, filtered_row_num={}, output_row_num={}",_tablet->tablet_id(), _input_row_num, _stats.merged_rows, _stats.filtered_rows,_output_rowset->num_rows());}
2.2 处理方式
2.2.1 内存问题
细分原因1:compaction本身占用内存不多,BE其他的请求(比如导入,查询)占用了过多的内存,导致的compaction偶发失败。
本身问题不在compaction,可以观察下,如何compaction不是持续的失败,并且compaction score没有明显的身高,可以暂不处理,持续观察。
细分原因2:单个compaction占用内存多
可以暂时通过限制参与compaction的rowset个数来限制compaction的使用,调节BE的cumulative_compaction_max_deltas这个配置值,默认是1000
细分原因3:多个compaction占用内存多
可以暂时通过限制参与compaction的rowset个数来限制compaction的使用,调节BE的cumulative_compaction_max_deltas这个配置值,默认是1000
或者:
可以通过限制compaction线程的个数来限制内存,be对应配置,max_base_compaction_threads和max_cumu_compaction_threads
2.2.2 compaction 校验失败
可能是正确性问题,需联系社区同学定位处理
3 compaction占用资源多
3.1 compaction占用cpu资源多
top -H 确认是否是compaction线程

处理方式
处理方式1
可以调整做compaction的线程数量
max_base_compaction_threads,默认是4 max_cumu_compaction_threads,默认每块盘1个
处理方式2
可以调整每个盘上compaction的并发数量
如果配置的是HDD盘,调整compaction_task_num_per_disk,
如果配置的是SSD盘,调整compaction_task_num_per_fast_disk
compaction_task_num_per_disk,默认是4
compaction_task_num_per_fast_disk,默认是8
调节完,要主要观察compaction score的变化,防止出现compaction并发限制的太小,导致的compaction score升高的问题
3.2 compaction占用内存资源多
参考第二节关于内存超限导致compaction失败的处理方式
4 compaction导致BE core
分情况处理
偶发一次:
收集be.out,BE.info,core dump,be版本信息(包括具体的commit id),判断是否有特殊的操作,比如scheam change等操作,然后联系社区同学
持续失败:
这种情况可能会影响用户的可用性,可以先止损。关掉这个表的compaction
1 先通过导致compaction的tablet id找到表,show tablet {tablet_id}命令可以找到表名
2 关闭这个BE的compaction,配置BE.conf disable_auto_compaction = true
3 关掉这个表的compaction,alter table ${tableName} set (“disable_auto_compaction” = “true”)
4 打开BE的compaction,配置BE.conf disable_auto_compaction = false
虽然core在compaction的栈上,但是很可能不是compaction的问题,因为compaction是一个后台的不断进行的读写线程,不断的触发读写。很可能查询也会core,只是没有进行查询,所以通过compaction暴露了这个问题。对于此类core,需要联系社区的同学定位处理。
相关文章:
Apache Doris 中Compaction问题分析和典型案例
说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急,可联系社区同学处理 如果阅读中有问题,可以反馈给社区同学。 1 compaction …...
redis面试(十七)MultiLock加锁和释放锁
MultiLock MultiLock,英语直译为多个锁。 redisson分布式锁中的MultiLock这个机制,可以将多个锁合并为一个大锁,对一个大锁进行统一的申请加锁以及释放锁 一次性锁定多个资源,再去处理一些事情,然后事后一次性释放所…...
电脑开机LOGO修改教程_BIOS启动图片替换方法
准备工具:刷BIOS神器和change logo,打包下载地址:https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器,点击备份BIOS,保存到桌面 二.打开change logo,1.点击load image,选…...
微前端架构的持续集成与持续部署实践
在软件开发中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)是实现高效、自动化软件交付的关键实践。微前端架构通过将应用拆分为多个自治的子应用,带来了开发和部署上的灵活…...
【STM32 FreeRTOS】事件标志组
事件标志组简介 事件标志组:用一个比特位来表示事件是否发生 事件标志组是一组事件标志位的集合,可以简单理解为事件标志组就是一个整数。 事件标志组的特点: 它的每一位表示一个事件(高八位不算)每一位事件的含义…...
【启动centos报错】另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘.
启动centos报错 另一个程序已锁定文件的一部分,进程无法访问打不开磁盘“D:\Program2\CentOS\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。模块“Disk”启动失败。未能启动虚拟机。解决方法 删除.lck文件...
基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测
目录 前言 1.扩大检测框区域 2.先检测手部,后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测,然后扩大检测框区域,并对该区域使用YOLOv8-s-pose使用关键…...
kylin系统永久关闭iptables
1 关闭iptables, 并且相关规则写入文件firewall.rules sudo iptables-save > /root/firewall.rules iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P …...
写一个githubDemo
1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…...
java入门-成员内部类和静态内部类的访问
(一)成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…...
ansible【自动化配置】(thirty day)
回顾 1、mysql和python (1)不需要执行mysql_ssl_rsa_setup (2)Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql (1)connpymysql.connect(host,user,password,database,prot) …...
GitOps Tekton+ArgoCD
GitOps 提供了一种基于 Git 的操作理念,而 Tekton 和 ArgoCD 分别作为 CI/CD 工具,共同实现了这一理念在 Kubernetes 集群中的应用 k8s只是jenkins 流水线中的一环,但是在tekton中,k8s是基础设施 工作流程: 代码提交…...
uniapp用户列表页面渲染、增删改查逻辑
<template><view class="container">...
力扣高频SQL 50题(基础版)第四十七题之1321.餐馆营业额变化增长
力扣高频SQL 50题(基础版)第四十七题 1321.餐馆营业额变化增长 题目说明 表: Customer ---------------------- | Column Name | Type | ---------------------- | customer_id | int | | name | varchar | | visited_on | date | | amount | …...
django中的MESSAGE组件
文章目录 message组件1 使用配置2 设置值3 读取值4 源码分析 message组件 1 使用配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,"…...
【JavaSE】解读Java中的toString方法
前言: 在Java中,toString方法来自java.lang.Object 类,然后所有对象都继承该Object 类。默认情况下,它的作用是返回对象的字符串表示形式。在实际开发中,重写 toString() 方法可以帮助我们以更易读的形式输出对象信息&…...
软件工程的核心原则:KISS, DRY, SOLID, YAGNI
软件工程的核心原则:KISS, DRY, SOLID, YAGNI — 深入解析与实践指南 引言 在软件开发的广阔领域中,原则和实践是构建高质量、可维护系统的基石。本文将深入探讨四个核心原则:KISS(保持简单,愚蠢)、DRY&a…...
Android 高通7.1系开机动画自动跟随系统方向旋转
本篇博客是记录自己解决开机动画与系统方向不一致方案代码,思路:在系统参数根目录自定义persist.sys.hwrotationxrd0来作为动画方向,当修改系统方向时同时修改这个参数,当系统启动加载动画时在根据这个来旋转动画方式以保证动画方…...
Sentinel入门与进阶:微服务流量控制的最佳实践 ( 三 )
5.配置持久化 目前的sentinel,无法满足我们生产环境的需求,因为一旦sentinel-dashboard发生重启,限流规则也会随之丢失。 sentinel规则的持久化: Sentinel自身就支持了多种不同的数据源来持久化规则配置,比如文件配置࿰…...
2021年上半年网络工程师考试上午真题
2021年上半年网络工程师考试上午真题 网络工程师历年真题含答案与解析 第 1 题 以下关于RISC和CISC计算机的叙述中,正确的是( )。 (A) RISC不采用流水线技术,CISC采用流水线技术(B) RISC使用复杂的指令,CISC使用简…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
