Deploy Apache Flink Natively on YARN/Kubernetes

简介: 作者:任春德 Apache Flink作为下一代大数据计算引擎,在迅速发展强大中,其内部架构也在不断优化重构,以适应更多运行时环境和更大计算规模,Flink Improvement Proposals-6重新设计了在各集群管理系统(Standalone/YARN/Kubernetes等)上资源调度的统一架构,本文将介绍资源调度的架构发展及其清晰分层等设计特点,YARN上per-Job和session两种模式的实现,以及正在讨论开发的与K8S云原生融合的详细设计。

作者:任春德

Apache Flink作为下一代大数据计算引擎,在迅速发展强大中,其内部架构也在不断优化重构,以适应更多运行时环境和更大计算规模,Flink Improvement Proposals-6重新设计了在各集群管理系统(Standalone/YARN/Kubernetes等)上资源调度的统一架构,本文将介绍资源调度的架构发展及其清晰分层等设计特点,YARN上per-Job和session两种模式的实现,以及正在讨论开发的与K8S云原生融合的详细设计。

本文内容如下:

  • Apache Flink Standalone Cluster

  • Apache Flink 与 YARN 的原生融合

  • Apache Flink 与 K8S 的原生融合

  • 小结

Apache Flink Standalone Cluster

如图1,Flink的Standalone集群部署是主从架构,其中主JobManager(简称JM)负责Job的计算单元Task调度,TaskManager(简称TM)向JobManager汇报并负责在其内部用线程执行Task。


之所以是Standalone,是因为其不依赖其他底层资源调度系统,直接部署启动在各自的裸机器节点上,虽然可以用一些自动化运维工具方便地部署和管理,但是存在以下几个问题:

  • 隔离:多Job运行在一个集群,可能同一TM上执行不同Job的Task,其线程所用资源(cpu/mem)无法控制,相互影响,甚至一个Task造成整个TM的Out Of Memory,使其之上的Job都受影响;多个Job的调度也在同一个JM中,同样存在被有问题Job影响的问题。

  • 多租户的资源用量(quota)管理:无法控制用户的Job资源使用总量,缺乏租户间的资源协调管理。

  • 集群的可用性:虽然JM可以部署有Standby,支持High Available,但JM、TM进程缺乏被看护,难免因以上隔离等问题造成过多进程宕掉,整个集群不可用。

  • 集群的可运维:版本升级,扩缩容等都需要复杂的运维操作。

为了解决以上问题,需要将Flink跑在流行成熟的资源调度系统上,如YARN、Kubernetes、Mesos,如何实现呢?

Flink 与 YARN 的原生融合

Apache Flink Standalone Cluster on YARN

简单有效的一种部署方式是利用YARN自身支持的特性,将Flink Standalone部署到YARN集群上,如图2(Apache Flink Standalone Cluster ON YARN),

  • 多个Job可以相应地起多个YARN Application,每个app是一个standalone cluster,各自独立运行,而且依靠YARN本身支持的cgroups等隔离手段,避免了多任务间的相互影响,隔离问题迎刃而解。

  • 不同用户的App也可以运行在不同的YARN调度队列中,通过queue quota管理能力解决多租户的问题。

  • 同时可以利用YARN对App进程的重启重试再调度的策略,使Flink Standalone Cluster高可用。

  • 简单的参数、配置文件修改,通过YARN的distributed cache分发Flink jar,就可以方便的升级和扩缩容。

虽然解决了以上问题,但是每个(少量)Job起一个Standalone Cluster,难以达到高效的资源利用,因为:

  • Cluster的规模(多少个TM)是在启动YARN App时参数静态指定的,Flink自身的编译优化使其较难在运行前预估资源的需求,那就难以合理化TM数量,多了资源浪费,少了影响Job执行速度甚至无法运行。

  • 每个TM拥有的资源大小也是参数静态指定,同样难以预估实际需要,不能针对不同的Task资源需求来动态申请不同大小的TM,只能设置相同规格大小的TM,那就难以恰好放置整数个Task,剩余的部分资源浪费。

  • App的启动(1.Submit YARN App)和Flink Job的提交(7.Submit Job)需要2阶段完成,会使每个任务的提交效率低,造成集群的资源流转率也会降低。

大规模YARN集群中Flink Job越多,资源浪费的会更可观,成本损失越大,而且不只是on YARN存在以上问题,Standalone直接运行于其他资源调度系统之上,也是有相同问题,所以阿里巴巴实时计算率先在YARN实际生产经验上改进了Flink的资源利用模型,后续与社区讨论设计实现了一套通用的架构,适用于不同的资源调度系统。

FLIP-6 - Deployment and Process Model

FLIP-6全面记录了此次部署架构的重构,新的模块如图3。类似MapReduce-1架构向YARN+MapReduce-2的升级,将资源调度与Job计算逻辑单元(Task)的调度分成2层,使两个模块(系统)——ResourceManager(RM)和JobManager(JM)各司其职,与底层资源调度系统的耦合降低(只需实现不同plugable的ResourceManager即可),减少逻辑复杂度降低开发维护难度,优化JM实现资源按Task所需申请,解决了Standalone on YARN/K8S的资源利用率低的问题,同时还有利于集群和Job规模的扩展。

  • Dispatcher: 负责与Client通信接收Job的提交,生成JobManager,生命周期可跨Job。

  • ResourceManager: 对接不同资源调度系统,实现资源的调度(申请/释放),管理Container/TaskManager,同样生命周期可跨Job。

  • JobManager: 每个Job一个实例,负责Job的计算逻辑的调度执行。

  • TaskManager: 向RM注册汇报资源情况,从JM接收Task执行并汇报状态。

Apache Flink与YARN的原生融合

根据以上架构,Flink on YARN实现了2种不同的部署运行模式Per-Job和Session(用户使用文档Flink on Yarn)。

Per-Job

Per-Job即一个Flink Job与其YARN Application(App)生命周期绑定,执行过程如图4,在提交YARN App时同时将Flink Job的file/jars通过YARN Distributed Cache分发,一次性完成提交,而且JM是根据JobGraph产生的Task的资源实际需求来向RM申请slot执行,Flink RM再动态的申请/释放YARN的Container。完美(?)解决了之前的所有问题,既利用了YARN的隔离又有高效的资源利用。

Session

Per-Job完美?No,还是存在局限,YARN App的提交时资源申请和启动TM的时间较长(秒级),尤其在交互式分析短查询等场景上,Job计算逻辑执行时间很短,那么App的启动时间占比大就严重影响了端到端的用户体验,缺少了Standalone模式上Job提交快的优点。但FLIP-6架构的威力,还是能轻松化解这个问题,如图5,通过预启动的YARN App来跑一个Flink Session(Master和多个TM已启动,类似Standalone可运行多个Job),再提交执行Job,这些Job就可以很快利用已有的资源来执行计算。Blink分支与Master具体实现有点不同(是否预起TM),后续会合并统一,并且继续开发实现Session的资源弹性——按需自动扩缩TM数量,这点是standalone无法实现的。

Resource Profile

前面是架构上的变化,而要实现资源按需申请,需要有协议API,这就是Resource Profile,可以描述单个算子(Operator)的CPU & Memory等的资源用量,进而RM根据这些资源请求来向底层资源管理系统申请Container来执行TM,详细的使用文档见Task slots and resources

Flink 与 Kubernetes 的原生融合

最近几年,Kubernetes的发展迅猛,已然成为了云时代的原生操作系统,下一代的大数据计算引擎Apache Flink的部署与其融合,是否可以开辟大数据计算的新大陆?

Apache Flink Standalone Cluster on Kubernetes

依靠K8S自身支持Service部署的强大能力,Flink Standalone Cluster可以通过简单的K8S: Deployment & ServiceFlink Helm chart很容易的部署到K8S集群上,但同样有类似Standalone on YARN的资源利用率低等问题,所以还是需要“原生融合”。

Apache Flink 和 Kubernetes 的原生融合

Flink与K8S的“原生融合”,主要是在FLIP-6架构上实现K8SResourceManager来对接Kubernetes的资源调度协议,现Blink的分支实现架构下图所示,用户使用文档见Flink on K8S,merge到主干Master上的工作正在进行中
图6:Flink Natively on Kubernetes图6:Flink Natively on Kubernetes

小结

部署管理、资源调度是大数据处理系统的底层基石,通过FLIP-6的抽象分层和重构,Apache Flink构建了牢固的基础,可以“原生”地运行于各大资源调度系统(YARN/Kubernetes/Mesos)上,支撑起更大规模更高并发的计算,高效地利用集群资源,为后续的不断发展强大提供了可靠的保障。
相关功能的优化改进依然在继续,如Resource Profile配置资源的难度使一些开发者望而生畏,并且严重降低了Flink的易用性,我们在尝试实现资源和并发配置的Auto Config/Scaling等功能来解决此类问题;“Serverless”架构在迅速发展,期待Flink与Kubernetes的融合成为云原生的强大计算引擎(类FaaS),为用户节省资源,带来更大的价值。

更多资讯请访问 Apache Flink 中文社区网站

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
1137 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
561 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
8月前
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
956 9
Apache Flink:从实时数据分析到实时AI
|
8月前
|
SQL 人工智能 API
Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
Apache Flink 2.1.0 正式发布,标志着实时数据处理引擎向统一 Data + AI 平台迈进。新版本强化了实时 AI 能力,支持通过 Flink SQL 和 Table API 创建及调用 AI 模型,新增 Model DDL、ML_PREDICT 表值函数等功能,实现端到端的实时 AI 工作流。同时增强了 Flink SQL 的流处理能力,引入 Process Table Functions(PTFs)、Variant 数据类型,优化流式 Join 及状态管理,显著提升作业稳定性与资源利用率。
824 0
|
7月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
2586 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
1069 33
The Past, Present and Future of Apache Flink
|
8月前
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
866 6
|
8月前
|
消息中间件 存储 Kafka
Apache Flink错误处理实战手册:2年生产环境调试经验总结
本文由 Ververica 客户成功经理 Naci Simsek 撰写,基于其在多个行业 Flink 项目中的实战经验,总结了 Apache Flink 生产环境中常见的三大典型问题及其解决方案。内容涵盖 Kafka 连接器迁移导致的状态管理问题、任务槽负载不均问题以及 Kryo 序列化引发的性能陷阱,旨在帮助企业开发者避免常见误区,提升实时流处理系统的稳定性与性能。
692 0
Apache Flink错误处理实战手册:2年生产环境调试经验总结
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
1752 13
Apache Flink 2.0-preview released
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
578 3

推荐镜像

更多