文章大纲:
一、背景
二、技术方案
-
2.1 整体架构 -
2.2 方案详述:
1.纵向伸缩:
2.横向伸缩
三、方案实践及效果
-
3.1 弹性伸缩
-
3.2 自动诊断
四、后续规划
-
资源初始固定。任务需要在提交之前明确资源用量且作业运行过程中不会自动调整 -
任务常驻。由于数据源多为无界流式数据。一旦有新的流数据进入任务,它会立刻发起并进行一次计算任务,因此整个过程是持续进行的; -
负载呈周期性变化。实时作业流量和负载会随着时间的变化出现明显的波峰波谷
-
调优困难。通常,用户需要花费大量的时间进行作业调优。例如,新上线一个作业,需要考虑如何配置该作业的资源、并发数、TaskManager个数及大小等 -
资源用量无法匹配负载的变化。由于实时作业的负载往往随着流量的变化而变化,初始设置的资源量容易过多或太少,从而造成资源浪费或者资源不足而导致作业延时。而解决这个问题用户往往需要手动重启作业再次设置资源用量,而这种操作繁琐的同时也是滞后的
-
SmartResource负责根据作业上报的指标、用户自定义的监控规则、全链路诊断规则来判断当前作业的运行的健康度,作业是否需要伸缩均源于此。 -
Flink 计算框架使用自研自适应调度器RescaleMonitor,自动感知资源的变化,动态改变算子的并行度,并重新调度作业。
整体流程如下:
-
用户配置自定义的伸缩策略到 SmartResource
-
SmartResource 将相关的策略转化为告警规则并配置到云监控上
-
云监控的数据来自 Flink 集群上报的作业相关的各种指标
-
云监控触发告警时回调指定的 SmartResource 接口,SR 根据告警信息,在任务链路打上优化建议Tag;此外,需要调整资源的,结合用户配置的伸缩规则自动计算需要伸缩的副本数,并告知后端服务
-
后端服务收到伸缩请求后,再次将此请求在诊断联调上应用一遍来确认是否是个有效的请求,如果是会在数据库中存储一个状态为 pending 的伸缩请求
-
当作业的 Checkpoint 完成后,会通知 ostream backend 然后开始执行Flink计算资源的伸缩
-
当 TaskManager增减的时候 JobManager 以及已经申请的 TaskManager不能丢失,也就是怎么保持已申请的资源? -
当 TaskManager增减的时候 JobManager 要快速感知新增的 slot,也就是如何感知资源变化并快速调度Job?
云原生一键部署; 自动推断资源参数; 自研KSA Resourcemanager管理已申请资源; 与现有管理平台无缝集成 通过k8s的watch机制自动追踪资源状态;
-
快速部署。只要有外部资源增加的时候,RescaleMonitor会判断是否满足调度作业的最小资源,如果满足就会立刻部署 jobgraph,不满足会一直等待。 -
快速失败。当有外部资源减少的时候,依赖于Kubernetes的watch机制可以快速感知资源的变化,无需等待资源超时。此处我们以pod名字作为Resource ID,可以在内部快速定位资源建立连接,进而执行各种操作。 -
安全恢复。当有外部资源增减的时候不会立即执行,Pending下来等待checkpoint完成的时候会检查是否存在资源增减的Request,如果由才会立即执行重新部署JobGrap并从当前完成的checkpoint恢复,这样在保证作业不丢的情况下,尽量减少重复消费数据的可能。 -
可固定并发。支持固定某些算子的最大并发,这在作业类似是消费 kafka 的时候特别有用。 -
UI联动。当资源变化的时候会实时通知web前端实时显示最新的资源用量。
弹性伸缩效果图如下,通过途中可以看出,作业在cpu利用率低时,自动降低的并发。
我们记录了每次伸缩的事件,包括时间、触发原因,伸缩前后的资源等,方便平台跟用户跟踪资源的变化和排查问题。
通过我们的智能诊断服务可以自动优化整个作业的资源配比,在不重启作业的情况下完成TM的动态调整。
优化后的效果如下
-
batch任务的自适应调度 -
基于机器学习的自动化诊断 -
流批一体的错峰调度
附录
-
https://nightlies.apache.org/flink/flink-docs-master/zh/docs/deployment/elastic_scaling/
-
https://cwiki.apache.org/confluence/display/FLINK/FLIP-159%3A+Reactive+Mode
-
https://cwiki.apache.org/confluence/display/FLINK/FLIP-160%3A+Adaptive+Scheduler
-
https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/
作者简介
John,OPPO实时计算平台高级研发工程师,Apache Flink Contributor,长期专注于大数据计算领域。
本文转载自 OPPO数智技术,原文链接:https://mp.weixin.qq.com/s/RTuz8mZPHB4KT44GwnM8Sw。