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,需要联系社区的同学定位处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务实战系列之玩转Docker(十一)

前言 在云原生的世界&#xff0c;经过十多年的进化&#xff0c;Docker已经形成了较完备的“后勤”保障服务和建立了荣辱与共的“密友圈”。用一句话可以概括&#xff1a;“Docker走遍天下&#xff0c;Swarm功不可没”。 因此&#xff0c;我们需尽可能做到对Swarm有充分的认识…

大数据-85 Spark 集群 RDD创建 RDD-Action Key-Value RDD详解 RDD的文件输入输出

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09; HDFS&#xff08;已更完&#xff09; MapReduce&#xff08;已更完&…

【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏

项目场景&#xff1a; 作为一个嵌入式软件开发者&#xff0c;有两个外接屏幕&#xff0c;不足为奇。 但是在今天的使用电脑过程中&#xff0c;出现了接了一个拓展坞上面有HDMI接口&#xff0c;但是HDMI接口接上外接显示屏的时候电脑无法识别到&#xff0c;导致只有电脑直连的HD…

家用小型洗衣机哪款好用?精选内衣洗衣机多维度测评盘点

对于很多都市生活的小伙伴来说&#xff0c;有一台小巧玲珑、功能齐全的内衣洗衣机则成了我们的救星。它不仅方便快捷&#xff0c;还能保持衣物清洁和卫生。然而&#xff0c;市面上的内衣洗衣机品牌五花八门。哪一个最好用、质量又靠谱呢&#xff1f;为了给大家提供更准确的选购…

【FPGA数字信号处理】- 数字信号处理如何入门?

​数字信号处理&#xff08;Digital Signal Processing&#xff0c;简称DSP&#xff09;是一种利用计算机或专用数字硬件对信号进行处理的技术&#xff0c;在通信、音频、视频、雷达等领域发挥着越来越重要的作用&#xff0c;也是FPGA主要应用领域之一。 本文将详细介绍数字信…

YOLOv5改进 | 融合改进 | C3融合ContextGuided增强分割效果

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

模糊控制——创建与添加自定义的隶属函数

关键字&#xff1a;模糊控制&#xff1b;隶属函数&#xff1b;Matlab。 系列文章目录 模糊控制——&#xff08;一&#xff09;理论基础 模糊控制——&#xff08;二&#xff09;设计流程 模糊控制——&#xff08;三&#xff09;模糊洗衣机 模糊控制——&#xff08;四&#…

SQL— DDL语句学习【后端 9】

SQL— DDL语句学习 在数据管理的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff09;作为操作关系型数据库的编程语言&#xff0c;扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准&#xff0c;还为我们提供了强大的工具来管理、查…

jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

各位小伙伴们大家好呀&#xff0c;我是小金&#xff0c;本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目&#xff0c;之前没怎么搞过部署相关的&#xff0c;以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题&#xff0c;特写此篇&#xff0…

【Redis】数据类型详解及其应用场景

目录 Redis 常⻅数据类型预备知识基本全局命令小结 数据结构和内部编码单线程架构引出单线程模型为什么单线程还能这么快 Redis 常⻅数据类型 Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维⾮常重要&#xff0c;同时掌握每种数据结构的常⻅…

Postman接口测试项目实战

第 1 章 什么是接口测试 1.1、为什么要进行接口测试 目前除了特别Low的公司外&#xff0c;开发都是前后端分离的&#xff0c;就是说前端有前端的工程师进行编码&#xff0c;后端有后端的工程师进行编码&#xff0c;前后端进行数据基本都是通过接口进行交互的。 1.2、接口测…

zookeeper源码分析之事务请求处理

一.参考 zookeeper启动和选举的源码分析参考之前的帖子. 二.源码 1.职责链模式. 每次经过的processor都是异步处理&#xff0c;加入当前processor的队列&#xff0c;然后新的线程从队列里面取出数据处理. PrepRequestProcessor 检查ACL权限,创建ChangeRecord. SyncRequest…

ArcGIS空间自相关Moran‘s I——探究人口空间格局的20年变迁

先了解什么是莫兰指数&#xff1f; 莫兰指数&#xff08;Morans I&#xff09;是一种用于衡量空间自相关性的统计量&#xff0c;即它可以帮助我们了解一个地理区域内的观测值是否彼此相关以及这种相关性的强度和方向。 莫兰指数分类&#xff1a; 全局莫兰指数 (Global Moran…

聊聊如何利用ingress-nginx实现应用层容灾

前言 容灾是一种主动的风险管理策略&#xff0c;旨在通过构建和维护异地的冗余系统&#xff0c;确保在面临灾难性事件时&#xff0c;关键业务能够持续运作&#xff0c;数据能够得到保护&#xff0c;从而最大限度地减少对组织运营的影响和潜在经济损失。因此容灾的重要性不言而…

zabbix实战-磁盘空间告警

1.创建监控项 选择&#xff1a;键值&#xff1a;vfs.fs.size[fs,<mode>] 。 直接写 vfs.fs.size[fs,<mode>]是不出数据的。我们要写具体的值 &#xff1a;vfs.fs.size[/,free] &#xff0c;这个表示查看根的剩余空间。 2.创建图形 为磁盘剩余空间监控项创建图形&am…

redis 遍渐进式历

1.scan cursor [match pattern] [coutn] [type]:以渐进式的方式进行建的遍历 cursor:是光标 指向当前遍历的位置 设置成0表示当前从0开始获取 math parttern &#xff1a;和keys命令一样的 keys * count: 限制一次遍历能够获取到多少个 元素默认是10 type :这次遍历只想获取…

[Python学习日记-10] Python中的流程控制(if...else...)

[Python学习日记-10] Python中的流程控制&#xff08;if...else...&#xff09; 简介 缩进 单分支 双分支 多分支 练习 简介 假如把写程序比做走路&#xff0c;那我们到现在为止&#xff0c;一直走的都是直路&#xff0c;还没遇到过分叉口&#xff0c;想象现实中&#x…

【python】Python实现XGBoost算法的详细理论讲解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Ps:首选项 - 单位与标尺

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“单位与标尺” Units & Rulers选项卡允许用户根据工作需求定制 Photoshop 的测量单位和标尺显示方式。这对于保持工作的一致性和精确性&#xff0c;尤其是在跨设备或跨平台…