美团 Flink 资源调度优化实践

摘要:本文整理自美团数据平台计算引擎组工程师冯斐,在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分:

  1. 相关背景和问题
  2. 解决思路分析
  3. 资源调度优化实践
  4. 后续规划

点击查看原文视频 & 演讲PPT

一、相关背景和问题

1

在计算规模方面,目前我们有 7w 多作业,部署在 1.7w 台机器上,高峰期流量达到每秒 9 亿条。在部署方式上,目前我们主要还是在 Yarn 上使用 Session 模式部署作业。

2

大量的作业和机器也带来很多资源相关的问题,我们把问题分成两类。一类是硬件问题,比如磁盘故障、机器宕机、内存故障导致的机器卡顿等等。另一类是软件问题,包括磁盘 IO 被打满、作业间相互竞争影响等等。这两类问题,都会影响作业的部署和运行。

3

对于作业部署,最典型的问题就是,资源被调度到宕机节点,导致资源不能及时就绪,作业至少需要 5 分钟才能完成启动;或者调度到慢节点,导致 TM 启动耗时很长,作业启动慢。

4

对于作业运行,如果机器有问题,可能会导致这个机器上的作业处理慢,导致个别分区有消费延迟,甚至产生反压。

二、解决思路分析

5

如何解决这些问题?先看下问题的来源,异常的节点分成两类。

  • 故障节点。通常是这个节点上出现了严重的故障,无法继续使用。比如磁盘损坏、机器宕机。

  • 慢节点。虽然机器可用,但存在性能问题。例如网卡降速,导致作业处理能力下降;或者这个节点上有很多高负载作业。

6

当前,Flink 和 Yarn 都有一定机制来处理异常资源,但是也有缺陷不足。

首先,Flink 的心跳机制只能作为一个兜底机制。它无法感知节点的健康和负载情况。然后,Yarn 有心跳和健康检查两种机制。心跳检查的问题在于,超时时间过长。它需要 5 分钟才能感知到机器失联,这期间 Yarn 会认为机器正常可用。健康检查的问题是,感知机器故障的耗时达到分钟级别,而且不能发现所有的机器故障问题。

7

因此,我们希望通过加强 Flink 应对异常节点的能力,来保障资源能够健康及时地就绪。

首先,对于重启后遭遇其他故障节点的作业。我们通过复用 Session 集群资源的思路进行规避。这样不仅可以规避新的故障节点,而且能加快作业重新部署。其次,对于作业自动重启的场景。一个简单有效的思路就是冗余申请,通过申请过量资源的方式,使作业所需的资源全部就绪,从而规避节点故障导致的资源就绪慢或者无法就绪的问题。这需要用户的队列有足够的资源余量。

如果没有足够资源余量的队列,我们的思路是采用黑名单。当系统识别出异常节点后,进行规避。期望用这个思路来解决普遍的机器故障或者机器慢的问题。

三、资源调度优化实践

3.1 资源冗余申请

8

冗余申请和黑名单机制。首先介绍下资源冗余申请。我们在 Scheduler 中新增了一个 RedundantSlotAllocator 组件,负责发起冗余资源的申请。当作业完成调度后,我们会释放冗余的资源,这里主要复用了现有的清理空闲资源的能力。

9

下面介绍下冗余申请策略。首先需要要考虑的问题是,如何保障冗余申请是有效的?我们需要额外申请多少个冗余 container,才能确保能规避故障节点?

我们抽象了机器故障后的调度过程,得出如上图所示的模型。这个公式的含义是:加上冗余申请后,实际会就绪的 TM 数量,要大于等于作业部署所需的 TM 数量。化简后,可以得出,一个作业应该冗余的 TM 数量,要大于或等于作业的总 TM 数量除以队列机器数乘以机器数减一。

这个公式虽然简单,但也有一些前提。首先,队列中同一时间只有 1 个机器故障。其次,调度策略要保障调度均匀。

10

在冗余策略里,第二个问题就是,能否尽可能的节省资源?因为资源常驻式的冗余,虽然能最带来最快的资源就绪时效,但资源放着不用,是比较浪费的。

最终选择在作业部署或重启时,防御性的发起冗余资源申请,保障作业所需的资源,能够正常按时就绪。当作业部署或重启完成后,及时释放冗余申请的资源。通过这样的策略,我们在资源就绪时效性和资源成本中,取得平衡。

11

当冗余申请上线后,效果非常明显。SLA 作业的 tp99 的资源申请耗时从 30s 降到了 15s,tp9999 的耗时从 300s 降到了 20s。由此可见,资源就绪耗时被控制在正常范围内。

3.2 黑名单机制

12

黑名单机制分为感知和处理两部分。在感知部分,需要快速准确,它是黑名单机制有效的前提。在处理部分,需要灵活有效,从而应对各种类型的异常。

13

在设计黑名单时,看到社区和业界都有相关的思考和实践。因此,我们也进行了相关调研。

社区黑名单,主要用于在批计算推测执行中,规避慢节点。业界的黑名单机制,主要用于在实时作业调度过程中,规避故障节点。社区黑名单,通过对比任务执行耗时,来发现慢节点。业界黑名单,主要通过异常的次数累计,来识别节点故障。由此可见,社区和业界利用不同策略解决不同场景的问题。

14

接下来,介绍下美团的黑名单。如上图所示,左侧是黑名单的感知部分。我们收集作业运行或调度过程中的异常事件和运行指标。然后,根据一些策略识别出慢节点和故障节点。我们从应用层的视角感知异常,不需要明确完整的原因,也能快速准确的发现异常节点。

右侧是黑名单的处理部分,我们通过维护一个外围的黑名单服务,统一接受上一步识别出的异常节点,并把它们发送给资源管理服务或 Flink 作业来处理。我们从资源管理的视角出发,简化处理流程,支持流批两种执行模式、支持不同的资源管理服务。

3.3 故障节点感知策略

15

在前篇提到,我们需要快速准确的发现故障节点,那我们是怎么做到的呢?通常如果机器有问题,这个机器上的作业都可能受影响。如果多个作业的异常,来自同一个节点,那我们有理由相信这个节点有问题。

基于上述思路,我们通过 track-service 收集所有作业的异常信息。然后,用一个 Flink 作业判断,是否在同一时间的某个节点上,多个作业都有异常。如果有这样的节点,我们就把它发送给黑名单服务来处理。相比单个作业积累多次异常,这种方式能更快更准的发现故障节点。

3.4 异常节点处理机制

16

上图所示,这里罗列了一些我们主要关注的异常。在启动时,我们关注 JM 和 TM 的启动是否成功、是否及时。在运行过程中,我们关注 TM-JM 间的心跳超时异常、TM 被 Kill 的异常、Task 运行异常。通过聚合这些异常信息,我们就能找出哪些节点有异常。

17

如何有效处理不同类型的异常节点。目前,我们支持两种处理方式。即可以让 TM 立即从异常节点上退出,也可以先运行,等下次 restart 时,再退出异常节点。在处理粒度方面,既支持处理单个作业,也可以直接处理整个节点。

18

Flink 和 Yarn 如何处理异常节点?在 Flink 内部,我们新增一个组件 Unhealthy Node Manager,负责对异常节点的管理。

这个组件定义在 Flink 的资源管理层,与上层任务调度的逻辑解耦。这样可以支持流和批两种执行模式,而且不依赖作业的调度状态。

对于下层物理资源管理,通过抽象核心接口,可以适配不同的资源管理服务。除此之外,通过提供对外交互的 API,可以跟外部系统联动。

19

在 Yarn 侧,我们在原有健康检查的基础上,新增了 FREEZE 状态,表示节点不再接受调度,但也不 Kill 正在运行的 container。与此同时,我们打通了 Yarn 的健康检查机制,因为一些人力和成本的原因,我们使用了基于 zk 的共享存储,黑名单服务发布异常节点信息,Yarn 监听并完成异常节点的处理。

3.5 规避慢节点场景

20

接下来,介绍下规避慢节点场景。我们对部分并发慢,产生慢节点的原因进行了分类。

数据倾斜、逻辑倾斜都是业务侧的问题,引擎无法控制和应对。但资源不均是黑名单可以应对的。应对这种原因的慢节点,核心是如何感知慢节点。因为它们感知后的处理能力是相同的。

21

慢节点判定策略。首先,观察某个作业是否有部分并发的吞吐,明显高于其他并发。如果有,说明存在数据倾斜。如果没有,继续查看是否有部分并发的 processTime,比其他并发高。其中,processTime 是我们新增的单条消息处理耗时指标。

如果 processTime 比其他并发高,我们需要判断是逻辑倾斜,还是存在慢节点。如果某个 TM 里存在消费慢的 task,那么这个节点的慢节点票数+1。如果一个机器上,超过一半的 TM 都认为该节点慢。那我们会认为消费慢的原因是,遭遇慢节点,这个节点会被发送给黑名单服务处理。

3.6 其他优化

22

除了基于多作业的感知处理,一些明确异常可以直接闭环在引擎内部感知处理,提升处理时效。例如磁盘故障,是有明确特征的,不存在误判。这种可以直接在引擎内部完成感知和拉黑处理。

23

黑名单机制上线后,也有效解决了很多问题。首先是,应对故障节点。当节点出现磁盘故障时,作业的 restart 次数从之前的 10 多次降低到了 1 次。对于节点宕机的情况,我们可以在 10s 内发现和规避宕机的节点,作业 restart 的耗时从之前的 5 分钟降低至正常水平。

在慢节点场景里,对于运行在慢节点上的 TM,黑名单使其在健康节点重新启动后,作业消费吞吐可恢复正常。

四、后续规划

24

在资源和调度方向,后续的建设重点有两方面。

  • 坚持稳定性建设。我们期望通过动态扩容机制,来减小流量突增场景下的作业运维带来的断流时长。
  • 优化资源效率。我们期望通过对资源合理的缩容和分配,来提升单作业和集群整体的资源利用效率,减少资源浪费。

点击查看原文视频 & 演讲PPT

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

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

相关文章

Java eight 解读流(Stream)、文件(File)、IO和异常处理的使用方法

目录 Java 流(Stream)、文件(File)和IO读取控制台输入读写文件FileInputStreamFileOutputStream Java目录 Java 异常处理 Java 流(Stream)、文件(File)和IO java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种…

Go操作各大消息队列教程(RabbitMQ、Kafka)

Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多,比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker:表示消息队列服务实体Virtual Host&#x…

Java生成二维码(前后端分离项目实战)

📍 本文代码已放置 github:Mr-Write/SpringbootDemo: 各种demo案例 (github.com) 文章目录 1.ZXing1.1 概念1.2 ZXing 相关依赖1.3 zxing常用API🍀 EncodeHintType(编码提示类型)🍀 MultiFormatWriter&…

Android Activity启动过程一:从Intent到Activity创建

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…

财务数据分析?奥威BI数据可视化工具很擅长

BI数据可视化工具通常是可以用户各行各业,用于不同主题的数据可视化分析,但面对财务数据分析这块难啃的骨头,能够好好地完成的,还真不多。接下来要介绍的这款BI数据可视化工具不仅拥有内存行列计算模型这样的智能财务指标计算功能…

我们的第一个 Qt 窗口程序

Qt 入门实战教程(目录) Windows Qt 5.12.10下载与安装 为何使用Qt Creator开发QT 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境,也不需要你再在Visual St…

精准高效农业作业,植保无人机显身手

中国作为农业大国,拥有约18亿亩的农田,每年都需要进行种子喷洒和农药施用等农业作业,对于普通农户来说,这是一项耗时耗力的工程,同时,人工喷洒农药极易造成农药慢性中毒,对农民的身体健康产生极…

摄像头的调用和视频识别

CV_tutorial3 摄像头调用实时播放保存视频 运动目标识别帧差法背景减除法 摄像头调用 创建视频捕捉对象:cv2.VideoCapture() 参数为视频设备的索引号,就一个摄像投的话写0默认; 或者是指定要读取视频的路径。 实时播放 import cv2 import …

基于亚马逊云科技无服务器服务快速搭建电商平台——部署篇

受疫情影响消费者习惯发生改变,刺激了全球电商行业的快速发展。除了依托第三方电商平台将产品销售给消费者之外,企业通过品牌官网或者自有电商平台销售商品也是近几年电商领域快速发展的商业模式。独立站电商模式可以进行多方面、全渠道的互联网市场拓展…

clickhouse 系列2:clickhouse 离线安装

1.下载rpm包 Altinity/clickhouse - Packages packagecloud 使用wget下载到本地目录 wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm/download.rpm wget

如何通过四个步骤清理网络防火墙规则

组织必须确保适当的安全策略到位,以保护其投资并优化其安全有效性。然而,随着网络的扩展和复杂性的增加,网络运营团队面临着管理来自多个供应商的大量防火墙和网络设备的挑战。他们必须解决分散的基础设施、职能孤岛、人员配置问题、分散的管…

强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品

2023 RISC-V中国峰会于8月23日至25日在北京召开,峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本次大会邀请了RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇,吸引超过百余家业界企业、高…

指针(个人学习笔记黑马学习)

1、指针的定义和使用 #include <iostream> using namespace std;int main() {int a 10;int* p;p &a;cout << "a的地址为&#xff1a;" << &a << endl;cout << "a的地址为&#xff1a;" << p << endl;…

Doris数据库BE——rowset版本追踪

rowset代码位置be/src/olap/version_graph.cpp&#xff0c;字面意思行集合&#xff0c;由一行或多行组成。rowset版本简单理解为rowset编号&#xff0c;每次导入生成一个rowset&#xff0c;比如insert执行10次会生成10个rowset&#xff0c;一次streamload生成一个rowset。 版本…

Mac OS 13.4.1 搜狗输入法导致的卡顿问题

一、Mac OS 系统版本 搜狗输入法已经更新到最新 二、解决方案 解决方案一 在我的电脑上面需要关闭 VSCode 和 Chrmoe 以后&#xff0c;搜狗输入法回复正常。 解决方案二 强制重启一下搜狗输入法。 可以用 unix 定时任务去隔 2个小时自动 kill 掉一次进程 # kill 掉 mac …

【JS案例】JS实现手风琴效果

JS案例手风琴 &#x1f31f;效果展示 &#x1f31f;HTML结构 &#x1f31f;CSS样式 &#x1f31f;实现思路 &#x1f31f;具体实现 1.绑定事件 2.自定义元素属性 3.切换菜单 &#x1f31f;完整JS代码 &#x1f31f;写在最后 &#x1f31f;效果展示 &#x1f31f;HTML…

excel功能区(ribbonx)编程笔记--2 button控件与checkbox控件

我们上一章简单先了解了ribbonx的基本内容,以及使用举例实现自己修改ribbox的内容,本章紧接上一章,先讲解一下ribbonx的button控件。 在功能区的按钮中,可以使用内置图像或提供自已的图像,可以指定大按钮或者更小的形式,添加少量的代码甚至可以同时提供标签。此外,可以利…

C++ 多线程编程

C 多线程编程 点击获取更多的C学习笔记 1. 线程库的基本使用 创建线程 要创建线程&#xff0c;我们需要一个可调用的函数或函数对象&#xff0c;作为线程的入口点。在C11中&#xff0c;我们可以使用函数指针、函数对象或lambda表达式来实现。创建线程的基本语法如下&#x…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Apache Hive示例(6)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿

近期换了工作电脑&#xff0c;公司的IT团队不够给力&#xff0c;不能复制电脑系统&#xff0c;所以又到了需要重装IDE配置开发环境的时候了&#xff1b;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题&#xff0c;这里整理下解决方法以备不时之需&#xff1b; …