中电金信:技术实践|Flink多线程实现异构集群的动态负载均衡

导语:Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。本文主要从实际案例入手并结合作者的实践经验,向各位读者分享当应用场景中异构集群无法做到负载均衡时,如何通过Flink的自定义多线程来实现异构集群的动态负载均衡。

● 1. 前言

● 2. 出现的问题与解决方案

 ● 2.1 出现问题

 ● 2.2 分析思路

 ● 2.3 解决方案

● 3. 技术架构

● 4. 建设成效

● 5. 结语

前言

在实时计算应用场景中经常会有对异构集群的实时调用需求,而当异构集群的服务由于机器配置、节点负载等原因无法做到负载均衡时,可以通过Flink的自定义多线程来实现对异构集群的动态负载均衡。           

下面举个例子:

文本内容鉴别、图片内容鉴别、图片OCR等特征生产需求,都需要和基于GPU部署的异构集群来交互。如果GPU集群机器配置无法统一,那么就会产生负载不均的情况。即:一个GPU集群中某些节点处理的快,某些节点处理的慢,处理慢的节点往往会导致大量的超时异常,从而引起整个作业的反压。

其流程图如下:

我们借助Flink分布式的先天优势,在任务中通过Thrift RPC调用模型服务,实时获取结果后再写到特征工程,以此来构建特征生成整个链路。

图片

出现的问题与解决方案

出现问题:

在模型服务中部署的若干个节点,节点和节点之间是完全独立的,每个节点上线/下线后都会将自己的状态更新到ZooKeeper。在Flink任务的每个subTask都会注册一个Watch,以便获取最新且可用的所有节点。对于流入到subTask的每条数据,都需要选择一个节点来完成数据的推理。

在前期,我们使用Random策略来选择节点,但是在使用过程中我们发现,如果服务端的一个模型节点性能变低,随之而来的就是数据推理的耗时变长,那么最终可能会导致Flink任务反压。而在服务端来看,很多模型节点并没有满负荷运行,但客户端反应出来的服务端性能却不够,处理完成的总QPS很低。

另外,在和模型服务通信的时候,我们采用的是同步策略,这对于一些推理耗时长、QPS高的任务来说,需要足够大的并发度才能完成数据请求。然而,这些任务的资源利用率较低,这也是生产环境的一大痛点。

图片

分析思路:

基于上图,我们作出如下分析:

在理想情况下,我们假设服务端有节点1、节点2、节点3,且3个节点性能都一致,每个节点都开32个并行度处理。假设每条数据处理耗时都是800ms,那么每个节点的处理能力应该是40条/s,三个节点满载的情况下处理能力应该是120条/s。

而在实际生产环境下,服务端部署的机器各个节点之间处理能力是有差异的,导致其出现差异的原因主要有三点。

 GPU物理机器有多种规格,性能之间差别较大,在进行部署时很难确保将节点部署在同一批机器上;

 一台机器上混部多种模型服务,相互之间会有影响;

 部分节点所在机器网络、磁盘等出现故障也会导致出现差异。

例如节点1和节点2部署在高性能机器上,节点并行度是32,单条数据处理耗时是800ms。节点3部署在低性能机器上,节点并行度是32,单条数据处理耗时2400ms,那么节点3的处理能力可以看作为13.3条/s。同样采用随机选择节点的策略,倘若一秒总共发送了40条数据,对于节点3来说就已经达到性能瓶颈了。假设这个时候有更多的数据选择到了节点3进行处理,就只能在服务端的队列进行排队,而如果这个队列满了就会拒绝连接。

随着任务的运行,节点3的等待队列数据会越来越多,客户端从发送请求到返回结果的耗时也会随之越来越大。这时一旦有subTask选择了这个节点,那么这个subTask就需要等待比较长的时间来完成这次的请求。在这个过程中,如果上游数据还在源源不断的流入,那么就会造成subTask的InputChannel慢慢被耗尽,随后公共Buffer Pool的空间也会被占满,进而导致subTask2卡死。又因为上游算子使用了Rebalance,最终会把整个Flink任务卡死。

图片

这是一个典型的木桶效应,在实际应用场景中,一旦有个别节点性能差或者出现故障,就会影响整个任务的稳定性。

解决方案:

在分析事故出现的原因后,我们提出给每个节点配置一个权重,模型节点定期将权重数值上报到ZooKeeper,客户端再通过权重来给每个节点分配相应的流量。这个想法很好,也在实践过程中取得了一定的效果,但是它有一个小问题:这样做会导致每个节点的流量一直抖动,抖动的频次和上报权重的时间呈正相关的关系,而且从监控来看,这样做也会导致处理的总数据量不太稳定。

图片

图片

在问题初步得到缓解后,我们开始思考是不是还有其他更好的方式可以解决这个事情。已知模型节点慢了会卡死一个subTask,而这个subTask本质是一个Slot,也就是一个线程,那么我们是不是可以借用多线程的方式来解决这个问题?带着这个思考,我们又尝试了另外两种解决方式:Async I/O和多线程方案。

■ Async I/O方案

Flink 在1.2版本中引入Async I/O,其主要目的是为了解决与外部系统交互时网络延迟成为系统瓶颈的问题。通过暴露出来的API,我们可以设置最大的操作数,简单理解为Slot中异步请求的最大并发数量。测试的时候我们准备了三个节点,一个节点处理耗时2000ms,另外两个节点处理耗时500ms。

任务在刚启动的几分钟内运行还比较正常,之后处理速度较慢节点的服务端队列堆积长度开始变得越来越大,最后稳定在150左右,与此同时超时失败率也开始随之升高。我们可以看到,通过这种方式虽然可以很好的解决因为快慢节点导致反压卡死和资源利用率问题,但是仍然无法解决流量分配的问题。

图片

图片

■ 多线程方案

我们在每个Slot内部实现一个生产者-消费者模型,再创建和模型节点相同数量的线程,让每个线程固定的请求一个节点,就算这个节点卡死或者处理速度缓慢,也只会影响当前线程,对整个subTask的影响有限。

图片

如上图所示,一个Slot内包含多个线程,个别线程对应的Service节点出现问题不会影响其它线程的消费。通过这种方式可以实现自适应的流量分发策略,每个线程对应一个服务端Pod,这种线程自适应阻塞的方式可以实现慢的节点少消费,快的节点多消费的目的。

在Flink以Slot为最小资源粒度情况下再进行细化,从Slot中开启若干个线程能够增大并发度,从而减少整体Slot数量,在降低资源的同时提高资源利用率。

技术架构

在Flink任务使用多线程的方案来解决RPC通信负载均衡的问题,编程模型需要做相应的改造,具体改造如下图:

图片

图片

建设成效

通过前后数据对比,我们发现在采用多线程方案后,效果还是很明显的。通过下图所示的服务端处理耗时这个指标我们可以看出以125.172结尾的节点处理耗时在1.7s左右,在流量分发数量指标可以看到分配给它的流量在5条/s左右;160.25的节点处理耗时在0.14s左右,分配的流量在58条/s左右,整体符合预期。

图片

图片

同时,为了保证整个服务的稳定性,我们增加了一些监控指标,如:缓存队列长度、模型失败率、链路耗时、写特征失败率等。

图片

结语

本文主要介绍了Flink在异构集群调用的时候,如果出现服务端无法分发流量的情况,在客户端可以通过多线程的方式实现流量的动态负载均衡,这样做可以帮助服务端兼容高低配机型,提升机器利用效能。不过,需要特别指出的是本文中使用的多线程算子是Stateless(无状态)的,对于有状态的算子还需要酌情考虑。另外,如果服务端是可以自主分配节点的组件时,可以选择使用Async I/O方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cloud_mall-notes01

1、登录 1.1 获取token令牌 登录时的ajax请求: 后端路由配置处理: 登录的路由配置 作用:把oAuth2.0颁发的token存储到redis中 package com.powernode.config;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;…

12 注册登录

12 注册登录 整体概述 使用数据库连接池实现服务器访问数据库的功能,使用POST请求完成注册和登录的校验工作。 本文内容 介绍同步实现注册登录功能,具体涉及到流程图、载入数据库表、提取用户名和密码、注册登录流程与页面跳转的代码实现。 流程图&a…

【vue】vue中的插槽以及使用方法

插槽 普通插槽 1、在父组件中直接调用子组件的标签&#xff0c;是可以渲染出子组件的内容&#xff1b;如果在子组件标签中添加了内容&#xff0c;父组件就渲染不出来了&#xff1b; ParentComponent.vue&#xff1a; <template><div><h1>Parent Componen…

常见分辨率时序信息

分辨率列表 分辨率一:640x480(逐行) 分辨率二:800x600(逐行) 分辨率三:1024x768(逐行) 分辨率四:大名鼎鼎720P(逐行) 注:选择720P@30帧的,需拉长HOR TOTAL TIME 分辨率五:1280x800(逐行) 分辨率六:1280x960(逐行

AWS——04篇(AWS之Amazon S3(云中可扩展存储)-02——EC2访问S3存储桶)

AWS——04篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-02——EC2访问S3存储桶&#xff09; 1. 前言2. 创建EC2实例 S3存储桶3. 创建IAM角色4. 修改EC2的IAM 角色5. 连接EC2查看效果5.1 连接EC25.2 简单测试5.2.1 查看桶内存储情况5.2.2 复制本地文件…

DIP: Spectral Bias of DIP 频谱偏置解释DIP

On Measuring and Controlling the Spectral Bias of the Deep Image Prior 文章目录 On Measuring and Controlling the Spectral Bias of the Deep Image Prior1. 方法原理1.1 动机1.2 相关概念1.3 方法原理频带一致度量与网络退化谱偏移和网络结构的关系Lipschitz-controlle…

GrapeCity Documents for PDF (GcPdf) 6.2 Crack

GrapeCity PDF 文档 (GcPdf) 改进了对由 GcPdf 以外的软件生成的现有 PDF 文档的处理 在新的 v6.2 版本中&#xff0c;GcPdf 增强了 PDF 文档的加载和保存&#xff0c;并提供以下优势&#xff1a; GcPdf 现在可以加载和保存可能不严格符合 PDF 规范的 PDF 文档。GcPdf 现在将…

Stable Diffusion + Deform制作指南

1.安装sd以及deform插件,更新后记得重启 需要安装ffmpeg https://ffmpeg.org/download.html 选择对应版本然后安装 如果是windows需要解压后将ffmpeg的bin目录配置在电脑的环境变量里面。 2.准备一张初始开始图片 3.填写参数,这里面参数要注意,宽高一定是32的倍数。如果填写…

【图像分类】理论篇 (4)图像增强opencv实现

随机旋转 随机旋转是一种图像增强技术&#xff0c;它通过将图像以随机角度进行旋转来增加数据的多样性&#xff0c;从而帮助改善模型的鲁棒性和泛化能力。这在训练深度学习模型时尤其有用&#xff0c;可以使模型更好地适应各种角度的输入。 原图像&#xff1a; 旋转后的图像&…

恒运资本:CPO概念发力走高,兆龙互联涨超10%,华是科技再创新高

CPO概念15日盘中发力走高&#xff0c;截至发稿&#xff0c;华是科技涨超15%再创新高&#xff0c;兆龙互联涨逾11%&#xff0c;中贝通讯涨停&#xff0c;永鼎股份、太辰光涨超5%&#xff0c;天孚通讯涨逾4%。 消息面上&#xff0c;光通讯闻名咨询机构LightCounting近日发布的202…

【LeetCode】《LeetCode 101》第十一章:妙用数据结构

文章目录 11.1 C STL11.2 数组448. 找到所有数组中消失的数字&#xff08;简单&#xff09;48. 旋转图像&#xff08;中等&#xff09;74. 搜索二维矩阵&#xff08;中等&#xff09;240. 搜索二维矩阵 II&#xff08;中等&#xff09;769. 最多能完成排序的块&#xff08;中等…

ChatGPT or BingChat

你相信我们对大模型也存在「迷信权威」吗&#xff1f; ChatGPT 的 GPT-4 名声在外&#xff0c;我们就不自觉地更相信它&#xff0c;优先使用它。但我用 ChatALL 比较 AI 大模型们这么久&#xff0c;得到的结论是&#xff1a; ChatGPT GPT-4 在大多数情况下确实是最强&#xf…

Element组件浅尝辄止4:Button组件

Button按钮组件&#xff1a;用途太广泛了&#xff0c;几乎参与到了日常开发中的方方面面 1.如何使用&#xff1f;How? //使用type、plain、round和circle属性来定义 Button 的样式。<el-row><el-button>默认按钮</el-button><el-button type"primar…

阿里云ACP知识点

前言&#xff1a;记录ACP错题 1、在创建阿里云ECS时&#xff0c;每台服务器必须要包含_______用来存储操作系统和核心配置。 系统盘&#xff08;不是实例&#xff0c;实例是一个虚拟的计算环境&#xff0c;由CPU、内存、系统盘和运行的操作系统组成&#xff1b;ESC实例作为云…

【RabbitMQ与SpringBoot集成测试收发消息】

【RabbitMQ与SpringBoot集成测试收发消息】 一、环境说明二、实验步骤三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本&#xff1a;rabbitmq-server-3.8.8-1.el7.noarch.rpm编程工具Idea 运行JDK为17 二、实验步骤 在Rab…

九州未来参与编制的开源领域3项团体标准获批发布

日前&#xff0c;中电标2023年第21号团体标准公告正式发布&#xff0c;其中由九州未来参与编制的3项开源领域团体标准正式获批发布&#xff0c;于2023年8月1日正式实施。 具体内容如下&#xff1a; 《T/CESA 1269-2023 信息技术 开源 术语与综述》&#xff0c;本文件界定了信息…

AWK +iptables+shell实战脚本案例

目录 一、在Centos下安装httpd 查看安装是否成功 重启httpd 查看80端口是否开放 在主机上查询 查看防火墙 在浏览器中查询主机IP地址 查看日志是否生成 二、AWK iptablesshell实战脚本案例 1、封堵扫描器 (1) 开始扫描器 特别注意&#xff1a;在Vim中尽量不要使用空格…

python_PyQt5运行股票研究python方法工具V1.2_增加折线图控件

承接【python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件】 地址&#xff1a;python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件_程序猿与金融与科技的博客-CSDN博客 目录 结果展示&#xff1a; 代码&#xff1a; 示例py文件代码&#xff08;低位股…

ubuntu 安装 cuda

ubuntu 安装 cuda 初环境与设备在官网找安装方式 本篇文章将介绍ubuntu 安装 CUDA Toolkit CUDA Toolkit 是由 NVIDIA&#xff08;英伟达&#xff09;公司开发的一个软件工具包&#xff0c;用于支持并优化 GPU&#xff08;图形处理器&#xff09;上的并行计算和高性能计算。它…

mysql的安装

首先双击mysql的安装包 双击安装包之后就会出现下面这种情况&#xff1b; 然后就会出现下面这个页面 选择developer default开发者模式&#xff0c;然后点击next 然后再点击next 再点击yes 点击excute&#xff0c;点击完之后需要稍等几分钟才能完成 上一步安装好之后点击n…