Flink:异步I/O访问外部数据

Flink源码分析--(一)异步I/O访问外部数据:AsyncWaitOperator 文章目录一、异步I/O概述二、创建AsyncWaitOperator 一、异步I/O概述 Flink流计算系统中经常需要与外部系统进行交互,比如需要查询外部数据库以关联上用户的额外信息。通常,我们的实现方式是向数据库发送用户a的查询请求(例如在MapFunction中,同步方式访问),然后等待结果返回,在这之前,我们无法发送用户b的查询请求 Flink的Async I/O允许用户在数据流中使... 阅读详情

Flink大数据项目实战:http://t.cn/ExrHPl9

 

Aysnc I/O

1.1Aysnc I/O是啥?

Async I/O 是阿里巴巴贡献给社区的一个呼声非常高的特性,于1.2版本引入。

 

主要目的:是为了解决与外部系统交互时网络延迟成为了系统瓶颈的问题。

 

场景:

流计算系统中经常需要与外部系统进行交互,比如需要查询外部数据库以关联上用户的额外信息。通常,我们的实现方式是向数据库发送用户a的查询请求(例如在MapFunction中),然后等待结果返回,在这之前,我们无法发送用户b的查询请求。这是一种同步访问的模式,如下图左边所示。

图中棕色的长条表示等待时间,可以发现网络等待时间极大地阻碍了吞吐和延迟。为了解决同步访问的问题,异步模式可以并发地处理多个请求和回复。也就是说,你可以连续地向数据库发送用户a、b、c等的请求,与此同时,哪个请求的回复先返回了就处理哪个回复,从而连续的请求之间不需要阻塞等待,如上图右边所示。这也正是 Async I/O 的实现原理。

1.2提高吞吐量的两种方式对比

目标:提高吞吐量

 

1.3使用Aysnc I/O的前提条件

1.数据库(或key/value存储)提供支持异步请求的client。

2.没有异步请求客户端的话也可以将同步客户端丢到线程池中执行作为异步客户端。

注意:后者没有前者效果好。

1.4Async I/O API实现异步流式转换

Flink Async I/O API 允许用户在数据流中使用异步请求客户端访问外部存储。该API处理与数据流的集成,以及消息顺序性(Order)、事件时间(event time)、一致性(容错)等脏活累活。用户只需要专注于业务。

 

如果目标数据库有异步客户端,则三步即可实现异步流式转换操作(针对该数据库异步):

1.实现用来分发请求的AsyncFunction ,用来向数据库发送异步请求并设置回调。

2.获取操作结果的callback,并将它提交给ResultFuture。

3.将异步I/O操作应用于DataStream。

1.5AsyncFunction

AsyncFunction实现实例如下所示:

1.6AsyncFunction超时处理

当异步I/O请求超时时,默认情况下会抛出异常并重新启动job。如果希望处理超时,可以覆盖AsyncFunction的timeout方法。

1.7AsyncDataStream工具类

一个工具类,用于将AsyncFunction应用于DataStream。

 

AsyncFunction发出的并发请求通常是无序的,该顺序基于哪个请求先完成。为了控制结果记录的发出顺序,Flink提供了两种模式,分别对应AsyncDataStream 的两个静态方法,orderedWait 和 unorderedWait:

 

1.orderedWait(有序):消息的发送顺序与接收到的顺序相同(包括 watermark ),也就是先进先出。

2.unorderedWait(无序) :

a)在 ProcessingTime 的情况下,完全无序,先返回的结果先发送(最低延迟和最低开销)。

b)在 EventTime 的情况下,watermark 不能超越消息,消息也不能超越 watermark,也就是说 watermark 定义的顺序的边界。在两个 watermark 之间的消息的发送是无序的,但是在watermark之后的消息不能先于该watermark之前的消息发送。(这意味着,在存在watermark的情况下,无序模式引入了与有序模式相同的延迟和管理开销。这种开销的大小取决于watermark频率。)

注意:Ingestion Time是一种特殊的Event Time ,它根据source的processing time自动生成watermark。

1.8容错与最佳实践

Async I/O operator提供完全exactly-once容错保证,它将运行中的异步请求记录存储在检查点中,并在从故障恢复时恢复/重新触发请求

 

最佳实践

1.使用Executor作为Future的回调时,推荐使用线程切换开销较小的DirectExecutor,可以选择下面任意方式或得:

org.apache.flink.runtime.concurrent.Executors.directExecutor()

com.google.common.util.concurrent.MoreExecutors.directExecutor()

 

2.asyncInvoke#asyncInvoke不是被Flink多线程调用的,不要在里面直接使用阻塞操作。

2.原理

2.1原理实现

注意:本小节不要求掌握

AsyncDataStream.(un)orderedWait方法的主要工作就是创建了一个 AsyncWaitOperator。AsyncWaitOperator 是支持异步 IO 访问的算子实现,该算子会运行 AsyncFunction 并处理异步返回的结果,其内部原理如下图所示:

 

如图所示,AsyncWaitOperator 主要由两部分组成:StreamElementQueue 和 Emitter。StreamElementQueue 是一个 Promise 队列,所谓 Promise 是一种异步抽象表示将来会有一个值(排队买鸭血粉丝汤给你的小票),这个队列是未完成的 Promise 队列,也就是进行中的请求队列。Emitter 是一个单独的线程,负责发送消息(收到的异步回复)给下游。

 

图中E5表示进入该算子的第五个元素(”Element-5”),在执行过程中首先会将其包装成一个 “Promise” P5,然后将P5放入队列。最后调用 AsyncFunction 的 ayncInvoke 方法,该方法会向外部服务发起一个异步的请求,并注册回调。该回调会在异步请求成功返回时调用 AsyncCollector.collect 方法将返回的结果交给框架处理。实际上 AsyncCollector 是一个 Promise ,也就是 P5,在调用 collect 的时候会标记 Promise 为完成状态,并通知 Emitter 线程有完成的消息可以发送了。Emitter 就会从队列中拉取完成的 Promise ,并从 Promise 中取出消息发送给下游。

2.2消息的顺序性

上文提到 Async I/O 提供了两种输出模式。其实细分有三种模式: 有序,ProcessingTime 无序,EventTime 无序。

 

Flink 使用队列来实现不同的输出模式,并抽象出一个队列的接口(StreamElementQueue),这种分层设计使得AsyncWaitOperator和Emitter不用关心消息的顺序问题。StreamElementQueue有两种具体实现,分别是 OrderedStreamElementQueue 和 UnorderedStreamElementQueue。UnorderedStreamElementQueue 比较有意思,它使用了一套逻辑巧妙地实现完全无序和 EventTime 无序。

2.3有序

有序比较简单,使用一个队列就能实现。所有新进入该算子的元素(包括 watermark),都会包装成 Promise 并按到达顺序放入该队列。如下图所示,尽管P4的结果先返回,但并不会发送,只有 P1 (队首)的结果返回了才会触发 Emitter 拉取队首元素进行发送。如下图所示:

2.4ProcessingTime 无序

ProcessingTime 无序也比较简单,因为没有 watermark,不需要协调 watermark 与消息的顺序性,所以使用两个队列就能实现,一个 uncompletedQueue 一个 completedQueue。所有新进入该算子的元素,同样的包装成 Promise 并放入 uncompletedQueue 队列,当uncompletedQueue队列中任意的Promise返回了数据,则将该 Promise 移到 completedQueue 队列中,并通知 Emitter 消费。如下图所示:

2.5EventTime 无序

EventTime 无序类似于有序与 ProcessingTime 无序的结合体。因为有 watermark,需要协调 watermark 与消息之间的顺序性,所以uncompletedQueue中存放的元素从原先的 Promise 变成了 Promise 集合。如果进入算子的是消息元素,则会包装成 Promise 放入队尾的集合中。如果进入算子的是 watermark,也会包装成 Promise 并放到一个独立的集合中,再将该集合加入到 uncompletedQueue 队尾,最后再创建一个空集合加到 uncompletedQueue 队尾。这样,watermark 就成了消息顺序的边界。只有处在队首的集合中的 Promise 返回了数据,才能将该 Promise 移到 completedQueue 队列中,由 Emitter 消费发往下游。只有队首集合空了,才能处理第二个集合。这样就保证了当且仅当某个 watermark 之前所有的消息都已经被发送了,该 watermark 才能被发送。过程如下图所示:

2.6快照与恢复

分布式快照机制是为了保证状态的一致性。我们需要分析哪些状态是需要快照的,哪些是不需要的。首先,已经完成回调并且已经发往下游的元素是不需要快照的。否则,会导致重发,那就不是 exactly-once 了。而已经完成回调且未发往下游的元素,加上未完成回调的元素,就是上述队列中的所有元素。

所以快照的逻辑也非常简单。

(1)清空原有的状态存储,

(2)遍历uncompletedQueue中的所有 Promise,从中取出 StreamElement(消息或 watermark)并放入状态存储中(3)执行快照操作。

恢复的时候,从快照中读取所有的元素全部再处理一次,当然包括之前已完成回调的元素。所以在失败恢复后,会有元素重复请求外部服务,但是每个回调的结果只会被发往下游一次。

Flink异步I/O 访问外部数据 flink异步访问数据库 阅读详情

相关推荐

Flink使用异步I/O访问外部数据

Flink学习笔记(十五):本文示例参考自:1.Flink官方文档      2.HttpAsyncClient(异步HttpClient)      3.高德地图(地理/逆地理编码) 1.异步I/O操作的需求  ...

扛麻袋的少年的博客 2682

虚拟机flink webui无法访问

192.168.138.102 hadoop102 192.168.138.103 hadoop103 192.168.138.104 hadoop104

JavaBigData的博客 2337

python——模拟砍价

类型:随机数。

m0_62488776的博客 1972

flink启动后web访问问题

在执行./start-cluster.sh 后,flink进程的监听ip端口是。这样只能本机进行访问,外部服务器是访问不了的,出现这个问题的原因是flink的。所以启动后就解析到127.0.0.1了。, 进程启动时会按照这个主机名从。

lubingxue7048的专栏 6031

MATLAB实战:纯电动汽车动力性仿真从入门到精通(附完整代码)

本文提供了一份基于MATLAB的纯电动汽车动力性仿真从入门到精通的实战指南。通过理论建模与代码实战相结合,详细讲解了如何构建行驶阻力模型、驱动力平衡方程,并利用MATLAB脚本完整实现了最高车速、加速时间和最大爬坡度三大核心性能指标的仿真计算。文章附有完整代码,帮助工程师快速掌握纯电动汽车动力性仿真的核心技能,为设计与优化提供高效的数字工具。

weixin_29074409的博客 369

LS-DYNA超高速碰撞仿真入门:从SPH算法配置到铝靶板穿孔分析(附K文件模板)

本文详细介绍了使用LS-DYNA中的SPH(光滑粒子流体动力学)算法进行超高速碰撞仿真的完整流程。以铝弹丸撞击铝靶板为例,从SPH算法原理、LS-PrePost前处理、材料模型与状态方程设置,到接触定义、边界条件及K文件生成,提供了系统的入门指导和关键参数调试经验,帮助工程师高效模拟材料破碎、穿孔等极端变形问题。

h0i1j2k3l的博客 735

外部无法访问虚拟机【centos】hadoop50070管理页面

【外部无法访问虚拟机【centos】hadoop50070管理页面】 2019年4月8日 问题描述:系统使用的是centos7,关闭了防火墙,linux和windows里外都能ping通,但是虚拟机的linux浏览器可以通过ip和localhost访问50070管理页面,而外面的windows不能,虚拟机连接方式是使用的hostonly 解决方案:我查询了资料,先查看防火墙是否关闭,然后有博主说i...

好记性不如烂笔头 1851

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1329

VMware虚拟机 Nat模式不能访问外网

虚拟机网络问题

爱玩游戏的黑客的博客 1万+

VS(QT)调用Matlab函数的方法

调试–>窗口–>异常设置–>Win32 Exceptions全部不要勾选。选择Microsoft Visual C++ 2017。将生成的.h和.lib分别放置在对应的文件夹。输入mex -setup C++输入deploytool选择。选择Realse x64。

woshigaowei5146的博客 592

ESP-SR实战:从零搭建智能语音唤醒与命令识别系统

本文详细介绍了如何利用乐鑫ESP-SR框架,从零开始搭建一个完整的离线智能语音交互系统。内容涵盖硬件选型(推荐ESP32-S3与数字麦克风)、开发环境配置(ESP-IDF与ESP-ADF),并深入解析了AFE声学前端、WakeNet唤醒词检测和MultiNet命令词识别三大核心模块的工作原理与实战配置。通过具体的代码示例和调试技巧,指导开发者快速实现高识别率的语音唤醒与命令控制功能。

weixin_29161785的博客 302

外部机器通过局域网无法访问本机虚拟机问题,2步解决

题外-本人测试时候需要修改:如果测试地址写死了Ip切记修改掉,重新加载(systemctl daemon-reload,systemctl restart docker)。1.确保俩台机器处于同一局域网内部。

qq_32930833的博客 1813

11 指挥AI写C语言/嵌入式基础代码,适配硬件与底层逻辑

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十一篇,正式进入第三阶段多场景实战环节。聚焦**C语言/嵌入式基础代码**生成,结合嵌入式开发的核心需求,讲解如何精准编写指令,指挥AI生成适配硬件、贴合底层逻辑的C语言代码,覆盖嵌入式常用底层功能、硬件适配要点、代码规范,搭配完整指令模板、AI输出示例与实操校验方法,零基础也能快速指挥AI完成嵌入式基础开发,无需死记硬背C语言底层语法。

coreopt的博客 141

Flink学习笔记:异步I/O访问外部数据

说明:本文为《Flink大数据项目实战》学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习优快云官网课程: Flink大数据项目实战:http://t.cn/ExrHPl9 Aysnc I/O 1.1Aysnc I/O是啥? Async I/O 是阿里巴巴贡献给社区的一个呼声非常高的特性,于1.2版本引入。 主要目的:是为了解决与外部系统交互时...

大数据研习社 3451

安卓15_ROM修改定制化_____修改rom的前提条件 去除各种验证 安卓设备通用

通过博文了解💝💝💝 1-------💝💝💝了解安卓设备的启动流程与核心验证机制 2-------💝💝💝了解安卓设备修改rom中的各种验证机制以及对应的去除方法 3-------💝💝💝了解avb验证与dm验证的本质区别与对应的操作方式 4-------💝💝💝修改rom前的循序步骤 避免验证机制导致的不开机

小马哥的专栏 508

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

55、Flink之用于外部数据访问的异步 I/O介绍及示例

在大多数情况下,I/O访问是一个耗时的过程,这使得单个operator的TPS比内存计算低得多,尤其是对于流式作业,当低延迟是用户的一大担忧时。启动多个线程可能是处理这个问题的一种选择,但缺点是显而易见的:最终用户的编程模型可能会变得更加复杂,因为他们必须在运算符中实现线程模型。此外,他们必须注意与checkpointing的协调。AsyncFunction: 异步I/O将在AsyncFunction中触发。

alanchanchn的专栏 7万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【flink番外篇】14、Flink异步I/O访问外部数据示例

系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink 部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。3、Flik Table API和SQL基础系列本部分介绍Flink Table Api和SQL的基本用法,比如Table API和SQL创建库、表用法、查询、窗口函数、catalog等等内容。

alanchanchn的专栏 7万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【翻译】Flink 异步I / O访问外部数据

本文来自官网翻译:Asynchronous I/O for External Data Access 需要异步I / O操作 先决条件 异步I / O API 超时处理 结果顺序 活动时间 容错保证 实施技巧 警告 本页介绍了Flink API与外部数据存储的异步I / O的使用。对于不熟悉异步或事件驱动编程的用户,有关Futures和事件驱动编程可...

anfuyi5792的博客 284

Flink Async I/O:异步查询外部数据的性能利器与实战指南

随着流处理技术在各行各业的深入应用,异步I/O已经成为提升系统吞吐量和响应能力的关键技术之一。通过将原本串行的外部数据访问转化为并行处理模式,它不仅解决了传统同步I/O在高并发场景下的性能瓶颈,更为复杂事件处理、实时推荐、风控系统等场景提供了强有力的支撑。从AsyncFunction的灵活扩展机制到AsyncWaitOperator的高效调度策略,Flink通过异步I/O为开发者提供了一套既强大又易用的工具集。异步编程模式在大数据生态中的重要性正在持续提升。

zuiyuelong的博客 833

Flink 异步IO访问外部数据(mysql篇)

  接上篇:【翻译】Flink 异步I / O访问外部数据   最近看了大佬的博客,突然想起Async I/O方式是Blink 推给社区的一大重要功能,可以使用异步的方式获取外部数据,想着自己实现以下,项目上用的时候,可以不用现去找了。   最开始想用scala 实现一个读取 hbase数据的demo,参照官网demo:   /** * An implementation ...

anfuyi5792的博客 1608

Flink Asynchronous I/O for External Data Access

该翻译原文来之flink官网asyncio.html 用于外部数据访问的异步I/O 本页面解释了如何使用Flink的API对具有外部数据存储的异步I/O进行操作。对于不熟悉异步或事件驱动编程的用户,一篇关于Futures和事件驱动编程的文章可能是有用的准备。 注意:关于异步I/O实用程序的设计和实现的详细信息可以在建议和设计文档FLIP-12: Asynchronous I/O Design an...

zsq12138的博客 1384

(十)Flink Datastream API 编程指南 算子-5 外部数据访问的异步I/O

本页面解释了使用Flink的API与外部数据存储进行异步I/O。对于不熟悉异步或事件驱动编程的用户,一篇关于Futures和事件驱动编程的文章可能是有用的准备。当与外部系统交互时(例如,当使用存储在数据库中的数据丰富流事件时),需要注意与外部系统的通信延迟不会主导流应用程序的全部工作。单纯地访问外部数据库中的数据,例如在MapFunction中,通常意味着同步交互:一个请求被发送到数据库,MapFunction等待直到接收到响应。在许多情况下,这种等待占据了函数的绝大多数时间。与数据库的异步交互意味着单个并

京河小蚁的博客 467

Flink 异步I/O

1.为什么需要异步IO flink在做实时处理时,有时候需要和外部数据交互,但是通常情况下这个交互过程是同步的,这样就会产生大量的等待时间;而异步操作可以在单个函数实例中同时处理多个请求,并且同时接收相应。这样等待时间就平均分摊到了多个请求上,大大减少了请求的等待时长,可以提高实时处理的吞吐量。 2.使用flink异步IO的先决条件 需要所连接的数据库支持异步客户端 在没有异步客户端的情况下,可以通过创建多个客户端并使用线程池处理同步调用来尝试将同步客户端转变为有限的并发客户端 3. flink

breakout_alex的博客 969

flink 异步io mysql 缓存_Flink用于外部数据访问的异步I/O

本页阐述了使用Flink的API来进行外部数据存储的异步I/O,对于不熟悉异步或者事件驱动编程的用户,一篇关于Future和事件驱动编程可能会很有用。注意:关于异步I/O的详细设计和实现可以在异步I/O设计和实现这篇文章找到。异步I/O操作的需要当与外部系统进行交互(例如使用存储在数据库中的数据丰富流事件)时, 需要注意的是, 与外部系统的通信延迟并不决定流应用程序的总体工作。原始的访问外部系统中...

weixin_42410477的博客 310
上一篇: 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector。
下一篇: CompletableFuture 使用详解
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值