天天看点

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

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

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

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

一、AutoPilot简介

1.AutoPilot解决的难题

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

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

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

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

如何使用 AutoPilot 对作业自动调优?
  • 第二、作业资源利用率低、执行资源成本高的问题。

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

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

2.AutoPilot的系统架构

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

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

目前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内存的大小来解决这种资源的异常,保证作业处于稳定的状态。
如何使用 AutoPilot 对作业自动调优?

■ 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。

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

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

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

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

2.如何查看AutoPilot运行状态

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

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

3.如何查看AutoPilot历史信息

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

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

三、如何选择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 策略。这样对作业并发度的调优效果会更好,整个算法的收敛的速度会更快。

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

四、AutoPilot使用注意事项

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

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

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

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

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

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