全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

Flink作业自动伸缩

最近更新时间:2026-04-29 16:10:08

KMR on KCE 的 Flink 作业提供了自动伸缩(Autoscaler)功能,通过实时监控算子的利用率、反压及积压量,结合原地扩缩容(In-place Scaling)技术动态调整并行度。该功能有效解决了 Flink 作业上线初期需耗费大量时间压测预估资源的难题,同时也缓解了运行过程中因流量波动导致的“人工调参滞后”积压及“重启代价过高”带来的业务断流等核心痛点。

本文为您介绍如何配置自动伸缩模式,以及配置过程中的注意事项。


注意事项

  1. 状态依赖:仅在作业处于运行中状态时生效。

  2. 提交方式:目前仅支持通过控制台或 OpenAPI 提交的任务,暂不支持 YAML 编排提交。

  3. 资源保障:建议将开启自动伸缩的作业部署在具备 弹性伸缩能力 的节点池中。如果 K8s 物理资源枯竭,无法进行扩容,无法缓解积压。

操作步骤

1. 开启自动伸缩

  1. 登录KMR on KCE控制台,选择目标集群。

  2. 点击 新建作业 或选中现有Flink 作业点击 编辑

  3. 滚动至 【自动伸缩配置】 区块:

    • 自动调优开关:切换为“开启”。

    • 执行模式

      • 原地扩缩容(推荐):系统自动计算并执行调整动作。

      • 仅收集指标:系统仅生成伸缩建议并在记录中展示,不实际改变作业状态。适用于上线初期的观察阶段。

2. 核心参数配置

参数名称

说明

推荐设置

静默时段

设定不执行伸缩的时间段。支持周/日设置。最多设置三个

设置在业务最核心波峰期

目标利用率

算子期望的繁忙率(Busy Time %)。

60%(范围10%~90%)

利用率边界

容忍的波动缓冲区。实际值超过 目标值 ± 边界 时触发调整。

20%(范围0~50%)

调整间隔时间

作业伸缩重启生效一次之后,下一次再进行调优的时间间隔。

5 分钟(范围1~60分钟)

指标收集窗口

计算决策依据的历史指标聚合时间。窗口越大越平稳,窗口越小反应越敏锐。

15 分钟(范围3~60分钟)

最大并行度

全局最大并行度。建议选择具有较多约数的数值。

720

3. 高级参数自定义

点击 <其他配置> 展开,在自定义配置中可以 Key-Value 形式增加精细化参数:

  • job.autoscaler.vertex.min-parallelism: 建议将 Source 算子设置为其对应的分区数,防止过度缩容。

  • job.autoscaler.scale-down.interval: 专门针对缩容的延迟时间(默认 1 小时),可合并多次缩容,减少波动。

  • job.autoscaler.restart.time: 预估重启耗时(如 3min),算法将依据此值计算扩容收益是否覆盖重启成本。

更多高级配置参考官方文档:Flink Autoscaler Configuration

4. 查看执行记录

系统会自动保存最近 50 条 伸缩事件,便于审计追踪。

  1. 进入 Flink作业详情页

  2. 点击 状态信息 > 【自动伸缩记录】

  3. 列表说明

    • 执行时间:动作发生的精确时间

    • 执行动作:展示是“自动扩容”、“自动缩容”还是“弹性调整”。

    • 执行结果:展示算子变化的原始记录。

常见问题

1. 扩缩容决策类

Q1: 为什么作业负载很高,但 自动伸缩 没有触发扩容?

可能原因:

  • 稳定化窗口限制:作业可能仍处于 stabilization.interval(稳定化窗口)内,系统正在观察上一次调整后的效果。

  • 利用率未达阈值:当前算子繁忙率处于 目标值 ± 边界值 范围内(例如目标 60%,边界 20%,则 40%-80% 之间不触发)。

  • 资源触顶:已达到全局 pipeline.max-parallelism 或高级参数中设置的 quota.cpu / memory 上限。

  • 指标缺失:算子未暴露 busyTimeMsPerSecond 指标(常见于自定义 Source 或旧版 API)。

排查建议:

  1. 检查日志:在 JobManager 日志中检索 ScalingReport 关键字,查看系统计算出的建议值。

  2. 验证配置:通过控制台确认“执行模式”是否为“原地扩缩容”。

  3. UI 观测:进入 Flink Web UI,确认算子(特别是 Source)的 Busy Time % 是否有数据。

Q2: 作业反复触发扩缩容,如何处理?

若作业频繁在扩容和缩容之间切换,建议优化以下参数以增强稳定性:

  • 调大指标窗口:将 metrics.window 延长(如从 15min 改为 30min),以平滑瞬时流量波动。

  • 增加缓冲区:增大 target.utilization.boundary,给予负载更多波动空间。

  • 延迟缩容:在高级配置中设置 scale-down.interval(如 1h),合并多次微小的缩容动作。

Q3: 如何选择合适的目标利用率?

请根据业务对延迟的容忍度进行选择:

  • 保守型 (0.4 - 0.6):适用于金融、计费等核心链路,预留充足资源缓冲,减少重启频率。

  • 均衡型 (0.6 - 0.7)推荐配置,兼顾资源成本与响应速度。

  • 激进型 (0.7 - 0.8):适用于非实时报表或低优先级作业,追求极高的计算资源性价比。

2. 算子与资源类

Q4: 为什么 Source 算子始终无法自动伸缩?

Autoscaler 自动调整 Source 并行度需满足以下条件:

  1. API 要求:必须使用 Flink 新版 Source API(FLIP-27)。

  2. 指标要求:连接器需支持暴露 pendingRecords(积压量)指标。

  3. 对齐分区:建议将 vertex.min-parallelism 设置为 Kafka Topic 的分区数,避免数据倾斜。

Q5: 最大并行度设置多少比较合适?

建议选择具有较多约数的数值,便于系统在扩缩容时更均匀地重新分配 KeyGroup。

  • 注意:此值一旦设定,作业运行期间不可更改。如果设置过小,将限制 Autoscaler 的扩容上限。

Q6: Autoscaler 会覆盖我手动在代码/页面里设置的并行度吗?

会。 一旦开启自动伸缩,系统会接管并行度管理。如果您需要手动干预,请先将“执行模式”切换为“仅收集指标”或关闭该功能。

3. 底层基础设施联动 (KCE/K8s)

Q7: 开启自动伸缩后,需要调整 Slot 申请超时时间吗?

需要。 在作业参数中,建议设置: "slot.request.timeout": "900000" (即 15 分钟)。 原因:当 Autoscaler 触发扩容时,底层 KCE 节点池可能需要 5~10 分钟来弹出新机器。将超时时间设为 15 分钟,可以确保 Flink 作业在等待云原生资源拉起时不会因超时而失败。

Q8: 为什么显示“执行成功”但并行度没有变化?

请确认作业的 Flink 版本:

  • Flink 1.18+:支持原生 In-place Scaling(原地扩缩容),几乎无感。

  • Flink 1.17 及以下:不支持原生原位扩展。系统会通过“作业升级(Job Upgrade)”模式重启任务来应用新并行度。如果重启过程失败,并行度将回滚至旧状态。

4. 调试与进阶运维

Q9: 如何调试 自动伸缩 的决策逻辑?
  1. 查看记录 :作业详情页的【自动伸缩记录】展示了扩缩容的具体原因。

  2. 详细日志:将 org.apache.flink.kubernetes.operator.autoscaler 的日志级别调整为 DEBUG,可以查看到系统对每一个算子处理速率的具体评估公式。

Q10: 开启自动伸缩后,节点池该如何配置?
  1. 启用弹性伸缩:确保该作业所在的 K8s 节点池已开启 CA (Cluster Autoscaler)

  2. 标签隔离:建议通过 nodeSelector 将开启自动伸缩的作业调度到专用的“弹性节点池”,避免扩缩容影响到核心静态资源池。

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈