第3.1章:StarRocks数据导入——Insert into 同步模式

 一、概述

   在StarRocks中,insert的语法和mysql等数据库的语法类似,并且每次insert into操作都是一次完整的导入事务。

 主要的 insertInto 命令包含以下两种:

  • insert into tbl select ...
  • insert into tbl (col1, col2, ...) values (1, 2, ...), (1,3, ...);

  其中第二种命令仅用于demo,不要使用在测试或生产环境中。在StarRocks中,例如使用JDBC或者insertInto导入时,插入1000条左右时很快有类似报错:close index channel failed,主要原因是导入太频繁了,需要降频率攒批导入。

二、高频insert 报错的原因

  StarRocks中的数据组织图如下:

     StarRocks中的分区分桶与tablet之间的关系为: table -- > partition --> tablet(物理描述,tablet数据分片是数据划分的最小逻辑单元)

      分区是逻辑上的概念,只记录在表的元数据中,每个分区的数据会按照分桶键进行hash分桶,表中的数据经过分区分桶后,就会形成一个个的tablet,且尽量均匀分布在集群的各个BE中。             tablet是StarRocks中数据均衡的最小单位,默认的三副本是指同一个 tablet会在集群中保留三份,每个tablet之间的数据没有交集,在物理上独立存储。集群的副本修复或磁盘均衡,均是以tablet为单位移动或者克隆的。且每次的数据导入、更新或者删除,本质上也是对一个个tablet中的数据进行操作。

   StarRocks中的分区分桶见:

  第2.4章 StarRocks表设计——分区分桶与副本数-CSDN博客文章浏览阅读504次,点赞21次,收藏9次。2.4 StarRocks表设计——分区分桶与副本数https://blog.csdn.net/SHWAITME/article/details/136140126?spm=1001.2014.3001.5501

   一个tablet中包含若干连续的rowset(rowset是逻辑概念),rowset代表tablet中一次数据变更的数据集合(数据变更包括了数据新增,更新或删除等),它是按版本信息进行记录的,每次变更就会生成一个新版本的rowset一个rowset底层可能会包含多个segment,执行数据导入时,每成功写入一个segment就会增加一个文件块对应。

    Segment的概念比较底层(这里不展开),可以借鉴Doris底层存储结构:

https://blog.csdn.net/SHWAITME/article/details/136155008?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136155008%22%2C%22source%22%3A%22SHWAITME%22%7D文章浏览阅读340次,点赞7次,收藏6次。Doris存储层设计介绍1——存储结构设计解析(索引底层结构)https://blog.csdn.net/SHWAITME/article/details/136155008?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136155008%22%2C%22source%22%3A%22SHWAITME%22%7D

   对上文提到的数据导入报错close index channel failed进一步解析。在StarRocks中,每次insert into本质都是一次完整的导入事务,即:insert into实际上会在tablet内部生成一个个连续版本号的rowset,对于新增的rowset,起始版本和终止版本是一样的,表示为[ 6-6]、[ 7-7]....[999-999]等。多个 rowset经过compaction会形成一个大的rowset。合并后的起始版本和终止版本是多个版本的并集,如[ 6-6]、[ 7-7]、[8-8]合并后变成 [6-8]。一旦表的某个tablet中同时存在rowset个数达到1000,就会到达阈值,即触发上述报错。

三、降低导入频率

   单个tablet中的rowset版本个数过多会什么影响?主要影响两个方面,一个是内存的占用,当rowset的版本过多时,be节点的table_meta部分(主要是其中的rowset元数据部分)占用的内存可能非常多。同时compaction合并消耗内存也会比较大,容易引起oom,影响集群稳定性;二是查询会变慢,因为查询的过程中是需要对tablet中的数据进行解压的,当rowset版本很多,解压会变慢,导致查询scan的耗时增加。综上考虑,StarRocks设置了单表中每个tablet最大阈值为1000的限制。

    针对insert into 数据频繁导入引发的rowset版本过多的问题,StarRocksc是利用compaction解决的。compaction可以认为是一个后台的常驻线程,不断的将tablet中的rowset版本进行合并,将小文件合并成有序的大文件。

    StarRocks中的compaction操作,分为base compaction(BC) 和cumulative compaction

(CC)。其中cumulative compaction(简称CC)负责将多个最新导入的增量数据进行合并,当增量数据合并后的大小达到一定阈值后,base compaction(简称BC)将基线版本(起始版本start version为0的数据)和与该增量数据版本合并。BC操作因为涉及到基线数据,而基线数据通常比较大,所以操作耗时会比CC长。

    BC和CC之间的分界线是cumulative point (cp),它是一个动态变化的版本号,比cp小的数据版本只能触发BC,而比CP大的数据版本,只会触发CC。如下图:

   上述分析得出,在StarRocks集群运行时,对表的数据变更操作会不断地产生新版本rowset,后台的常驻线程compaction负责将tablet中的rowset版本进行合并,进而保证集群的整体稳定高效。

    综上,快速insert into导致报错:close index channel failed的原因可以总结为:短时间内生成的rowset版本太快,如果compaction不及时,就会造成大量版本堆积,导致累计版本超过了超过了1000,进而触发阈值报错。故为了保障集群的稳定运行及查询效率,需要确保整体的compaction效率要大于rowset的生成速率。容易想到的解决思路一是:部分场景下通过调整compaction的几个参数来加速compaction,例如在be.conf中配置以下参数(配置后需重启BE):

#==每个磁盘 Cumulative Compaction 线程的数目(默认是1)
cumulative_compaction_num_threads_per_disk = 4#==每个磁盘 Base Compaction 线程的数目(默认是1)
base_compaction_num_threads_per_disk = 2#==Cumulative Compaction 线程轮询的间隔(单位是秒,默认值是1)
cumulative_compaction_check_interval_seconds = 2

    弊端是:compaction任务本身比较耗费cpu,内存和磁盘IO资源,compaction开启的过多会占用过多的机器资源,也会影响查询性能,还可能会造成OOM。上述报错还是需要从数据导入频率这个入手。

   理论上,每次导入操作,不论是只导入一条还是十万、百万条,对于StarRocks来说,都是只生成一个新的roswet版本。那么在compaction效率有限的情况下,完全可以通过“攒微批+降频率”来规避roswet版本过多的问题。实际上,若业务实时性要求不高,在机器内存充足的情况下,攒批越大、导入频率越低,对StarRocks集群的稳定性及查询性能的影响就越小。

   ps:在StarRocks中有更快的攒批导入方式,即Stream Load

从本地文件系统导入 | StarRocks

STREAM LOAD | StarRocks   

compaction合并机制见文章:

第3.2章:Doris数据导入——Compaction机制(1)-CSDN博客文章浏览阅读342次,点赞11次,收藏9次。第3.2章:Doris数据导入——Compaction机制(1)https://blog.csdn.net/SHWAITME/article/details/136172846

四、insert替代用法

    可以概括总结为以下几点:

  • 高频率小数据:insert into或者JDBC的executeUpdate()方法就完全不要用;
  • 低频率小数据:insert into导入几条测试数据可以用,但注意频率;
  • 低频率较大数据:insert into tbl values(data1),(data2)……或者类似JDBC executeBatch()方法,可以用,但不推荐,因为有更快的实现方式;
  • StarRocks系统内部进行ETL,推荐使用 insert into select 语法;
  • 便捷导入其他系统的数据,推荐使用外部表,例如:先构建mysql外部表去映射mysql系统中的数据,通过 insert into select 语法将外部表中的数据导入到 StarRocks表中。

五、insert使用与调优

5.1严格模式

   insert into是一种同步的导入方式,导入成功会直接显示导入结果。如果导入失败,insert也会返回错误信息,例如我们导入错误时间格式的数据(数据漏加引号):

 (1)针对tracking_url,使用web或者curl命令访问tracking_url,可以查看更详细的错误信息:显示报错原因是:格式不对,强转为null引起的问题,接着可以去排查数据格式。

(2)严格模式enable_insert_strict:当该参数为false时(关闭严格模式),表示一次insert任务只要有一条或以上数据被正确导入,就返回成功。当该参数设置为true时,表示但凡有一条数据错误,则任务整体失败,该参数默认为true。例如:set global enable_insert_strict = false;

   ps:当关闭严格模式后,insert即使有错误数据,但只要有一条数据是正常可用的,就会忽视脏数据,保证可用数据的正常导入。此外,enable_insert_strict参数是session参数(当前会话生效),断开当前session后,该参数就会失效,若需要全局修改,可以加上global。

5.2并行度

    insert导入语句本质上还是sql,可以通过设置合适的并行度来进行加速。例如可以设置全局并行度为单个BE节点的cpu核数的一半。假设部署的BE服务器core数是16C,那set global parallel_fragment_exec_instance_num = 8。注意:有些场景下,例如:insert into select语句进行StarRocks系统内部的ETL或者通过外部表来拉取数据,当速度过快。一方面可能导致源库压力过大影响源库中的业务,另一方面会导致StarRocks BE的load内存和ColumnPool内存占用较高,影响集群稳定性。所以需要结合实际情况,来设置合适的并行度控制导入速率

5.3超时时间

   与insert相关的超时参数有两个:

  • query_timeout

     可以通过show variables like '%query_timeout%' 语句查看, 该参数是session变量,通过增加global关键词设置全局生效。可以通过set query_timeout = xxx 来增加超时时间,单位是秒(默认为300秒)

  • insert_load_default_timeout_second

      该参数是fe.conf中的参数,表示导入任务的超时时间(以秒为单位,默认是3600秒,即1小时)。如果导入任务在设定的超时时间内未完成则会被系统取消,变成cancelled。

参考文章:

Insert Into - Apache Doris

通过 INSERT 语句导入数据 | StarRocks

第3.1章:StarRocks数据导入--Insert into_starrocks insert into-CSDN博客

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

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

相关文章

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提:JDK已经安装配置完毕,有了这些环境就敲代码 代码…

Vue路由组件练习

Vue 路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令:npm i vue-router 应用插件:Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下,创建router文件夹,并在该文件夹创建index.js文件 2.3. 导入依赖…

普中51单片机学习(定时器和计数器)

定时器和计数器 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。51单片机中的定时器/计数器是…

<网络安全>《43 网络攻防专业课<第九课 - 跨站脚本攻击及防范>》

1 什么是XSS XSS(cross site script)或者说跨站脚本是一种Web应用程序的漏洞,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 2 XSS脚本实例 …

城市智能交通指挥中心系统方案

二、方案设计 1.简介 公路治安卡口子系统实现对交通流信息的及时采集和各类嫌疑车辆的查控与处置,扼制并打击一些显见性违规违法行为。其主要功能包括:车辆图像记录、速度测定、车辆号牌识别、自动报警、数据检索、流量统计、图像存贮、数据传输和远程…

在前后端分离项目中如何设置统一返回格式

目录 一、步骤一 二、步骤二 在前后端分离的项目中,为了方便前后端交互,后端往往需要给前端返回固定的数据格式,但不同的实体类返回格式不同,所以在真实开发中,我们将所有API接口设置返回统一的格式。基本上包括的有…

【vue3】手动实现md在线编辑

1.背景 由于知识库的一些.md格式的文件的文件内容可能会有变动,如果频繁下载修改后,再进行上传,会让用户操作不方便,为此接入md在线编辑功能 2 md在线编辑具体实现 2.1 搭建项目 搭建项目下载和引入bytemd和fflate相关依赖&…

【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 深度优先搜索 树 图论 状态压缩 LeetCode:2791. 树中可以形成回文的路径数 给你一棵 树(即,一个连通、无向且无环的图),根 节点为 0 &am…

lv15 I2C背景知识(裸机I2C、linux对I2C支持、MPU6050)4

一、I2C总线背景知识 SOC芯片平台的外设分为: 一级外设:外设控制器集成在SOC芯片内部 二级外设:外设控制器由另一块芯片负责,通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit: 字面意思是用于“集成电路之…

css实现悬浮卡片

结果展示 html代码 <!doctype html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content"…

Android Studio创建项目时gradle下载慢

先停止当前Sync&#xff0c;找到gradle-wrapper.properties文件&#xff0c;将distributionUrl修改为腾讯镜像源&#xff1a; distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-6.5-bin.zip

Vue 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button&…

【Spring】IoC容器 控制反转 与 DI依赖注入 XML实现版本 第二期

文章目录 基于 XML 配置方式组件管理前置 准备项目一、 组件&#xff08;Bean&#xff09;信息声明配置&#xff08;IoC&#xff09;&#xff1a;1.1 基于无参构造1.2 基于静态 工厂方法实例化1.3 基于非静态 工厂方法实例化 二、 组件&#xff08;Bean&#xff09;依赖注入配置…

C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示 1.bfs状态表示 无论是深度优先搜索还是广度优先搜索&#xff0c;搜索的过程均会建立一棵 搜索树&#xff0c;搜索树上的每一个结点都是一个 状态&#xff0c;而搜索的过程又可以看作是 状态的转移。 对于 BFS&#xff0c;搜索过程中产生…

计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

P6354 [COCI2007-2008#3] TAJNA

题目传送门 题目描述 使用一种加密算法。 设字符串的长度为 n&#xff0c;则构造一个矩阵&#xff0c;使得 rcn 且在 r≤c 的情况下使得 r 尽量大。 然后把给定的明文按照由上到下&#xff0c;从左到右的顺序填充这个 rc 的矩阵。 得到的密文就是把矩阵按照从左到右&#…

内存计算研究进展- 针对图计算的近数据计算架构

针对图计算的近数据计算架构的代表性工作有&#xff1a; Seoul National University的 Tesseract和 Georgia Institute of Technology 的 GraphPIM&#xff0c;具体如下。 1 Tesseract Tesseract是一个针对图计算的可编程的内存计算系统架构&#xff0c;它综合了图计算的特点&…

VMware的三种连接模式

桥接模式 就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下&#xff0c;类似于把物理主机虚拟为一个交换机&#xff0c;所有桥接设置的虚拟机连接到这个交换机的一个接口上&#xff0c;物理主机也同样插在这个交换机当中&#xff0c;所以所有桥接下的网…

weblog项目开发记录--SpringBoot后端工程骨架

知识点查漏补缺 跟着犬小哈做项目实战时发现好多知识点都忘了&#xff0c;还有一些小的知识点可能之前没学过&#xff0c;记录下&#xff01;顺带整理下开发流程。 完整项目学习见犬小哈实战专栏 SpringBoot后端工程骨架 搭建好的工程骨架中实现了很多基础功能&#xff0c;…

如何在同一个module里面集成多个数据库的多张表数据

确保本公司数据安全&#xff0c;通常对数据的管理采取很多措施进行隔离访问。 但是&#xff0c;Mendix应怎样访问散布于异地的多个数据库呢&#xff1f; 前几期我们介绍过出海跨境的大企业对于Mendix的技术、人才的诉求后&#xff0c;陆陆续续有其他客户希望更聚焦具体的实际场…