StarRocks——Stream Load 事务接口实现原理

目录

前言

一、StarRocks 数据导入

二、StarRocks 事务写入原理

三、InLong 实时写入StarRocks原理

3.1 InLong概述

3.2 基本原理

3.3 详细流程

3.3.1 任务写入数据

3.3.2 任务保存检查点

3.3.3 任务如何确认保存点成功

3.3.4 任务如何初始化

3.4 Exactly Once 保证

3.4.1 数据不重复保证

3.4.2 数据不丢失保证

四、Stream Load事务接口使用

4.1 事务接口优势

4.1.1 Exactly-once语义

4.1.2 提升导入性能

4.2 事务接口使用限制

4.3 事务接口使用案例

前言

   StarRocks 支持通过 Stream Load 方式实时写入数据,为进一步提升导入效率,从 2.4 版本实现了新的事务接口,本文阐述Stream Load 事务接口实现原理

 官网文章地址:

使用 Stream Load 事务接口导入 | StarRocks

一、StarRocks 数据导入

     StarRocks丰富的导入方式为业务在报表推送、实时数据分析、数据湖分析等场景提供了助力。目前支持的四种数据导入方式,分别是 Stream Load, Broker Load, Routine Load,Spark Load。此外,为了支持和Flink、Kafka等其他系统之间实现跨系统的两阶段提交(预提交事务、提交事务)提升高并发Stream Load导入场景下的性能,StarRocks 自 2.4 版本起提供 Stream Load 事务接口。

二、StarRocks 事务写入原理

    StarRocks事务写入基于典型的两阶段提交事务实现,客户端使用事务主要包含以下几个接口:

  • /api/transaction/begin:开启一个新事务。

  • /api/transaction/prepare:预提交当前事务,临时持久化变更。预提交一个事务后,可以继续提交或者回滚该事务。在这种机制下,如果在事务预提交成功后StarRocks发生了宕机,仍然可以在系统恢复后继续执行提交。
  • /api/transaction/commit:提交当前事务,持久化变更。
  • /api/transaction/rollback:回滚当前事务,回滚变更。
  • /api/transaction/load:发送数据,可以使用已有的事务,如果没有指定事务label,会随机生成一个label进行数据写入。

     ps:事务去重:复用StarRocks现有的label标签机制,通过标签绑定事务,实现事务的“至多一次(At-Most-Once)”语义。

  不同阶段对应的StarRocks内部流程如下:

  • begin + load 阶段

   开始数据导入时,客户端通过begin transaction接口开启一个新的事务,提交给FE leader中的事务管理模块,事务管理模块充当了两阶段提交中的事务管理者,用来管理事务的原子性、事务的回滚等。每一个事务可以设置一个label,StarRocks FE会检查本次begin transaction 请求的label是否已经存在,如果label在系统中不存在,则会为当前label开启一个新的事务。begin阶段之后可以使用该label对StarRocks进行Stream Load导入,Stream Load返回成功的条件是数据的副本数量超过了tablet数据分片的副本数的一半,剩下的一本由StarRocks的副本机制保证完整写入。

  • Commit 阶段

   FE接受commit信息之后,会将事务状态改成commited。之后事务管理器会向BE节点发送publish version信息,BE收到publish中的版本信息后,会将本地的消息版本改成本次事务对应的版本;同时会向FE上报,表示数据版本已经成功修改,之后FE会将事务状态改成VISIBLE。此时数据对用户可见,客户端执行查询的时候,会比较版本号,从而解决读写版本冲突;

  • Rollback 阶段

   如果写入过程或者commit过程失败,则事务abort,清理事务的任务在BE节点异步执行,将数据导入过程中生成的批次数据标记为不可用,这些数据之后会从BE上被删除。

   总结:

  • StarRocks可以通过给数据设置版本控制(rowset version)来解决读写冲突。
  • StarRocks通过引入FE中的事务管理实现了两阶段导入,保证了导入的原子性。

三、InLong 实时写入StarRocks原理

3.1 InLong概述

    Apache InLong(应龙) 提供自动、安全、可靠和高性能的数据传输能力,方便业务快速构建基于流式的数据分析、建模和应用。该模块阐述 InLong基于事务接口,实现数据实时写入 StarRocks的技术原理,主要对写入过程中的精准一次性保证进行阐述。

3.2 基本原理

   InLong实时写入StarRocks如下图所示,实时写入通过 Flink实时任务来实现,Flink任务写入侧的具体执行逻辑如下:

  • 根据Flink并行度配置生成多个Task执行写入;
  • 每一个Task基于StarRocks提供的Stream Load机制进行写入,每一个Flink checkpoint周期会使用相同的StarRocks事务label;
  • Flink开始做checkpoint时,当前写入的table以及对应的StarRocks事务label会一并存入到state状态中;
  • Flink写入算子收到checkpoint完成的消息时,将所有的table对应的事务进行commit,此时数据才会对用户可见;

3.3 详细流程

3.3.1 任务写入数据

  在写入数据时,首先不会直接将数据写入到StarRocks中,而是将每个table对应的数据进行缓存。当批次数据达到一定大小之后才会调用一次刷新flush操作,flush操作包括以下流程:

  • 启动一个事务,每一个Flink checkpoint周期会使用相同的StarRocks事务label,调用/api/transaction/begin
  • 使用该label进行数据写入,调用 /api/transaction/load 实际写入数据

  这种写入流程保证了:

  • 每次写入相同的事务label,提交时可以提交一整个checkpoint周期的所有的数据,单个checkpointh只会提交一次,重复提交StarRocks不会生效。
  • 每次写入都是批次写入,缓解StarRocks写入压力。(内存攒批+flush)

3.3.2 任务保存检查点

   任务保存检查点的时候会进行以下流程:

  • 对目前内存中保存的所有表数据都进行flush,确保内存中所有的数据已经导入到StarRocks,当前数据在StarRocks中不可见
  • 对所有的表对应的导入事务,进行prepare调用(预提交事务) ,如果prepare失败,则表示当前StarRocks不支持该事务的提交,调用abort接口,并失败重试
  • 对于prepare成功的事务,保存在当前flink状态信息中state

3.3.3 任务如何确认保存点成功

  当Flink Task收到checkpoint检查点已经完成的确认信息后,对checkpoint过程中保存的事务信息进行commit,如果commit失败,则重启任务。commit成功的事务会在checkpoint中删除。

3.3.4 任务如何初始化

    当任务启动时,Task拿到上一个保存点的状态信息,恢复版本暂时未commit的事务信息,对checkpoint id小于等于当前checkpoint id的事务进行提交。

3.4 Exactly Once 保证

  要保证流式写入的 Exactly once语义等同于:需要保证数据的不重复以及不丢失。

  Exactly once语义的实现需要合理的定义checkpoint间隔,优点是在各种异常情况下保障数据不丢失不重复,缺点是数据可见时间取决于checkpoint间隔(flink将所有的table对应的事务进行commit,此时数据才会对用户可见)

3.4.1 数据不重复保证

   基于Flink的流式任务产生数据重复的原因主要是Flink从某一个checkpoint启动时,重复提交之前已经提交过的数据。InLong实时写入中,状态中会记录本checkpoint下prepare成功的事务id,故障恢复时,会提交该事务id,如果该事务id在之前的流程中被提交过,StarRocks会返回报错信息表示该事务id已经提交过,该次提交会被忽略,通过这种机制保证了数据的不重复。

3.4.2 数据不丢失保证

  假设在数据写入过程中,有部分数据写入失败,Flink checkpoint机制会保证任务重启后从上一个保存点启动,Source端会从上次保存消费位置开始消费,这样能够保证数据的不丢失,之前写入失败的数据会在重启后继续执行写入。

四、Stream Load事务接口使用

4.1 事务接口优势

4.1.1 Exactly-once语义

  • 通过“预提交事务”,“提交事务”,方便实现跨系统的两阶段提交。例如配合在Flink实现“精确一次(Exactly-once)”语义。

4.1.2 提升导入性能

  在通过程序提交Stream Load作业的场景中,Stream Load事务接口允许在一个导入作业中按需合并发送多次小批量的数据后“提交事务”,从而能减少数据导入的版本,提升导入性能。

4.2 事务接口使用限制

   事务接口当前具有如下使用限制:

  • 只支持单库单表事务,未来将会支持跨库多表事务。

  • 只支持单客户端并发数据写入,未来将会支持多客户端并发数据写入。

  • 支持在单个事务中多次调用数据写入接口 /api/transaction/load 来写入数据,但是要求所有 /api/transaction/load 接口中的参数设置必须保持一致。

  • 导入CSV格式的数据时,需要确保每行数据结尾都有行分隔符。

4.3 事务接口使用案例

  具体使用案例见官网:

使用 Stream Load 事务接口导入 | StarRocks

参考文章:

Apache InLong 实时同步数据到 StarRocks 原理与实践

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

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

相关文章

Leetcode - 周赛386

目录 一,3046. 分割数组 二,3047. 求交集区域内的最大正方形面积 三,3048. 标记所有下标的最早秒数 I 四,3049. 标记所有下标的最早秒数 II 一,3046. 分割数组 将题目给的数组nums分成两个数组,且这两个…

探索RedisJSON:将JSON数据力量带入Redis世界

探索RedisJSON:将JSON数据力量带入Redis世界 当我们谈论数据存储和查询时,Redis和JSON都是无法忽视的重要角色。Redis以其高效的键值存储、快速的读/写速度、以及丰富的数据结构赢得了开发者的喜爱。而JSON,作为一种轻量级的数据交换格式&am…

「Vue3系列」Vue3 条件语句/循环语句

文章目录 一、Vue3 条件语句1. v-if2. v-else-if 和 v-else3. v-show4. 使用计算属性进行条件渲染5. v-if与v-show比较v-ifv-show性能考虑使用场景 二、Vue3 循环语句1. 遍历数组2. 遍历对象3. 使用索引4. 注意事项 三、相关链接 一、Vue3 条件语句 在 Vue 3 中,你…

盲人出行:科技创造美好的未来

在繁忙的都市中,我每天都要面对许多挑战,盲人出行安全保障一直难以得到落实。我看不见这个世界,只能依靠触觉和听觉来感知周围的一切。然而,我从未放弃过对生活的热爱和对未来的憧憬。在一次机缘巧合下,我认识了一款名…

C3_W2_Collaborative_RecSys_Assignment_吴恩达_中英_Pytorch

Practice lab: Collaborative Filtering Recommender Systems(实践实验室:协同过滤推荐系统) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次实验中,你将实现协同过滤来构建一个电影推荐系统。 …

VLAN实验报告

实验要求: 实验参考图: 实验过程: r1: [r1]int g 0/0/0.1 [r1-GigabitEthernet0/0/0.1]ip address 192.168.1.1 24 [r1-GigabitEthernet0/0/0.1]dot1q termination vid 2 [r1-GigabitEthernet0/0/0.1]arp broadcast enable [r1]int g 0/0/…

Mysql学习之MVCC解决读写问题

多版本并发控制 什么是MVCC MVCC (Multiversion Concurrency Control)多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之&#xff0…

django的模板渲染中的【高级定制】:按数据下标id来提取数据

需求: 1:在一个页面中显示一张数据表的数据 2:不能使用遍历的方式 3:页面中的数据允许通过admin后台来进行修改 4:把一张数据表的某些内容渲染到[xxx.html]页面 5:如公司的新商品页面,已有固定的…

《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏

梦幻西游这款游戏,很多人玩,喜欢研究的赶快下载吧。精心收集的34个版本。不容易啊。里面有详细的视频架设教程,可以外网呢。 《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏 下载地址&#xff1…

FDM打印机学习

以下内容摘自网络,仅供学习讨论,侵删。 持续更新。。。 FDM打印机是通过喷头融化丝状耗材(PLA,ABS等材料),然后逐层涂在热床上,一层一层逐级抬高。 结构分类 Prusa i3型是一种龙门结构&#…

JavaWeb 下拉菜单怎么实现选择不同的颜色?

在JavaWeb中实现下拉菜单选择不同颜色的功能是一种常见的需求&#xff0c;可以通过HTML、CSS和JavaScript结合Java后端来实现。 第一步&#xff1a;编写HTML页面 首先&#xff0c;我们需要创建一个HTML页面&#xff0c;其中包含一个下拉菜单和一个用于显示颜色的区域。 <…

python 爬取文本内容并写入json文件

背景: 项目需要从html 提取说明书目录 实现: 由于html是包含所有内容,所以将其中目录部分手动重新生成一个html 文件dir26.html python import requests from bs4 import BeautifulSoup import jsonfilename "dir26.html" # 替换为实际的文件路径 with open(fil…

ES 备份索引

1、先创建索引 PUT file_info_sps_demo1 {"settings": {"index": {"number_of_shards": "1","blocks": {"read_only_allow_delete": "true"},"max_result_window": "500000",&quo…

阶跃信号与冲击信号

奇异信号&#xff1a;信号与系统分析中&#xff0c;经常遇到函数本身有不连续点&#xff08;跳变电&#xff09;或其导函数与积分有不连续点的情况&#xff0c;这类函数称为奇异函数或奇异信号&#xff0c;也称之为突变信号。以下为一些常见奇异函数。 奇异信号 单位斜变信号 …

C#双向链表实现:Append()方法追加并显示数据

目录 一、涉及到的知识点 1.定义 2.双向链表与单向链表的区别 二、实例 一、涉及到的知识点 1.定义 在双向链表中&#xff0c;每个节点有两个指针域&#xff0c;一个指向它的前一个节点&#xff08;即直接前驱&#xff09;&#xff0c;另一个指向它的后一个节点&#xff0…

Ubuntu18.04安装RTX2060显卡驱动+CUDA+cuDNN

Ubuntu18.04安装RTX2060显卡驱动CUDAcuDNN 1 安装RTX2060显卡驱动1.1 查看当前显卡是否被识别1.2 安装驱动依赖1.3 安装桌面显示管理器1.4 下载显卡驱动1.5 禁用nouveau1.6 安装驱动1.7 查看驱动安装情况 2 安装CUDA2.1 查看当前显卡支持的CUDA版本2.2 下载CUDA Toolkit2.3 安装…

车灯修复UV胶的优缺点有哪些?

车灯修复UV胶的优点如下&#xff1a; 优点&#xff1a; 快速固化&#xff1a;通过紫外光照射&#xff0c;UV胶可以在5-15秒内迅速固化&#xff0c;提高了修复效率。高度透明&#xff1a;固化后透光率高&#xff0c;几乎与原始车灯材料无法区分&#xff0c;修复后车灯外观更加…

对缓冲区的初步认识——制作进度条小程序

对缓冲区的初步认识--进度条小程序 前言预备知识回车和换行的区别输出缓冲区/n 有清空输出缓冲区的作用stdout是什么&#xff1f;验证一切皆文件为什么是\n行刷新&#xff1f; 倒计时程序原理 代码实现为什么这里要强制刷新&#xff1f;没有会怎样&#xff1f;为什么是输出的是…

RabbitMQ安装及使用

系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、插件安装四、配置五、权限六、集群模式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&…

【MATLAB源码-第154期】基于matlab的OFDM系统多径信道下块状和梳妆两种导频插入方式误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种高效的无线信号传输技术&#xff0c;广泛应用于现代通信系统&#xff0c;如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…