实时数据开发|Flink异步IO--提升性能和吞吐量

在使用Flink处理流式数据的过程中,会经常和外部系统进行数据交互。通常情况下在 Flink 中可以创建外部数据库系统的Client连接,然后通过Client连接将数据元素写入外部存储系统中或者从外部存储系统中读取数据。考虑到连接外部系统的网络等因素,这种同步查询和操作数据库的方式往往会影响整个函数的处理效率,用户如果想提升应用的处理效率,就必须考虑增加算子的并行度,这将导致大量的资源开销。

Flink在1.2版本中引人了Asynchronous IO,能够支持通过异步方式连接外部存储系统,以提升Flink系统与外部数据库交互的性能及吞吐量,但前提是数据库本身需要支持异步客户端。

异步IO可以提升性能和吞吐量 ,主要原因是在异步函数中可以尽可能异步并发地查询外部数据库。在异步IO中需考虑对数据库查询超时以及并发线程数控制两个因素。有两个重要参数:

  • Timeout是定义Asynchronous 请求最长等待时间,超过该时间Fink将认为查询数据超时而请求失败,避免因请求无法控时返回导致系统长时间等待的情况,对于超时的请求可以通过复写AsyncFunction中的timeout 方法来处理。
  • Capacity定义在同一时间点异步请求并发数,一旦Capacity定义的请求数被耗尽,Flink会直接触发反压机制来抑制上游数据的接人,从而保证Flink系统的正常运行。

使用异步IO方式进行数据输出,其输出结果的先后顺序有可能并不是按照之前原有数据的顺序进行排序,因此在Flink异步I0中,需要用户显式指定是否对结果排序,这也影响着结果的顺序和系统性能:

  • 乱序模式:异步查询结果输出中,原本数据元素的顺序可能会发生变化,请求且完成就会输出结果,可以使用**AsyncDataStream.unorderedWait(.)**方法应用这种模式。如果系统同时选择使用ProcessTime特征具有最低的延时和负载。
  • 顺序模式:异步查询结果将按照输人数据元素的顺序输出,原本Steam数据元素的顺序保持不变,这种情况下具有较高的时延和负载,因为结果数据需要在Operator的Buffer中进行缓存,直到所有异步请求处理完毕,将按照原来元素顺序输出结果,这也将对Checkpointing过程造成额外的延时和性能损耗。可以使用**AsyncDataStream.orderedWait(.)**方法使用这种模式。

另外在使用Event-Time时间概念处理流数据的过程中,Asynchronous IO Operator总能够正确保持Watermark的顺序,即使使用乱序模式,输出Watermark也会保持原有顺序,但对于在Watermark之间的数据元素则不保持原来的顺序,也就是说如果使用了Watermark,将会对异步I0 造成一定的时延和开销,具体取决于 Watermark的频率,频率越高时延越高同时开销越大

相关推荐
2601_962074683 分钟前
大数据-263 实时数仓 - Canal 工作原理 工作流程 MySQL Binglog基本介绍
大数据·数据库·mysql
2601_962181967 分钟前
数据库之PostgreSQL详解
数据库·postgresql
疯狂打码的少年12 分钟前
【数据库技术】SQL概述与数据定义(DDL:CREATE/DROP/ALTER)
数据库·笔记·sql·oracle
数据库小学妹25 分钟前
关系型数据库内置图查询来了:SQL/PGQ标准怎么用
数据库·图数据库·关系型数据库·图查询·数据库新特性
pnoker43 分钟前
IoT DC3 时序存储选型:四款数据库可插拔
数据库·物联网·postgresql·时序数据库·influxdb·tdengine·iotdb
黑臂麒麟1 小时前
HarmonyOS鸿蒙实战应用6:随手账本——Preferences本地持久化
数据库·华为·app·鸿蒙
2601_962174171 小时前
小试牛刀-SpringBoot集成SOL链
数据库·spring boot·后端
如何取名1 小时前
结合实际业务进行LRU淘汰算法优化设计(数据库开发日志)
数据库·算法
HanhahnaH1 小时前
Outbox 投递器:事务性发件箱模式详解
数据库