在实时计算领域,数据流永不停歇,业务决策刻不容缓。然而,传统的 Flink 任务运维模式——“停止-修改-重启”——正日益成为业务连续性的瓶颈。当需要调整任务并行度、修改 SQL 逻辑或更新配置参数时,这一流程不仅会导致数据处理中断,还可能因集群重启耗时过长而错失关键的业务时机。
典型业务场景:大促期间的实时风控
某电商平台在大促期间,实时风控系统需应对激增的交易流量。原定并行度为 50,但高峰期系统出现处理延迟,风险告警。若采用传统方式调整并行度:
总计 11 分钟的停机时间,意味着数以万计的风险交易可能无法被实时拦截,造成不可估量的损失。这暴露了传统运维模式在敏捷性和业务连续性上的严重不足。
为了解决这一痛点,袋鼠云实时计算平台深入 Flink 内核,创新性地提出了“热更新”技术方案,旨在实现任务参数的动态调整和逻辑的快速迭代,将运维操作对业务的影响降至最低。
实时计算平台目前支持对以下两类关键参数进行零停机更新:
all 切换到 lru)、异步查询超时时间等。零停机调参主要依赖 Flink 自身提供的管理接口。平台后端服务会智能识别用户提交的修改请求,并调用相应的接口。
并⾏度热更新
通过调⽤ Flink 的REST API ,向指定Job 发送PATCH 请求即可动态调整并⾏度。
// 通过REST API动态调整并行度
public void updateParallelism(String jobId, int newParallelism) {
String url = String.format("%s/jobs/%s/parallelism", flinkRestUrl, jobId);
Map request = Collections.singletonMap("parallelism", newParallelism);
restTemplate.patchForObject(url, request, Void.class);
},>Checkpoint 参数更新
利用 Flink 命令行工具(CLI)的 modify-job 命令,可以方便地更新 Checkpoint 相关配置。
# 使用Flink CLI更新checkpoint配置
flink modify-job \
--checkpoint-interval \
--checkpoint-timeout \
--checkpoint-mode 为了提供无缝的用户体验,我们在平台层面设计了清晰的交互与处理逻辑:
(1)用户在管理界面提交参数修改请求。
(2)后端系统自动识别哪些是可零停机更新的参数,哪些需要通过快速重启。
(3)在确认页面明确告知用户,哪些参数将“实时生效”,哪些将触发“快速重启流程”。
(4)用户确认后,系统分发任务:零停机参数通过 API/CLI 即时应用,其他参数则进入快速重启流程。
这一设计不仅提升了运维效率,也通过明确的标识减少了用户的困惑和误操作。
对于需要修改 SQL 逻辑等伤筋动骨的操作,完全的零中断无法实现。此时,优化的重点便转向如何最大限度地缩短停机时间。热更新技术中的“快速重启”能力正是为此而生,它彻底改变了 Flink Per-Job 模式下的任务更新体验。
整个过程耗时可达3-5 分钟 ,对于需要频繁迭代的开发和测试场景来说 ,效率极低。
图1:传统的Per-Job任务流程
图2:采⽤快速重启技术改造后的流程
JobSubmitHandler,使其能够像 Session 集群一样接收新的JobGraph。这样,客户端只需生成并提交新的作业图,无需再走一遍漫长的集群启动流程。Dispatcher 是快速重启的指挥中心。其改造后的处理流程堪称精妙:
JobGraph 提交请求时,Dispatcher 并不立即创建新任务,而是将其缓存起来。cancel 命令。CompletableFuture)中,执行核心的重启逻辑:JobGraph。JobGraph 的恢复设置中,确保数据不丢不重。JobGraph 替换为新 JobGraph。ScheduleNG调度器,并用新的作业图来调度任务。其余组件(如 JobMaster、ResourceManager)均被复用。通过这一系列操作,我们实现了在同一个 Flink 集群内对作业的无缝替换。
一个关键细节是 Slot 资源的复用。当旧任务取消后,其占用的 TaskManager Slot 会被 JobMaster 内的 SlotPool 标记为可用。但此时 TaskExecutor 内部记录的 JobID 仍然是旧的。如果新任务直接复用这些 Slot,会导致 TaskExecutor 因 JobID 不匹配而拒绝执行。
我们的解决方案是:在快速重启过程中,主动清空 JobMaster 的 SlotPool 内部缓存。这样,SlotPool 会认为自己没有可用资源,从而重新向 ResourceManager 申请 Slot。ResourceManager 收到请求后,会复用那些物理上并未释放的 TaskManager Slot,并通过 RPC 将新的 JobID 注册到 TaskExecutor 中。这样就完美解决了 Slot 的识别问题,实现了真正的资源复用。
技术创新的最终目的是服务于业务。热更新技术为企业带来了实实在在的价值。
场景 | 传统方式耗时 | 袋鼠云方案耗时 | 业务影响 |
调整并行度应对流量高峰 | ~11 分钟 | ~30 秒 | 从业务中断到零中断 |
修改SQL逻辑并重新部署 | ~4-5 分钟 | < 1 分钟 | 迭代效率提升 400% 以上 |
为了确保新功能的稳定可靠,我们建议在实施时遵循以下最佳实践:
展望未来,袋鼠云实时计算团队将继续深化 Flink 技术创新:
点击袋鼠云官网申请免费试用:https://www.dtstack.com/?src=bbs
点击袋鼠云资料中心免费下载干货资料:https://www.dtstack.com/resources/?src=bbs
《指标+AI数智应用白皮书》下载地址:https://www.dtstack.com/resources/1101/?src=bbs
《数据资产管理白皮书》下载地址:https://www.dtstack.com/resources/1073/?src=bbs
《行业指标体系白皮书》下载地址:https://www.dtstack.com/resources/1057/?src=bbs
《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001/?src=bbs
《数栈V6.0产品白皮书》下载地址:https://www.dtstack.com/resources/1004/?src=bbs