Flink 单并行度内使用多线程来提高任务的整体性能

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

分析痛点

笔者线上有一个 Flink 任务消费 Kafka 数据,将数据转换后,在 Flink 的 Sink 算子内部调用第三方 api 将数据上报到第三方的数据分析平台。这里使用批量同步 api,即:每 50 条数据请求一次第三方接口,可以通过批量 api 来提高请求效率。由于调用的外网接口,所以每次调用 api 比较耗时。假如批次大小为 50,且请求接口的平均响应时间为 50ms,使用同步 api,因此第一次请求响应以后才会发起第二次请求。请求示意图如下所示:

同步请求第三方示意图.png

平均下来,每 50 ms 向第三方服务器发送 50 条数据,也就是每个并行度 1 秒钟处理 1000 条数据。假设当前业务数据量为每秒 10 万条数据,那么 Flink Sink 算子的并行度需要设置为 100 才能正常处理线上数据。从 Flink 资源分配来讲,100 个并行度需要申请 100 颗 CPU,因此当前 Flink 任务需要占用集群中 100 颗 CPU 以及不少的内存资。请问此时 Flink Sink 算子的 CPU 或者内存压力大吗?上述请求示意图可以看出 Flink 任务发出请求到响应这 50 ms 期间,Flink Sink 算子只是在 wait,并没有实质性的工作。因此,CPU 使用率肯定很低,当前任务的瓶颈明显在网络 IO。最后结论是 Flink 任务申请了 100 颗 CPU,导致 yarn 或其他资源调度框架没有资源了,但是这 100 颗 CPU 的使用率并不高,这里能不能优化通过提高 CPU 的使用率,从而少申请一些 CPU 呢?

同步批量请求优化为异步请求

首先可能想到可能是将同步请求改为异步请求,使得任务不会阻塞在网络请求这一环节,请求示意图如下所示。

异步请求第三方示意图.png

异步请求相比同步请求而言,优化点在于每次发出请求时,不需要等待请求响应后再发送下一次请求,而是当下一批次的 50 条数据准备好之后,直接向第三方服务器发送请求。每次发送请求后,Flink Sink 算子的客户端需要注册监听器来等待响应,当响应失败时需要做重试或者回滚策略。通过异步请求的方式,可以优化网络瓶颈,假如 Flink Sink 算子的单个并行度平均 10ms 接收到 50 条数据,那么使用异步 api 的方式平均 1 秒可以处理 5000 条数据,整个 Flink 任务的性能提高了 5 倍。对于每秒 10 万数据量的业务,这里仅需要申请 20 颗 CPU 资源即可。关于异步 api 的具体使用,可以根据场景具体设计,这里不详细讨论。

多线程 Client 模式

对于一些不支持异步 api 的场景,可能并不能使用上述优化方案,同样,为了提高 CPU 使用率,可以在 Flink Sink 端使用多线程的方案。如下图所示,可以在 Flink Sink 端开启 5 个请求第三方服务器的 Client 线程:Client1、Client2、Client3、Client4、Client5。这五个线程内分别使用同步批量请求的 Client,单个 Client 还是保持 50 条记录为一个批次,即 50 条记录请求一次第三方 api。请求第三方 api 耗时主要在于网络 IO(性能瓶颈在于网络请求延迟),因此如果变成 5 个 Client 线程,每个 Client 的单次请求平均耗时还能保持在 50ms,除非网络请求已经达到了带宽上限或整个任务又遇到其他瓶颈。所以,多线程模式下使用同步批量 api 也能将请求效率提升 5 倍。

多线程请求示意图.png

多线程的方案,不仅限于请求第三方接口,对于非 CPU 密集型的任务都可以使用该方案在降低 CPU 数量的同时,使得单个 CPU 承担多个线程的工作,从而提高 CPU 利用率。例如:请求 HBase 的任务或磁盘 IO 是瓶颈的任务,都可以降低任务的并行度,使得每个并行度内处理多个线程。

Flink 算子内多线程实现

Sink 算子的单个并行度内现在有 5 个 Client 用于消费数据,但 Sink 算子的数据都来自于上游算子。如下图所示,一个简单的实现方式是 Sink 算子接收到上游数据后通过轮循或随机的策略将数据分发给 5 个 Client 线程

Flink 并行度详解 TaskManager与Slot介绍      Flink的每个TaskManager为集群提供solt。 solt的数量通常与每个TaskManager节点的可用CPU内核数成比例。一般情况下你的slot数是你每个节点的cpu的核数。 并行度(Parallel)      一个Flink程序由多个任务组成(source、transformation和 sink)。 一个任务由多个... 阅读详情

相关推荐

flink第一课(详细理论)--体系架构

01 Flink简介Flink的体系架构基本上可以分为三层,由上往下依次是API & Libraries层、Runtime核心层以及物理部署层。API & Libraries层作为分布式数据处理框架,Flink同时提供了支撑流计算和批计算的接口,并在此基础之上抽象出不同的应用类型的组件库,如基于流处理的CEP(复杂事件处理库)、SQL&Table库和基于批处理的FlinkML(机器学习库)等、Gelly(图处理库)等。

m0_73691529的博客 1218

Flink】在 Flink 算子中使用多线程如何保证不丢数据?

分析到这里,我们设计的 Sink 终于可以保证不丢失数据了。对 CyclicBarrier 不了解的同学请 Google 或百度查询。再次强调这里多线程的方案,不仅限于请求第三方接口,对于非 CPU 密集型的任务都可以使用该方案来提高 CPU 利用率,且该方案不仅限于 Sink 算子,各种算子都适用。本文主要希望帮助大家理解 Flink使用多线程的优化及在 Flink 算子中使用多线程如何保证不丢数据。

九师兄 1181

在线学习FTRL介绍及基于Flink实现在线学习流程

背景 目前互联网已经进入了AI驱动业务发展的阶段,传统的机器学习开发流程基本是以下步骤: 数据收集->特征工程->训练模型->评估模型效果->保存模型,并在线上使用训练的有效模型进行预测。 这种方式主要存在两个瓶颈:模型更新周期慢,不能有效反映线上的变化,最快小时级别,一般是天级别甚至周级别。另外一个是模型参数少,预测的效果差;模型参数多线上predict的时候需要内存大,QPS无法保证。 针对这些问题,一般而言有两种解决方式:一种是采用On-line-learning的算法

pop_xiaohao的专栏 2846

使用多线程Flink算子中保证数据不丢失

Flink中的算子是数据处理的核心组件,它们可以通过多线程来并行处理数据。多线程算子可以将输入数据流分成多个并行的子任务,每个子任务在独立的线程中执行,从而提高整体处理能力。然而,使用多线程也带来了一些挑战,特别是在保证数据一致性和正确性方面。在Flink算子中使用多线程提高数据处理性能是可行的,但需要注意保证数据的一致性和正确性。通过使用状态管理、线程安全的数据结构和有序的操作符,可以有效地避免数据丢失和乱序的问题。在实际应用中,根据具体的场景和需求选择合适的方法来保证数据不丢失。

CodeHeroicX的博客 526

Flink入门(十)异步多线程Mysql打宽表,加维度

有这样需求,消息发来是有站点名,但与需要和mysql中维度表join出站名名的三字码(唯一标识符)。 flink版本1.6.3,maven配置如下: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</a...

baifanwudi的专栏 8871

阿里云Flink实时计算是如何突破每秒40亿条记录的?

身为大数据工程师,你还在苦学Spark、Hadoop、Storm,却还没搞过Flink?醒醒吧!在过去的2020双11,阿里在Flink实时计算技术的驱动下全程保持了“如丝般顺滑”,基于F...

1131

Apache Flink学习笔记(4)Flink中的核心概念理解

asas

liutao43的博客 407

Flink 数据积压问题

目录 项目背景 问题描述 问题定位 如何定位到底是哪个算子处理能力跟不上? 结论 问题解决 思路 解决 项目背景 将数据(kafka)以批量的方式,通过SCF接口写入TIDB中 过滤出指定的用户id,发到对应的规则检测kafka主题中 整体的数据流程图,如下图所示: 问题描述 运行一段时间后发现,消费开始积压,通过wstream的监控(也可以查看kafka的监控) 问题定位 如何定位到底是哪个算子处理能力跟不上? 我们明明写了...

野狼e族 的博客 3096

Flink与外部存储交互优化方案

Flink流式程序设计中,经常需要与外部系统进行交互,很多时候外部系统的性能会成为任务整体吞吐的瓶颈,通常的解决方案会通过提高任务并发度增加对外部系统并发访问,如此会带来Flink额外的资源管理负载以及整体cpu利用率不高的问题。 对于Flink与外部存储交互的场景,可以通过Flink 异步IO和并发度多线程的机制提高任务吞吐能力,而不需要提高任务并发度从而提升整体资源利用率。 一 Flink异步IO 对于Flink程序,通常的交互实现为同步请求,即发送一个请求,直到收到响应,继续处理,很多情况下

野狼e族 的博客 1411

Flink与外部存储交互优化

Flink流式程序设计中,经常需要与外部系统进行交互,很多时候外部系统的性能会成为任务整体吞吐的瓶颈,通常的解决方案会通过提高任务并发度增加对外部系统并发访问,如此会带来Flink额外的资源管理负载以及整体cpu利用率不高的问题。 对于Flink与外部存储交互的场景,可以通过Flink 异步IO和并发度多线程的机制提高任务吞吐能力,而不需要提高任务并发度从而提升整体资源利用率。 一、 Flink异步IO 对于Flink程序,通常的交互实现为同步请求,即发送一个请求,直到...

野狼e族 的博客 585

Flink 基于 MailBox 的 StreamTask 线程模型解析

通过合理使用 MailBox 实现的消息传递机制,可以提高任务的并发度、吞吐量和响应性能,提升大数据处理的效率和准确性。例如,当任务需要暂停、恢复或者取消时,可以向任务的 MailBox 发送相应的控制消息,任务线程会根据消息内容做出相应的操作。同时,基于 MailBox 的 StreamTask 线程模型也为 Flink 提供了更好的任务调度和并发控制能力,使得用户可以更加灵活地管理和调整任务的执行方式。这种异步的数据交换方式避免了多线程的数据竞争,提高任务的并发度和整体性能

2301_79366435的博客 202

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

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

zuiyuelong的博客 817

OmniStateStore性能优化技巧:提升Flink状态存储效率的10个方法

前往项目官网免费下载:[https://ar.openeuler.org/ar/](https://ar.openeuler.org/ar/?utm_source=csdn_blog) OmniStateStore是一款开源的高性能Flink状态存储引擎,专为提升流处理应用的状态管理效率而设计。本文将分享10个实用技巧,帮助你充分发挥OmniStateStore的性能潜力,优化Flink作业的状

gitblog_06828的博客 219

Flink之Asynchronous I/O异步操作

一、Asynchronous I/O简介 官网:http://flink.iteblog.com/dev/stream/asyncio.html   将Flink用于流计算时,若涉及到和外部系统进行交互,如利用Flink从数据库中读取数据,这种需要获取I/O的场景时,我们需要考虑交互所带来的时延问题。   为分析如何减少时延,我们先来分析一下,Flink以同步的形式方法外部系统(以MapFunction中和数据库交互为例)的过程,若图1虚线左侧所示,请求a发送到database后,MapFuncti.

lixinkuan的博客 1383

FlinkFlink 2023 Flink 自动化运维的大规模落地实践

视频地址:对应的中文后面有空补充。我们先看看问题背景,目前我们环境的业务规模很大了,暴露了很多问题我们把问题梳理了一下,主要分成2部分问题,配置问题和环境问题。

九师兄 406

美团点评基于 Flink 的实时数仓建设实践

2018年10月18日 引言 近些年,企业对数据服务实时化服务的需求日益增多。本文整理了常见实时数据组件的性能特点和适用场景,介绍了美团如何通过 Flink 引擎构建实时数据仓库,从而提供高效、稳健的实时数据服务。此前我们美团技术博客发布过一篇文章《流计算框架 Flink 与 Storm 的性能对比》,对 Flink 和 Storm 俩个引擎的计算性能进行了比较。本文主要阐述使用 Flink ...

u011250186的博客 351

基于 Flink+Pravega 的游戏服务器监控与调节系统设计

01背景介绍浏览完赛题,经团队讨论将应用场景锁定在了游戏服务器优化上,一是因为这方面趣味性较高,另外则是团队中的一员常年用爱发电[1]开服,对此比较有业务经验。1.1 团队简介团队四人均为本科生,相识于 Topview 工作室大数据组,现于广东工业大学就读。温嘉诚:大三本科生,负责整体架构的设计与数据处理部分。胡锦峰:大三本科生,负责整体架构的设计与日志采集部分。郑梓游:大二本科生,负责数据传输...

huzechen的博客 727

sparkVSmapreduce多线程与多进程

Apache Spark的高性能一定程度上取决于它采用的异步并发模型(这里指server/driver端采用的模型),这与Hadoop 2.0(包括YARN和MapReduce)是一致的。Hadoop 2.0自己实现了类似Actor的异步并发模型,实现方式是epoll+状态机,而Apache Spark则直接采用了开源软件Akka,该软件实现了Actor模型,性能非常高。尽管二者在server端采用

qq_14950717的博客 753

项目实战--Spring Boot 3整合Flink实现大数据文件处理

性能优化策略利用Spring Boot 3.+和Flink构建一个高效的大数据文件处理应用

qq_40623672的博客 4467
上一篇: 使用 Maven 构建 Flink 项目的正确姿势
fanru_bigdata
博客等级 码龄10年 23粉丝 7原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值