如何使用 AutoPilot 对作业自动调优?

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
简介: 本文主要介绍如何使用 AutoPilot 对作业自动调优,解决 Flink 作业开发和运维的两大难题。

作者 | 吕文龙(龙三),阿里巴巴高级技术专家

摘要:本文由阿里巴巴高级技术专家吕文龙(龙三)分享,主要介绍如何使用 AutoPilot 对作业自动调优。内容将通过以下四个部分来介绍:

  1. AutoPilot简介
  2. AutoPilot实操演示
  3. 如何选择AutoPilot策略
  4. AutoPilot使用注意事项

一、AutoPilot简介

1.AutoPilot解决的难题

AutoPilot的主要目标是解决 Flink 作业开发和运维的两大难题。

  • 第一、作业调优难,开发和运维成本高的问题。

Flink作业通常需要很长时间运行,数据和作业的流量也会随着时间不断变化,因此作业资源也会随着时间不断变化。通常,我们需要随着时间变化对作业不断调优,才能保证作业长时间稳定运行。

Flink SQL的引入大大简化了作业的开发的难度,但是加大了作业的调优的难度。因为SQL的用户通常对底层的具体实现不了解,这就导致作业的调优难度会变大。

幻灯片04.png

  • 第二、作业资源利用率低、执行资源成本高的问题。

造成这个问题的原因是因为作业在没有动态资源优化的时候,通常都需要以最高峰时期的资源需求进行配置,在长时间运行中,非高峰时期的资源利用率就会比较低,这就会导致作业运行的成本偏高。

总体来说AutoPilot的目标是希望通过自动化的、自适应的资源调优来降低 Flink 的使用的门槛,同时降低 Flink 的使用的成本。

2.AutoPilot的系统架构

AutoPilot属于 Flink 管控服务的一部分,主要包括异常检测跟异常解决两个部分。AutoPilot异常检测主要通过实时订阅 Flink 作业的事件信息进行统计分析,识别因为资源问题导致的异常状态。当出现异常时,会触发资源自动调优来解决。AutoPilot异常解决主要通过动态更新作业资源配置的参数来实现的。作业配置参数更新后,管控服务的另外一个服务,也就是APP Manager就会自动重启 Flink 的作业,来实现最新的配置上限,从而实现作业配置的更新。

幻灯片05.png

目前AutoPilot主要支持三个功能:

  • 根据作业的实际负载动态调整作业的并发度,同时对应的调整TM的个数,这样就可以保证作业的资源随着流量的变化而变化,实现动态的调整;
  • 根据TM的内存利用率,动态调整TM的资源,这样可以保证单个TM内存的资源处于一个合理的状态;
  • 自动识别作业因为资源问题导致的异常,动态调整TM的资源,保证作业处于一个稳定的状态。

二、AutoPilot实操演示

1.如何为作业配置AutoPilot

AutoPilot支持为每个作业独立配置,可以动态更新AutoPilot的配置,不影响作业的正常运行。

AutoPilot提供了三种模式

  • 默认的Disabled模式:即AutoPilot不会进行作业状态的监控;
  • Active模式:AutoPilot启动作业状态监控,并再必要的时候自动更新作业参数配置;
  • Monitoring模式: 启动作业状态监控,在识别到作业异常时,提供配置更新建议,但是需要用户确认,手动触发更新作业配置。

AutoPilot提供了五种策略

  • Cpu-based策略:主要基于TM的CPU实际利用率来动态调整并发度,这是一个典型的弹性计算伸缩策略。当CPU利用率高的时候,说明作业比较繁忙,这时候AutoPilot就会扩大作业的并发度,来减少单个TM的负载。当CPU利用率低的时候,说明 TM比较空闲,这时候就可以反过来减少作业的并发度,来释放多余的资源;

  • Source-delay-based策略:主要根据source的delay metrics来判断是否需要进行并发度调整。这个策略目前只支持sls和datahub两种source。正在社区推进metrics标准化即FLIP-33,完成以后,这个策略会支持更多的 source;

  • Slot-utilization-based策略:主要根据task的slot利用率判断是否需要调小并发度。和CPU的利用率不同的而是,如果task里有io wait或者sleep的逻辑也会被计算在内,利用率的计算会更加准确。但这个策略依赖对source节点的利用率的统计,会依赖FLIP-27,因此也需要等到FLIP-27完全完成后才能实际生效;

  • Memory-utilization-based策略:主要基于TM实际内存的利用率以及GC metrics信息来判断是否需要调整 TM内存大小。当TM整体内存利用率低,而且没有GC严重的时候,可以调整内存的大小;当TM内存利用率已经偏高,或者说GC严重的时候,可以调大单个TM的内存,来保证上面跑的task处于比较健康的状态;

  • Job-exception-based策略:主要是自动识别因为资源异常所产生的作业的异常。当识别到这种异常的时候,AutoPilot会自动调大单个TM内存的大小来解决这种资源的异常,保证作业处于稳定的状态。

幻灯片08.png

AutoPilot的冷却时间

当AutoPilot处于Active或者Monitoring状态时,需要配置 AutoPilot的冷却时间。冷却时间是指两次rescale的最小时间间隔。因为AutoPilot触发的时候,作业需要重启,重启过程中需要进行作业状态的初始化以及预热,因此需要把这段时间排除掉,才能避免AutoPilot的策略做出错误判断。通常来说state越大,作业的初始化和预热的时间会越长,因此这时候冷却时间通常也要配的大一点才能保证AutoPilot正常的运行。

AutoPilot自定义参数

可以通过自定义的参数来个性化的控制AutoPilot的策略行为,以适配一些特殊的作业的要求。比如IO操作特别多的作业,如果开启了cpu-based,就需要把 cpu-based触发的阈值调低,这样才能适配作业实际cpu使用场景。

实操演示

针对这个提前创建好的作业,当需要对它做AutoPilot配置时,需要在作业详情页面上选择AutoPilot的tab页。默认状况AutoPilot是不会启动的,当需要启动的时候,需要在tab页上把AutoPilot的模式从disable转换成 Active或者Monitoring。

image.png

选择好模式后,需要选择所需的策略以及冷却的时间,自定义配置位置填上自定义的参数。然后保存,这样就可以开启AutoPilot, 对这个作业状态的进行监控以及资源的自动调优。

image.png

当需要关闭一个作业的AutoPilot的时候,同样也只需在配置页面,把模式切换成disable并保存就可以了,这样AutoPilot的状态又回到了未启动。无论怎样操作AutoPilot都不会影响作业的正常运行。

2.如何查看AutoPilot运行状态

当AutoPilot启动的时候,可以在自动调优的状态页面查看当前AutoPilot运行的状态。状态信息主要包含两部分:

  • 第一是最新推荐的作业配置。当AutoPilot处于Monitoring状态下面,如果有新的配置推荐产生,就会在这个页面进行展示。同时可以手动在这个页面触发配置的更新。
  • 第二是看到每个AutoPilot启动策略所监控到的作业的状态信息。这些状态信息一方面可以解释目前AutoPilot为什么要进行配置的更新,同时也可以用根据一些状态信息来辅助进行手动作业的调优或者代码的优化。

image.png

3.如何查看AutoPilot历史信息

AutoPilot在运行过程中,一旦对作业的配置进行了修改,这些修改都会被作为事件保存下来,让用户可以在后期进行AutoPilot行为的review,以及作业流量的分析。事件信息的查看,可以在“运行事件”里,将AutoPilot类型的事件过滤出来并进行查看。

幻灯片10.png

三、如何选择AutoPilot策略

1.一般场景作业

推荐大家使用默认参数,也就是cpu-based + memory-utilization-based + job-exception-base的组合策略。在这个默认策略下面,当TM的CPU利用率长期比较高的的时候就会触发并发度的调整;TM的内存的使用率偏高或者偏低的时候,就会触发单个TM的内存调整;当作业出现资源相关的异常的时候,也会及时的触发TM资源的调整。整个配置跟常见的弹性计算的自动调优配置是基本保持一样的,因此比较简单易懂。

2.高优先级、延迟敏感的作业

推荐不要开启AutoPilot的Active模式,而是使用Monitoring模式。因为这种类型的作业一旦触发AutoPilot的调优,就会导致作业重启,可能会影响业务效果。通过Monitoring模式,可以人工的定时的去review,检查是否有需要优化的配置,可以在适当的时机进行手动更新。

3.使用sls或者datahub的作业

推荐使用source-delay-based + slot-utilization-based + memory-utilization-based + job-exception-based 策略。这样对作业并发度的调优效果会更好,整个算法的收敛的速度会更快。

幻灯片12.png

四、AutoPilot使用注意事项

幻灯片14.png

首先,AutoPilot修改并发度是通过默认的并发度来实现的,因此作业代码中不能显示设置并发度,否则就无法实现动态调节。

其次,AutoPilot触发更新以后,控制台会自动重启作业,这会导致作业短暂的停止处理数据,对于抖动敏感的作业推荐使用Monitoring模式,避免对业务产生影响。

第三,是AutoPilot策略对作业的数据模型有一定假设:

  • 作业的流量需要是流量平滑变化的,不能有数据倾斜,这样可以根据当前时间之前一小段时间作业的运行统计数据来预估作业所需资源;
  • 作业的数据不能有数据倾斜,每个算子的吞吐能力会随着并发度线性扩展,这样才可以根据当前作业的吞吐能力去预估并发度调整后作业的吞吐能力,从而决定作业需要调整多少并发度;

当作业的pattern严重偏离这几个假设时,可能会存在作业异常, AutoPilot没有触发自动调整,或者说AutoPilot触发了自动的调整,但是算法可能会出现无法收敛,这时作业会持续的处于异常状态,并且不断的重启等等。此时需要关闭AutoPilot,进行手动的作业调优,才能保证作业处于健康的状态。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
运维 大数据 Apache
|
NoSQL MongoDB SQL
MongoShake最佳实践
mongoshake最佳实践,到底该怎么玩?
21769 0
|
消息中间件 存储 监控
如何修改 Kafka 消息保留时长:经验总结
如何修改 Kafka 消息保留时长:经验总结
2688 4
|
存储 分布式计算 流计算
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
本文介绍了阿里云开源大数据团队在实时计算领域的最新成果——向量化流计算引擎Flash。文章主要内容包括:Apache Flink 成为业界流计算标准、Flash 核心技术解读、性能测试数据以及在阿里巴巴集团的落地效果。Flash 是一款完全兼容 Apache Flink 的新一代流计算引擎,通过向量化技术和 C++ 实现,大幅提升了性能和成本效益。
3603 73
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
|
9月前
|
SQL 存储 消息中间件
vivo基于Paimon的湖仓一体落地实践
本文整理自vivo互联网大数据专家徐昱在Flink Forward Asia 2024的分享,基于实际案例探讨了构建现代化数据湖仓的关键决策和技术实践。内容涵盖组件选型、架构设计、离线加速、流批链路统一、消息组件替代、样本拼接、查询提速、元数据监控、数据迁移及未来展望等方面。通过这些探索,展示了如何优化性能、降低成本并提升数据处理效率,为相关领域提供了宝贵的经验和参考。
1053 3
vivo基于Paimon的湖仓一体落地实践
|
12月前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
8898 18
资料合集|Flink Forward Asia 2024 上海站
|
11月前
|
供应链 监控 数据挖掘
1688 商品详情接口系列(1688 API)
1688商品详情接口系列(1688 API)是阿里巴巴旗下批发电商平台提供的强大工具,支持开发者、商家获取商品的详细信息。通过商品基本信息、价格库存、图片和描述查询接口,用户可以精准高效地获取商品数据,涵盖电商运营、数据分析、市场调研等领域,极大提升工作效率。示例代码展示了如何使用Python调用这些接口,助力电商平台整合、价格监控、商品展示优化及库存管理等应用场景。
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
169097 12
|
机器学习/深度学习 并行计算 算法
GPU加速与代码性能优化:挖掘计算潜力的深度探索
【10月更文挑战第20天】GPU加速与代码性能优化:挖掘计算潜力的深度探索