Apache Doris 中Compaction问题分析和典型案例

news/2024/9/20 7:28:07/ 标签: apache

说明

此文档主要说明一些常见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.ppmy.cn/news/1511859.html

相关文章

机器学习--常见算法总结

有监督学习算法 1. 线性回归算法 概念&#xff1a;线性回归是一种统计方法&#xff0c;用于预测一个变量&#xff08;因变量&#xff09;与一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。目标是通过线性方程建立自变量和因变量之间的关系模型。 作用&#x…

Linux执行脚本报错:-bash: ./mylife.sh: /bin/sh^M: bad interpreter: Text file busy

这个错误信息 -bash: ./mylife.sh: /bin/sh^M: bad interpreter: Text file busy 实际上包含了两个主要问题&#xff0c;但“Text file busy”这部分通常不是真实的错误&#xff0c;可能是显示错误或者与之前的操作冲突。更常见的问题是前面的 /bin/sh^M&#xff0c;这里的 ^M …

ZooKeeper Watcher 机制详解

ZooKeeper Watcher 机制详解 1、特点2、注册与触发3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; ZooKeeper 的 Watcher 机制是分布式系统中用于事件通知的重要功能。 1、特点 一次性触发&#xff1a; Watcher 被触发后立即从…

Python自动化测试工具selenium使用指南

概述 selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;相对于另外一款web自动化测试工具QTP来说有如下优点&#xff1a; 免费开源轻量级&#xff0c;不同语言只需要一个体积很小的依赖包支持多种系统&a…

《现代情报》

《现代情报》简介 《现代情报》&#xff08;原名《情报知识》&#xff09;杂志是由吉林省科学技术厅主管&#xff0c;吉林省科学技术信息研究所、中国科学技术情报学会联合主办的信息资源管理领域综合性学术期刊。该刊于1980年创刊&#xff0c;每年12期。重点报道服务于国家战略…

上传文件,文件类型限制语法,各种媒体视频文件的Content-Type

各种媒体视频文件的Content-Type “application/x-apple-diskimage”: “DMG”, “application/epubzip”: “EPUB”, “application/java-archive”: “JAR”, “video/x-matroska”: “MKV”, “text/html”: “HTML|HTM”, “text/css”: “CSS”, “text/javascript…

Ps:首选项 - 单位与标尺

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

USB3.2 摘录(四)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; 文章目录 系列文章目录8 协议层&#xff08;Protocol Layer&#xff09;8.8 三个参数地址信息&…

软考高级第四版备考---第四十一天(软件工程-软件设计)

一、结构化设计 结构化设计&#xff08;Structured Design,SD&#xff09;是一种面向数据流的方法&#xff0c;它以SRS和SA阶段所产生的DFD和数据字典等文档为基础&#xff0c;是一个自顶向下、逐步求精和模块化的过程 二、面向对象设计 2.1面相对象设计&#xff08;OOD&…

Electron 的contextBridge

contextBridge 是 Electron 框架中用于在渲染器进程(通常是 Web 页面)和主进程之间安全地暴露 API 的一种方式。它允许开发者在保持主进程和渲染器进程之间清晰分离的同时,从主进程向渲染器进程安全地传递方法和属性。这是通过创建一个单向的、只能从主进程到渲染器进程的桥…

谷粒商城实战笔记-问题记录-首页没有显示用户名-跨域session问题

文章目录 一&#xff0c;首页无用户信息二&#xff0c;定位三&#xff0c;两个问题1&#xff0c;跨域名session共享 一&#xff0c;首页无用户信息 谷粒商城首页&#xff0c;点击超链接您好&#xff0c;请登录&#xff0c;正常情况下应该跳转到Auth模块的login页面&#xff0c;…

[Day 55] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的智能合約安全審計 智能合約是一種自動執行合約條款的計算機程式&#xff0c;通常部署在區塊鏈上。這些合約能夠自動執行和驗證協議條件&#xff0c;無需中介機構&#xff0c;因此具有高效性和透明度。然而&#xff0c;由於智能合約一旦部署就無法修改&#xff0c;其安…

遥感之大豆提取

主要记录大豆提取常用的光学以及sar等特征&#xff0c;以便在实验中实现考虑以下特征得到初步结果&#xff0c;在其基础上进行不同维度的优化。 参考文献**<Mapping annual 10-m soybean cropland with spatiotemporal sample migration>** 文档总体描述&#xff1a; …

MATLAB-基于Transformer模型的NASA锂电池剩余寿命预测

matlab R2023b以上 一、数据集 首先从NASA数据集中提取电池容量特征&#xff0c;然后基于B0005号电池数据训练&#xff0c;用B0006号电池数据测试预测 二、模型预测效果 transformer训练集数据误差&#xff1a; 平均绝对误差mae为&#xff1a; 0.00815 均方误差mse为…

克服编程学习中的挫折感

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

基于 Elasticsearch 的数据分析与聚合

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;尤其适合大规模分布式数据处理。通过其内置的聚合功能&#xff0c;用户可以从数据中提取出有价值的洞察。本文将深入探讨如何利用 Elasticsearch 进行数据分析与聚合&#xff0c;重点介绍 Bucket 和 Metric 聚合、构建复杂…

设计模式---简单工厂模式

简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 是一种创建型设计模式&#xff0c;它定义了一个工厂类&#xff0c;通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方&#xff0c;简化客户端的代码&#xff0c;使得…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…

使用FFmpeg更改视频播放速度的方法

使用FFmpeg更改视频播放速度的方法 什么是FFmpeg&#xff1f; FFmpeg是一个开源的多媒体框架&#xff0c;可以用来录制、转换以及流式处理音视频。它支持几乎所有已知的音频和视频格式&#xff0c;因其强大且灵活的功能&#xff0c;被广泛应用于视频编辑和处理。 更改视频速…

支持redis和zookeeper的分布式锁组件lock4j

Lock4j是一个基于Spring AOP的分布式锁组件&#xff0c;它提供了多种底层实现&#xff08;如RedisTemplate、Redisson、Zookeeper&#xff09;以满足不同性能和环境的需求。 开源地址&#xff1a;GitHub - baomidou/lock4j: 基于Spring AOP 的声明式和编程式分布式锁&#xff…