【大数据】Flink 之部署篇

Flink 之部署篇

  • 1.概述和参考架构
  • 2.可重复的资源清理
  • 3.部署模式
    • 3.1 Application 模式
    • 3.2 Per-Job 模式(已废弃)
    • 3.3 Session 模式

Flink 是一个多用途框架,支持多种不同的混合部署方案。下面,我们将简要介绍 Flink 集群的构建模块、它们的用途和可用实现。如果您只想在本地启动 Flink,我们建议您建立一个独立集群(Standalone Cluster)。

1.概述和参考架构

下图显示了每个 Flink 群集的构件。总有一个客户端在运行,它接收 Flink 应用程序的代码,将其转换为 JobGraph 并提交给 JobManager。

JobManager 会将工作分配给 TaskManager,实际的算子(如 sourcestransformationssinks 等)就在 TaskManager 上运行。

部署 Flink 时,每个构件通常有多个可用选项。我们在下表列出了这些选项。

在这里插入图片描述

组件
作用
实现
Flink Client将批处理或流应用程序编译成数据流图,然后提交给 JobManager。1️⃣ Command Line Interface
2️⃣ REST Endpoint
3️⃣ SQL Client
4️⃣ Python REPL
JobManagerJobManager 是 Flink 中央工作协调组件的名称。它为不同的资源提供者提供不同的实现,这些实现在高可用性、资源分配行为和支持方面各不相同。

作业提交的 JobManager 模式:
(1)Application 模式:专门为一个应用程序运行群集。作业的 main 方法(或客户端)在 JobManager 上执行。支持在一个应用程序中多次调用 execute / executeAsync
(2)Per-Job 模式:只为一个作业运行集群。作业的 main 方法(或客户端)仅在群集创建之前运行。
(3)Session 模式:一个 JobManager 实例管理多个作业,共享同一个任务管理器集群。
1️⃣ Standalone(这是裸机模式,只需要启动 JVM。在此模式下,可通过手动设置使用 Docker、Docker Swarm / Compose、 non-native Kubernetes 和其他模式进行部署)
2️⃣ Kubernetes
3️⃣ YARN
TaskManager任务管理器是实际执行 Flink 作业的服务。
外部组件
作用
实现
High Availability Service ProviderFlink 的 JobManager 可在高可用性模式下运行,这使得 Flink 能够从 JobManager 故障中恢复。为了更快地进行故障切换,可以启动多个备用 JobManager 作为备份。1️⃣ Zookeeper
2️⃣ Kubernetes HA
File Storage and Persistency对于检查点(流作业的恢复机制),Flink 依赖于外部文件存储系统请参阅 “文件系统” 页面
Resource ProviderFlink 可通过不同的资源提供者框架(如 Kubernetes 或 YARN)进行部署。参见上文的 JobManager 实现。
Metrics StorageFlink 组件可报告内部指标,Flink 作业也可报告额外的特定作业指标。请参阅 “指标报告器” 页面
Application-level data sources and sinks虽然从技术上讲,应用级数据源和汇并不是 Flink 群集组件部署的一部分,但在规划新的 Flink 生产部署时,应考虑到这一点。将常用数据与 Flink 同地放置可带来显著的性能优势。例如:
1️⃣ Apache Kafka
2️⃣ Amazon S3
3️⃣ Elasticsearch
4️⃣ Apache Cassandra
请参阅 “连接器” 页面

2.可重复的资源清理

一旦作业达到 完成失败取消 的全局终端状态,与作业相关的外部组件资源就会被清理。如果资源清理失败,Flink 会尝试重试清理。您可以配置所使用的重试策略。重试次数达到最大值而不成功,会使作业处于脏状态。其工件需要手动清理(更多详情,请参阅 High Availability Services / JobResultStore 部分)。重新启动相同的作业(即使用相同的作业 ID)将导致清理工作被重新启动,而不会再次运行作业。

3.部署模式

Flink 的部署模式有 ApplicationPer-JobSession 模式。三者的主要区别:

  • 1️⃣ 集群与作业的生命周期是否一致。
  • 2️⃣ 资源的隔离程度。
  • 3️⃣ 作业的 mian() 运行在 Client 还是集群上。

在这里插入图片描述

3.1 Application 模式

  • 将启动一个专用的 JobManager 来提交作业。JobManager 将只执行此作业,然后退出。Flink 应用程序在 JobManager 上运行。
  • 作业与 Flink 集群打包在一起,在 JobManager 启动的时候会执行作业的 main 函数直接启动作业,而不需要通过 Flink Client 提交作业。
  • 作业的生命周期与 Flink 集群的一致,即作业关闭后 Flink 集群也会关闭。

在所有其他模式下,应用程序的 main() 方法都在客户端执行。这一过程包括在本地下载应用程序的依赖项,执行 main() 以提取 Flink 运行时可以理解的应用程序表示(即 JobGraph),并将依赖项和 JobGraph 发送到集群。这就使客户端成为资源消耗大户,因为它可能需要大量网络带宽来下载依赖项并将二进制文件发送到集群,还需要 CPU 周期来执行 main()。当客户端被多个用户共享时,这一问题会更加突出。

在此基础上,Application 模式为每个提交的应用程序创建一个集群,但这次应用程序的 main() 方法由 JobManager 执行。为每个应用程序创建一个集群可视为创建一个会话集群,仅在特定应用程序的作业之间共享,并在应用程序结束时关闭。通过这种架构,应用程序模式可提供与 Per-Job 模式相同的资源隔离和负载平衡保证,但其粒度为整个应用程序。

应用程序模式基于这样一个假设:所有需要访问用户 jars 的 Flink 组件(JobManager、TaskManager)的类路径(usrlib 文件夹)上都有用户 jars。换句话说,您的应用程序与 Flink 发行版捆绑在一起。这样,Application 模式就不必像其他部署模式那样通过 RPC 向 Flink 组件分发用户 jars,从而加快了部署 / 恢复过程。

Application 模式假定用户 jars 与 Flink 发行版捆绑在一起。在集群上执行 main() 方法可能会对您的代码产生其他影响,例如您使用 registerCachedFile() 在环境中注册的任何路径都必须能被应用程序的 JobManager 访问。

Per-Job已废弃)模式相比,Application 模式允许提交由多个作业组成的应用程序。作业的执行顺序不受部署模式的影响,但受用于启动作业的调用的影响。execute() 是阻塞式的,它会建立一个顺序,并导致 “下一个” 作业的执行被推迟,直到 “这个” 作业完成。使用 executeAsync()(非阻塞)会导致 “下一个” 作业在 “这个” 作业完成前开始执行。

应用模式允许 multi-execute() 应用,但在这种情况下不支持高可用性。应用模式下的高可用性仅支持single-execute() 应用程序。此外,当应用程序模式下多个正在运行的作业(例如使用 executeAsync() 提交的作业)中的任何一个被取消时,所有作业都将停止,而 JobManager 也将关闭。支持常规作业完成(通过源关闭)。

3.2 Per-Job 模式(已废弃)

  • 将启动一个专用的 JobManager 来提交作业。JobManager 将只执行此作业,然后退出。Flink 应用程序在提交每个作业集群的客户端上运行。
  • 作业与 Flink 集群不是打包在一起,在 JobManager 启动后需要通过 Flink Client 提交作业,即增加了网络传输的压力和客户端的 CPU 资源。

Per-Job 模式仅受 YARN 支持,在 Flink 1.15 中已被弃用。它将在 FLINK-26000 中被弃用。请考虑使用 Application 模式在 YARN 上按任务启动专用集群。

为了提供更好的资源隔离保证,Per-Job 模式使用可用的资源提供者框架(如 YARN)为每个提交的作业启动一个集群。该集群只对该作业可用。当作业完成后,集群会被拆除,任何残留的资源(文件等)都会被清除。这提供了更好的资源隔离,因为行为不端的作业只能导致其自身的 TaskManager 宕机。此外,由于每个作业都有一个 TaskManager,它还能将记账的负担分散到多个 TaskManager 中。

🚀 Application 模式对比 Per-Job 模式最大的区别是,前者使用 executeAsync() 提交作业(不阻塞),而后者使用 execute() 提交作业(阻塞),因此 Application 模式可以运行多个作业。

3.3 Session 模式

  • 多个作业共享一个 JobManager。
  • 常驻的 JobManager,多个作业共享同一个集群。如果其中一个作业异常导致 TaskManager 关闭,则该 TM 上的全部作业都会重新调度。

Session 模式假定有一个已在运行的集群,并使用该集群的资源来执行任何已提交的应用程序。在同一(Session)集群中执行的应用程序使用相同的资源,因此也会竞争相同的资源。这样做的好处是,您无需为每个提交的作业支付启动整个群集的资源开销。但是,如果其中一个作业出现问题或导致 TaskManager 宕机,那么在该 TaskManager 上运行的所有作业都会受到故障影响。这除了会对导致故障的作业造成负面影响外,还意味着所有重新启动的作业都会同时访问文件系统,从而导致其他服务无法使用文件系统,这就意味着潜在的大规模恢复过程。此外,单个集群运行多个作业意味着 JobManager 要承担更多的负荷,因为它要负责管理群集中的所有作业。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484521.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

选择VR全景行业,需要了解哪些内容?

近年来,随着虚拟现实、增强现实等技术的持续发展,VR全景消费市场得以稳步扩张。其次,元宇宙行业的高速发展,也在进一步拉动VR全景技术的持续进步,带动VR产业的高质量发展。作为一种战略性的新兴产业,国家和…

Qt程序设计-中英文输入法软键盘实现

本文讲解Qt中英文输入法软键盘实现。 实现目标 中英文切换、大小写切换、特殊字符切换、 使用谷歌中文字库txt文档。 在QWidget窗体上实现,可视化编写软键盘。 实现过程 准备工作:下载谷歌中文字库,按键的图片 创建QWidget项目,在主窗体上添加一个按钮,用于弹出软键…

[论文精读]Do Transformers Really Perform Bad for Graph Representation?

论文网址:[2106.05234] Do Transformers Really Perform Bad for Graph Representation? (arxiv.org) 论文代码:https://github.com/Microsoft/Graphormer 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼…

喜讯 | 重庆炼石入选重庆市科技局科技型企业

近日,重庆炼石网络技术有限公司(以下简称“重庆炼石”)经过严格审查,获得由重庆市科学技术局备案、重庆生产力促进中心(重庆市科技型企业系统受托管理单位)发证的《重庆市科技型企业备案证书》,…

测试基础1:伟大航路哟呼(Linux基础、mysql基础)

1 测试流程和方法 软件测试定义: 从方式上看:包含人工测试、自动化测试 从方法上看:运行程序或系统和测定程序或系统的过程 从目的上看:包括找bug和找bug出现的原因 软件测试的原则:功能性、可靠性、易用性、效率性…

四.QT5工具安装和环境变量的配置

1.以管理员身份运行安装包 2.登录qt账号,点击【next】 3.选中同意 4.选择安装目录,注意不能有中文和空格 5.勾选 64位 mingw。点击【next】,等待安装完成 6.配置环境变量

我的第一个浏览器插件网页一键上传的开发历史

前言 一键上传选中的网页内容,实现知识快速收藏。如飞书剪存,有道云剪报,MrDoc速记。早在2008年,我参考了有道云一键上传,实现了一个简单的浏览器插件,能方便保存网页内容到个人网站。这些插件目前都很难兼…

【Docker】三、日志控制

三、日志控制 使用Docker部署服务器,要对Docker日志定时处理。否则,服务器运行一段时间后,磁盘占比报警。 出现磁盘占比报警,大概率是大文件的问题,可查看服务器中的大文件,排除问题。 (一&am…

C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

目录 1. 结构体类型的声明1.1 结构的声明1.2 结构体变量的创建和初始化1.3 结构的特殊声明---匿名结构体1.4 结构的自引用 2.结构体内存对齐(重点!!)2.1 对齐规则2.2 例题讲解2.3 为什么存在内存对齐?2.4 修改默认对齐…

SpringBoot添加过滤器Filter

1. 拦截器和过滤器 先说一下,过滤器和拦截器的区别和联系。 1.1 相同点 首先过滤器和拦截器都能实现请求的筛选(过滤或者拦截),然后根据自己的业务需求,添加自己的逻辑,保证请求往后走的时候数据能满足自己…

如何自定义一个协议

. 如何自定义一个协议 先有一个需求,有个场景,打开外卖软件,会显示商家列表,列表中有很多项,每一项都包含了一些信息,商家的名称,图片,好评率,距离你的位置,评分 这些信息都是通过网络,从服务器获取的, 客户端,需要给服务器发送一个请求,服务器收到请求之后,就给客户端返回一个…

HTTP攻击,该怎么防护

一般网络世界里为人们所熟知的DDoS攻击,多数是通过对带宽或网络计算资源的持续、大量消耗,最终导致目标网络与业务的瘫痪;这类DDOS攻击,工作在OSI模型的网络层与传输层,利用协议特点构造恶意的请求载荷来达成目标资源耗…