Flink全托管已默认开启自动调优(Monitoring模式),本文为您介绍如何配置自动调优,以及配置过程中的注意事项。

背景信息

通常,您需要花费大量的时间进行作业调优。例如,新上线一个作业时,需要考虑如何配置该作业的资源、并发个数、Task Manager个数及大小等。此外,作业运行过程中,还需要考虑如何调整作业资源,使作业处于最高资源利用率;作业出现反压或延时增大的情况时,需要考虑如何调整作业配置等。

Flink全托管的自动调优功能,可以在各个算子和流作业上下游性能都达标和稳定的前提下,帮您更合理的调整作业并行度和资源配置,全局优化您的作业,解决作业吞吐量不足、全链路存在反压和资源浪费等各种性能调优问题。

使用限制

  • 自动调优不支持Session集群部署的作业。
  • 自动调优无法解决流作业性能瓶颈。
    因为调优策略对作业的处理模式是基于一定的假设的。例如,流量平滑变化、不能有数据倾斜、每个算子的吞吐能力能够随并发度的升高而线性拓展。当业务逻辑严重偏离以上假设时,作业可能会存在异常。例如:
    • 无法触发修改并发度的操作、作业不能达到正常状态和作业持续重启等。
    • 自定义标量函数UDF、自定义聚合函数UDAF或自定义表值函数UDTF性能问题。

    如果出现作业性能瓶颈,您需要将自动调优调整为Monitoring,进行手动调优。

  • 自动调优无法识别外部系统的问题。
    外部系统故障或访问变慢时,会导致作业并行度增大,加重外部系统的压力,导致外部系统雪崩。常见的外部系统问题如下:
    • 数据总线DataHub分区不足或消息队列MQ吞吐量不足。
    • Sink性能问题。
    • 云数据库RDS死锁。

    如果出现外部系统问题,您需要自行解决。

注意事项

  • 自动调优触发后需要重启作业,因此会导致作业短暂停止处理数据。
  • 连续两次自动调优触发间隔为10分钟,您可以通过cooldown.minutes参数来调节触发自动调优的时间间隔。
  • 如果您使用了DataStream API或Table API接口编写作业,请确认作业代码中未配置作业并行度,否则自动调优将无法调整作业资源,即自动调优配置无法生效。

默认调优行为

系统默认从并发度和内存两个方面为您进行自动调优:
  • 自动调优会调整作业的并发度来满足作业流量变化所需要的吞吐。自动调优会监控消费源头数据的延迟变化情况、TaskManager(TM) CPU实际使用率和各个算子处理数据能力来调整作业的并发度。详情如下:
    • 作业延迟Delay指标正常(不超过60s),不主动调高作业的并发度。
    • 作业延迟Delay指标超过默认阈值60s,分以下两种情况来调整并发度:
      • 延迟正在下降,不进行并发度调整。
      • 延迟增加并且连续上升3分钟(默认值), 调整作业并发度到当前实际TPS的两倍处理能力,但不超过设置最大的资源(默认值为64 CU)。
    • 作业不存在延迟指标。
      • 作业某Vertex节点连续6分钟实际处理数据时间占比超过80%,调大作业并发度使得slot-utilization值降低到50%,但不超过设置最大的资源(默认为64 CU)。
      • 所有TM的平均利用率连续6分钟超过80%,调高并发度使TM的CPU利用率降低到50%。
    • 所有TM的最大CPU利用率连续24小时低于20%,Vertex的实际处理数据时间低于20%时,调低作业的并发度使CPU和Vertex实际处理的时间占比提高到50%。
  • 自动调优也会监控作业的内存使用和Failover情况,来调整作业的内存配置。详情如下:
    • 在JobManager GC频繁或者发生OOM异常时,会调高JM的内存,默认最大调整到16 GiB。
    • 在TM GC频繁或者发生OOM异常、HeartBeartTimout异常时,会调高TM的内存,默认最大调整到16 GiB。
    • 在TM内存使用率超过95%时,会调大TM的内存。
    • 在TM的实际内存使用率连续24小时低于30%时,降低TM内存的配置。

配置自动调优

  1. 进入作业运维界面。
    1. 登录实时计算管理控制台
    2. Flink全托管页签,单击目标工作空间操作列下的控制台
    3. 在左侧导航栏上,选择应用 > 作业运维
  2. 配置自动调优。
    1. 单击目标作业名称。
    2. 单击自动调优页签。
    3. 单击配置页签。
    4. 默认已开启自动调优功能(Monitoring模式),您可以选择关闭或者以Active自动启动的方式使配置生效。
      • Monitoring(默认值)
        开启自动调优功能,系统会根据您选择的调优策略,给出该作业推荐的调优配置,需要您手动进行配置生效。您可以采取以下任意一种生效方式:
        • 配置页签,将模式调整为Active
        • 状态页签,根据提示信息下进行操作:
          • 如果有启用建议配置按钮,单击后会自动重启让配置生效。启用建议配置
          • 如果没有启用建议配置按钮,则需要您根据提示信息在作业开发页面高级配置中,手动修改对应的配置后,上线重启作业。无按钮
      • Active

        开启自动调优功能,系统会根据您选择的调优策略,给出该作业推荐的调优配置,并自动启动作业使配置生效,您无需操作。

      • Disabled

        不开启自动调优功能。

    5. 可选:选择MonitoringActive模式后,填写自定义配置信息。
      配置项 配置含义 默认值
      cooldown.minutes 冷却时间是指作业被自动调优两次自动启动之间的最小时间间隔。 10分钟
      resources.cu.max 使用的最大资源限制。 64 CU
      parallelism.scale-up.interval 调大并发度时最小触发时间间隔。 6分钟
      parallelism.scale-down.interval 调低并发度时最小触发时间间隔。 24小时
      mem.scale-down.interval 调低内存时最小触发时间间隔。 24小时
      parallelism.scale.max 并发度向上调整时,最大并发限制。 -1,表示最大并发没有限制。
      parallelism.scale.min 并发度向下调整时,最小并发限制。 1,表示最小并发为1。
      delay-detector.scale-up.threshold 可以容忍的最大延迟阈值。 1分钟
      slot-usage-detector.scale-up.threshold 当Vertex处理数据时间占比大于该值时,触发调大并发度的操作。 0.8
      slot-usage-detector.scale-down.threshold 当Vertex处理数据时间占比大于该值时,触发调小并发度的操作。 0.2
      tm-cpu-usage-detector.scale-up.threshold 调大并发度时CPU使用率阈值。 0.8
      tm-cpu-usage-detector.scale-down.threshold 调小并发度时CPU使用率阈值。 0.2
      resources.memory-scale-up.max 调整单个Task Manager和Job Manager的内存时,能调整到的最大值。 16 GiB
  3. 单击保存

VVP 2.5.x和VVP 2.4.x配置项映射关系

VVP 2.5.x的配置项和VVP 2.4.x版本的大部分配置参数项兼容,配置项映射关系详情如下表所示。
VVP 2.4.x VVP 2.5.x
cpu-based.scale-up.threshold tm-cpu-usage-detector.scale-up.threshold
cpu-based.scale-down.threshold tm-cpu-usage-detector.scale-down.threshold
cpu-based.scale-up.window-size.min tm-cpu-usage-detector.scale-up.sample-interval
cpu-based.scale-down.window-size.min tm-cpu-usage-detector.scale-down.sample-interval
source-delay-based.threshold delay-detector.scale-up.threshold
source-delay-based.scale-up.window-size.min delay-detector.scale-up.sample-interval
slot-utilization-based.threshold slot-usage-detector.scale-down.threshold
slot-utilization-based.scale-down.window-size.min slot-usage-detector.scale-down.sample-interval
slot-usage-detector.scale-up.threshold slot-usage-detector.scale-up.threshold
slot-usage-detector.scale-up.sample-interval slot-usage-detector.scale-up.sample-interval
memory-utilization-based.memory-usage-max.threshold tm-memory-usage-detector.scale-up.threshold
memory-utilization-based.memory-usage-min.threshold tm-memory-usage-detector.scale-down.threshold
memory-utilization-based.memory-usage.target-utilization memory-utilization-based.memory-usage.target-utilization
memory-utilization-based.scale-up.window-size.min 不支持
memory-utilization-based.scale-down.window-size.min tm-memory-usage-detector.scale-down.sample-interval
memory-utilization-based.gc-ratio.threshold 不支持
memory-utilization-based.gc-time-longest-ms.threshold 不支持
memory-utilization-based.gc-time-ms-per-second.threshold jm-gc-detector.gc-time-ms-per-second.threshold

tm-gc-detector.gc-time-ms-per-second.threshold

memory-utilization-based.memory-scale-up.max 不支持
memory-utilization-based.memory-scale-up.ratio memory-utilization-based.memory-scale-up.ratio
job-exception-based.oom-exception.memory-scale-up.ratio job-exception-based.oom-exception.memory-scale-up.ratio
job-exception-based.oom-exception.memory-scale-up.max 不支持
job-exception-based.oom-exception.include-tm-timeout 不支持