Flink实时写入Apache Doris如何保证高吞吐和低延迟

news2024/10/7 10:19:32

随着实时分析需求的不断增加,数据的时效性对于企业的精细化运营越来越重要。借助海量数据,实时数仓在有效挖掘有价值信息、快速获取数据反馈、帮助企业更快决策、更好的产品迭代等方面发挥着不可替代的作用。

在这种情况下,Apache Doris 作为一个实时 MPP 分析数据库脱颖而出,它具有高性能和易用性,并且支持多种数据导入方式。结合 Apache Flink,用户可以从 MySQL 等上游数据库快速导入来自 Kafka 和 CDC(Change Data Capture) 的非结构化数据。 Apache Doris 还提供了亚秒级的分析查询能力,可以有效满足多维分析、仪表盘、数据服务等多种实时场景的需求。

挑战

通常,实时数据仓库要保证端到端的高并发和低延迟存在很多挑战,例如:

  • 如何保证秒级的端到端数据同步?

  • 如何快速保证数据可见性?

  • 高并发情况下小文件写入问题如何解决?

  • 如何保证端到端的Exactly-Once?

在上述挑战中,我们对用户使用 Flink 和 Doris 构建实时数仓的业务场景进行了深入研究。在抓住用户痛点后,我们在Doris 1.1版本中进行了针对性的优化,大大提升了用户体验,提高了稳定性。 Doris的资源消耗也得到了极大的优化。

优化

流式写入

Flink Doris Connector 最初的做法是在接收到数据后将数据缓存到内存批处理中。数据写入的方法是保存批处理,同时使用batch.sizebatch.interval等参数来控制 Stream Load 写入的时机。

通常在参数合理的情况下运行稳定。无论参数不合理,都会导致频繁的Stream Load和不及时的compaction,导致版本错误过多(-235)。另一方面,当数据过多时,为了降低 Stream Load 的写入频率,将batch.size设置过大也可能导致 OOM。

为了解决这个问题,我们引入流式写入:

<a href=

  • Flink任务启动后,会异步发起Stream Load Http请求。

  • 收到数据后,会通过Http的Chunked传输编码,不断的传输给Doris。

  • Http 请求将在 Checkpoint 结束并完成 Stream Load 写入。下一个 Stream Load 请求将同时异步发起。

  • 继续接收数据,后续流程同上。

由于采用 Chunked 机制传输数据,因此避免了批处理的内存压力。并且写入的时间与Checkpoint绑定,使得Stream Load的时间可控,为后面的Exactly-Once语义提供了基础。

恰好一次

Exactly-Once 意味着数据不会被重新处理或丢失,甚至不会出现机器或应用程序故障。 Flink 很早就支持 End-to-End 的 Exactly-Once 场景,主要是通过两阶段提交协议来实现 Sink 算子的 Exactly-Once 语义。

在 Flink 两阶段提交的基础上,借助 Doris 1.0 的 Stream Load 两阶段提交,Flink Doris Connector 实现了 Exactly Once 语义。具体原则如下:

  • Flink任务启动时,会发起Stream Load PreCommit请求。这时候会先开启一个事务,通过Http的Chunked机制不断向Doris发送数据。

  • 数据写入在 Checkpoint 结束时完成 Http 请求,并将事务状态设置为 preCommitted。数据已写入 BE,此时用户不可见。

  • Checkpoint之后会发起一个Commit请求,事务状态会设置为Committed。数据将在请求后对用户可见。

  • Flink 应用程序意外结束并从 Checkpoint 重启后,如果最后一个事务处于 preCommitted 状态,则会发起回滚请求,并将事务状态设置为 Aborted。

基于以上,可以使用 Flink Doris Connector 实现数据的实时存储,不丢不重。

秒级数据同步

高并发写入场景下端到端的秒级数据同步和数据的实时可见性,需要Doris具备以下能力:

  • 交易处理能力

Flink 实时写入与 Doris 以 Stream Load 2pc 的形式进行交互,这需要 Doris 具备相应的事务处理能力来保证基本的 ACID 特性,并支持 Flink 在高并发场景下的秒级数据同步。

  • 数据版本的快速聚合能力

Doris 中的一次导入将生成一个数据版本。在高并发写入场景下,不可避免的影响是数据版本过多,单次导入的数据量不会太大。持续的高并发小文件写入场景对实时性和Doris的数据合并性能非常考验,对Doris不友好,进而影响查询的性能。 Doris 在 1.1 版本中大幅增强了数据压缩能力,可以快速完成新数据的聚合,避免分片数据版本过多导致的 -235 错误和查询效率问题。

首先在Doris 1.1版本中引入了QuickCompaction,可以在数据版本增加时主动触发Compaction。同时,通过提高扫描分片元信息的能力,可以快速发现需要compact的分片并触发Compaction。通过主动触发和被动扫描,彻底解决了数据合并的实时性问题。

针对高频小文件Cumulative Compaction,实现Compaction任务的调度和隔离,防止重量级Base Compaction影响新数据的合并。

最后,采用梯度合并的方法对合并小文件的策略进行了优化。每次参与合并的文件属于同一数据量级,可以防止大小差异较大的版本合并,并逐步分层合并,减少单个文件参与合并的次数,可以大大节省系统的 CPU 消耗。

Doris 1.1 版本针对高并发导入、秒级数据同步、数据实时可见等场景进行了针对性的优化,极大的增加了 Flink 系统和 Doris 系统的易用性和稳定性,节省了整体资源集群。

效果

一般Flink高并发场景

在调查的一般场景中,使用 Flink 来同步上游 Kafka 中的非结构化数据。数据通过 ETL 后由 Flink Doris Connector 实时写入 Doris。

这里的客户场景非常严格。上游保持每秒10w的高频率,数据需要能够在5s内完成上下游同步,实现秒级数据可见性。 Flink 配置 20 并发,Checkpoint 间隔为 5s。 Doris 1.1 版本的性能相当出色。

具体体现在以下几个方面:

  • 实时压缩

数据可以快速合并,tablet数据版本数保持在50以下,compaction分数稳定。与之前高并发导入场景下的-235问题相比,compaction效率提升了10倍以上。

[

<a href=

  • CPU资源消耗

Doris 1.1 版本优化了小文件的压缩策略。高并发导入场景下,CPU资源消耗降低25%。

  • QPS查询延迟稳定

通过减少 CPU 使用率和数据版本数,提高了数据的整体顺序,减少了 SQL 查询的延迟。

秒级数据同步场景(超高压)

客户端单赌单平板30并发限流负载压力测试,实时数据<1s,compaction分数优化前后对比如下:

<a href=

建议

实时数据可视化场景

对于延迟要求严格的场景,比如秒级数据同步,通常意味着单个导入文件很小,建议减少cumulative_size_based_promotion_min_size_mbytes。默认单位为64MB,可手动设置为8MB,即可以大大提高compaction的实时性。

高并发场景

对于高并发写入场景,可以通过增加检查点间隔来降低 Stream Load 的频率。例如,将 checkpoint 设置为 5-10s 不仅可以提高 Flink 任务的吞吐量,还可以减少小文件的生成,避免造成 compaction 更大的压力。

另外,对于数据实时性要求不高的场景,比如分钟级数据同步,可以增加checkpoint间隔,比如5-10分钟。并且 Flink Doris 连接器仍然可以通过两阶段提交和检查点机制来保证数据的完整性。

未来规划

  • 实时架构更改

通过 Flink CDC 实时访问数据时,上游业务表会进行 schema 变更操作,需要在 Doris 和 Flink 任务中手动修改 schema。最终,重启任务后,新schema的数据就可以同步了。

这种方式需要人工干预,会给用户带来很大的操作负担。在后续版本中,实时schema变更将支持CDC场景,上游schema变更将实时同步到下游,全面提升schema变更效率。

  • Doris 多表写作

目前 Doris Sink 算子只支持单表同步,所以对于整个数据库来说,还是要在 Flink 层面手动分流,写入多个 Doris Sink,会增加开发者的难度。在后续版本中,我们将支持单个 Doris Sink 同步多个表,大大简化了用户的操作。

  • 自适应压缩参数调整

目前compaction策略的参数很多,在大部分通用场景下都能起到很好的作用,但是这些策略在一些特殊场景下仍然不能有效发挥作用。我们将在后续版本中继续优化,针对不同场景进行自适应compaction调优,不断提升各种场景下的数据合并效率和实时性。

  • 单副本压缩

目前的compaction策略是每个BE单独进行。在后续版本中,我们将实现单副本compaction,通过克隆快照实现compaction任务,减少系统负载的同时减少集群约2/3的compaction任务,将更多的系统资源留给用户侧。

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

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

相关文章

小程序开发——小程序的视图与渲染

1.视图与渲染过程 基本概念&#xff1a; 视图层由WXML页面文件和样式文件WXSS共同组成。事件是视图层和逻辑层沟通的纽带&#xff0c;用户操作触发事件后可通过同名的事件处理函数执行相应的逻辑&#xff0c;处理完成后&#xff0c;更新的数据又将再次渲染到页面上。 WXML页面…

通过流量安全分析发现主机异常

主机异常分析在计算机系统中具有重要意义。以下是主机异常分析的几个关键点&#xff1a; 1、检测安全威胁&#xff1a;主机是计算机系统的核心组件&#xff0c;通过对主机异常进行分析&#xff0c;可以快速检测到潜在的安全威胁&#xff0c;如恶意软件、病毒感染、黑客入侵等。…

python中可变类型与不可变类型详细介绍

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一.可变类型与不可变类型的特点 1.不可变数据类型 不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空…

Python获取本机IP地址的三种方式

目录 1、使用专用网址 2、使用自带socket库 3、使用第三方netifaces库 1、使用专用网站 获取的是公网IP。 网址&#xff1a;http://myip.ipip.net 代码&#xff1a; import requestsres requests.get(https://myip.ipip.net, timeout5).textprint(res)具体可以类似这样&#x…

IP-guard客户端WINDOWS的打包方式

IP-guard的打包方式: 第一种:

Bootstrap的旋转器组件

旋转效果可以用来指示状态&#xff0c;比如页面的加载状态。 可以用类spinner-border实现普通旋转的旋转器效果。 用类spinner-grow实现渐渐变大的旋转器效果。 01-最基本的示例代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8">…

Python树莓派开发

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

鞋帽箱包经营小程序商城的作用是什么

线上是很多线下商家破局的方法&#xff0c;企业私域经营很重要。 如今&#xff0c;各行业都在搭建自有私域流量池及自主经营。1000商城模板&#xff0c;海量营销/功能/控件&#xff0c;极简的拖拽拉搭建形式&#xff0c;通过【雨科】平台搭建鞋帽箱包小程序商城&#xff0c;摆…

qwen大模型,推理速度慢,单卡/双卡速度慢,flash-attention安装,解决方案

场景 阿里的通义千问qwen大模型&#xff0c;推理速度慢&#xff0c;单卡/双卡速度慢。 详细&#xff1a; 1、今日在使用qwen-14b的float16版本进行推理&#xff08;BF16/FP16) 1.1 在qwen-14b-int4也会有同样的现象 2、使用3090 24G显卡两张 3、模型加载的device是auto&#x…

测试老鸟总结,Allure测试报告-自动化测试详解,惊险避坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Allure安装教程…

hello react

react中文官网 一、什么是react React是一个由Facebook开源的JavaScript库&#xff0c;用于构建用户界面。它基于组件化的思想&#xff0c;将界面拆分成多个独立的、可复用的组件&#xff0c;并通过组件之间的交互构建整个用户界面。React使用虚拟DOM&#xff08;Virtual DOM…

线框图软件:Balsamiq Wireframes mac中文介绍

Balsamiq Wireframes mac是一款用于创建线框图的软件工具。它旨在帮助用户快速制作出清晰、简洁的界面原型&#xff0c;以便在设计和开发过程中进行协作和沟通。 Balsamiq Wireframes具有简单直观的用户界面&#xff0c;使用户能够快速添加和编辑各种用户界面元素&#xff0c;如…

一百九十五、MySQL——MySQL数据库创建只读权限的账号(附流程截图)

一、目的 在团队开发过程中&#xff0c;为了实现数据共享以及避免其他团队修改库表数据&#xff0c;需要提供数据库只读权限的账号&#xff0c;因此以MySQL数据库为例&#xff0c;创建MySQL数据库只读权限的账号 二、实施步骤 &#xff08;一&#xff09;第一步&#xff0c;…

【C++】多态结束篇

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;虚表存在内存中哪里&#x…

SpringBoot中的日志使用

SpringBoot的默认使用 观察SpringBoot的Maven依赖图 可以看出来&#xff0c;SpringBoot默认使用的日志系统是使用Slf4j作为门户&#xff0c;logback作为日志实现 编写一个测试代码看是否是这样 SpringBootTest class SpringbootLogDemoApplicationTests {//使用Slf4j来创建LOG…

广西建筑模板的材质类型和特点有哪些?

广西建筑模板常用的材质类型包括木模板、钢模板、竹胶合板、塑料模板和铝合金模板等。每种材质都具有不同的特点和适用范围。 1. 木模板&#xff1a; - 适用于高层建筑的水平模板、剪力墙、竖向墙板、高架桥、立交桥、大坝、隧道施工及梁柱模板。 - 具有高强度和良好的韧性&…

通过全流量分析助力某医院关键业务提高性能

背景 福建某大型医院信息科近期接到多人反应&#xff0c;业务系统访问慢和报错情况&#xff0c;因为问题出现没有时间和操作规律&#xff0c;网络管理员通过多种方式排查&#xff0c;未能得到有效的原因定位。 我们已将NetInside流量分析系统部署到医院的机房内&#xff0c;使用…

2022年京东双十一手机数码全品类数据回顾

2023年双十一临近&#xff0c;特此带大家回顾一下去年双十一热门品类的一些战况数据。这一期是京东手机电脑数码。 整体表现来看&#xff0c;2022年双11大促京东手机、电脑、数码类产品并没有想象中的增长状态&#xff0c;无论是电脑中的笔记本、数码中的相机&#xff0c;或者是…

InnoDB事务

1. 支持的事务 扁平事务&#xff1a;所有操作都处于同一层次 带保持点的扁平事务&#xff1a;事务能够回到保持点的状态。 链事务&#xff1a;系统崩溃时&#xff0c;所有保存点都将消失。 嵌套事务&#xff1a;具有层次结构&#xff08;树&#xff09;。任意一个事务回滚会…

c语言进制的转换二进制转换10进制

c语言进制的转换之二进制转换10进制 c语言的进制的转换 c语言进制的转换之二进制转换10进制一、二进制转换10进制的方法二、10进制程序打印 一、二进制转换10进制的方法 二进制&#xff1a; 二进制逢二进一&#xff0c;所有的数组是0、1组成 十进制转二进制&#xff1a; 除二反…