Starrocks 写入报错 primary key memory usage exceeds the limit

devtools/2025/3/6 3:16:52/

背景

本文基于 StarRocks 3.3.5
单个Starrocks BE配置是 16CU 32GB
在Flink Yaml CDC 任务往 Starrocks写数据的过程中,突然遇到了primary key memory usage exceeds the limit 问题,具体如下:

java.lang.RuntimeException: com.starrocks.data.load.stream.exception.StreamLoadFailException: Transaction prepare failed, db: xxx, table: xxxx, label: flink-960f94fc-6fb1-43e4-aaa1-4c3938241ffa, 
responseBody: {"Status": "MEM_LIMIT_EXCEEDED","Message": "primary key memory usage exceeds the limit. tablet_id: 479203, consumption: 15928614825, limit: 15790082457. Memory stats of top five tablets: 4258582(314M)4258578(272M)4258340(230M)2957546(190M)2957590(190M):  be:xxx.xxx.xxx.xxx"
}
errorLog: nullat com.starrocks.data.load.stream.v2.StreamLoadManagerV2.AssertNotException(StreamLoadManagerV2.java:427)at com.starrocks.data.load.stream.v2.StreamLoadManagerV2.write(StreamLoadManagerV2.java:252)at com.starrocks.connector.flink.table.sink.v2.StarRocksWriter.write(StarRocksWriter.java:143)at org.apache.flink.streaming.runtime.operators.sink.SinkWriterOperator.processElement(SinkWriterOperator.java:182)at org.apache.flink.cdc.runtime.operators.sink.DataSinkWriterOperator.processElement(DataSinkWriterOperator.java:178)at org.apache.flink.streaming.runtime.tasks.CopyingChainingOutput.pushToOperator(CopyingChainingOutput.java:75)at org.apache.flink.streaming.runtime.tasks.CopyingChainingOutput.collect(CopyingChainingOutput.java:50)at org.apache.flink.streaming.runtime.tasks.CopyingChainingOutput.collect(CopyingChainingOutput.java:29)at org.apache.flink.streaming.api.operators.StreamMap.processElement(StreamMap.java:38)at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask$StreamTaskNetworkOutput.emitRecord(OneInputStreamTask.java:245)at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.processElement(AbstractStreamTaskNetworkInput.java:217)at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:169)at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:68)at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:616)at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:231)at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:1071)at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:1020)at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:959)at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:938)at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:751)at org.apache.flink.runtime.taskmanager.Task.run(Task.java:567)at java.lang.Thread.run(Thread.java:879)
Caused by: com.starrocks.data.load.stream.exception.StreamLoadFailException: Transaction prepare failed, db: xxx, table: xxx, label: flink-960f94fc-6fb1-43e4-aaa1-4c3938241ffa, 
responseBody: {"Status": "MEM_LIMIT_EXCEEDED","Message": "primary key memory usage exceeds the limit. tablet_id: 479203, consumption: 15928614825, limit: 15790082457. Memory stats of top five tablets: 4258582(314M)4258578(272M)4258340(230M)2957546(190M)2957590(190M):  be:xxx.xxx.xxx.xxx"
}
errorLog: nullat com.starrocks.data.load.stream.TransactionStreamLoader.prepare(TransactionStreamLoader.java:221)at com.starrocks.data.load.stream.v2.TransactionTableRegion.commit(TransactionTableRegion.java:247)at com.starrocks.data.load.stream.v2.StreamLoadManagerV2.lambda$init$0(StreamLoadManagerV2.java:210)... 1 more

除此之外,我们的业务场景就是会 更新 以往 的历史数据,且这样类似的任务有很多。我们的表结构是主键表。

分析

上述报错,其实是BE报出来的,每次进行数据更新的时候,SR都会加载对应的tablet对应的主键索引,导致我们这边的BE占用的内存比较大,如下所示:
在这里插入图片描述

。经过分析我发现我们这边的分区是以月维度划分的,而且bucket的个数为2,这样每次写入数据的时候,就会把一个月的的数据的索引加载到内存中,这样就会导致BE的内存占用越来越大,

PARTITION BY date_trunc("month",created_time)
DISTRIBUTED BY HASH(xxx) BUCKETS 2

所以我们进行了bucket调整,

ALTER TABLE xxxx DISTRIBUTED BY HASH(xx) BUCKETS 50;

调整之后,对比了一下BE所占用的内存,如下:
在这里插入图片描述

内存占用节约了5GB。

其他

可以通过如下命令查看 索引所占用的内存

curl -XGET -s http://BE:8040/metrics | grep  "update_mem_bytes"curl -XGET -s http://BE:8040/metrics |grep 'update_primary_index_bytes_total'

具体的指标参考:StarRocks metrics


http://www.ppmy.cn/devtools/164890.html

相关文章

Highcharts 配置语法详解

Highcharts 配置语法详解 引言 Highcharts 是一个功能强大的图表库,广泛应用于数据可视化领域。本文将详细介绍 Highcharts 的配置语法,帮助您快速上手并制作出精美、实用的图表。 高级配置结构 Highcharts 的配置对象通常包含以下几部分&#xff1a…

GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)

目录 文章目录 目录1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现:OpenGL 3D 渲染管线设计1. 顶点处理&#xff…

加油站小程序实战教程06地图多站点显示

目录 引言功能设计与开发步骤第一步:初始化项目与地图第二步:动态切换城市地图第三步:标记加油站位置第四步:获取用户位置并计算最近加油站第五步:城市名称解析完整代码总结 引言 在上一篇《加油站小程序实战05&#…

【Elasticsearch】数据管理(Data Management)

Elasticsearch 的数据管理(Data Management)是其核心功能之一,旨在帮助用户高效地存储、维护和查询不同类型的数据,同时优化性能和成本。以下是结合原文内容对 Elasticsearch 数据管理的详细阐述: 1.数据类型 Elasti…

maven高级-03.继承与聚合-版本锁定

一.版本锁定 在maven中&#xff0c;父工程的pom文件中通过<dependencyManagement>来统一管理依赖的版本。 注意&#xff1a; <dependencyManagement>仅仅管理依赖的版本号&#xff0c;并不进行依赖的注入。如果要进行依赖注入还是要使用<dependencies>注解。…

十一、Spring Boot:使用JWT实现用户认证深度解析

Spring Boot JWT&#xff08;JSON Web Token&#xff09;&#xff1a;无状态认证 在现代 Web 开发中&#xff0c;无状态认证是一种重要的安全机制&#xff0c;它允许服务器在不存储会话信息的情况下验证用户身份。JSON Web Token&#xff08;JWT&#xff09;是一种常用的无状态…

React进阶之前端业务Hooks库(六)

前端业务Hooks库 请求useRequest题外:主流大厂编码规范的要求:目录详解useRequest.tsuseRequestImplement.tsFetch.ts插件的实现src/useRetryPlugin.tssrc/useAutoRunPlugin.ts请求失败的日志上报请求 useRequest 为什么不使用axios而使用useRequest 因为 axios 在 vue 项目中…

Stable Diffusion模型采样方法与参数配置详解(含步数及画风适配表)

Stable Diffusion模型采样方法与参数配置详解&#xff08;含步数及画风适配表&#xff09; 以下为当前主流采样方法的性能对比及参数配置建议&#xff0c;结合显存占用、生成速度、适用场景等维度分类总结&#xff1a; 一、采样方法对比表 采样方法推荐步数显存占用生成速度…