Flink第三章:Flink运行及部署

文章目录


前言

Apache Flink作为领先的分布式流处理框架,其灵活的部署和运行模式是支撑各类实时计算场景的核心基础。本文档系统梳理了Flink的三种主要运行模式------Standalone、YARN与Kubernetes,并重点剖析了生产环境中应用最广泛的YARN集成方案。在此基础上,详细介绍了Flink集群的核心组件角色、三种部署模式(会话模式、单作业模式、应用模式)的差异与适用场景,以及历史服务器的配置与使用。通过对这些内容的掌握,读者能够根据实际业务需求选择合适的部署策略,高效构建和管理Flink集群。


一、Flink运行模式

(一)Standalone运行模式(了解)

  • 独立模式是独立运行的,不依赖任何外部的资源管理平台;
  • 当然独立也是有代价的:如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理
  • 所以独立模式一般只用在开发测试或作业非常少的场景下。

(二)YARN运行模式(重点)

  • YARN上部署的过程是:客户端把Flink应用提交给Yarn的ResourceManager,Yarn的ResourceManager会向Yarn的NodeManager申请容器。
  • 在这些容器上,Flink会部署JobManager和TaskManager的实例,从而启动集群。
  • Flink会根据运行在JobManger上的作业所需要的Slot数量动态分配TaskManager资源。

(三)K8S 运行模式(了解)

  • 容器化部署是如今业界流行的一项技术,基于Docker镜像运行能够让用户更加方便地对应用进行管理和运维。
  • 容器管理工具中最为流行的就是Kubernetes(k8s),而Flink也在最近的版本中支持了k8s部署模式。
  • 基本原理与YARN是类似的,具体配置可以参见官网说明,这里我们就不做过多讲解了。

二、Flink集群搭建

(一)集群规划

(二)集群角色

Flink提交作业和执行任务,需要几个关键组件:

1.客户端(Client)

代码由客户端获取并做转换,之后提交给JobManger

2.JobManager

Flink集群里的**"管事人",对作业进行 中央调度管理**;而它获取到要执行的作业后,会进一步处理转换,然后分发任务给众多的TaskManager

3.TaskManager

真正"干活的人",数据的处理操作都是它们来做的。

  • Flink是一个非常灵活的处理框架,它支持多种不同的部署场景,还可以和不同的资源管理平台方便地集成。所以接下来我们会先做一个简单的介绍,让大家有一个初步的认识,之后再展开讲述不同情形下的Flink部署。

三、部署模式

在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。

Flink为各种场景提供了不同的部署模式,主要有以下三种:

  • 会话模式(Session Mode)
  • 单作业模式(Per-Job Mode)
  • 应用模式(Application Mode)。

它们的区别 主要在于:集群的生命周期以及资源的分配方式 ;以及应用的main方法到底在哪里执行------客户端(Client)还是JobManager

(一)会话模式(Session Mode)

1.概念

会话模式其实最符合常规思维。我们需要先启动一个集群,保持一个会话 ,在这个会话中通过客户端提交作业。集群启动时所有资源就都已经确定,所以所有提交的作业会竞争集群中的资源。

会话模式比较适合于单个规模小、执行时间短的大量作业。

2.部署步骤

YARN的会话模式需要首先申请一个YARN会话(YARN Session)来启动Flink集群。具体步骤如下:

(1)启动集群
  • 启动Hadoop集群(HDFS、YARN)。
  • 执行脚本命令向YARN集群申请资源,开启一个YARN会话,启动Flink集群。
powershell 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/yarn-session.sh -nm test

可用参数解读:

-d:分离模式,如果你不想让Flink YARN客户端一直前台运行,可以使用这个参数,即使关掉当前对话窗口,YARN session也可以后台运行。

-jm(--jobManagerMemory):配置JobManager所需内存,默认单位MB。

-nm(--name):配置在YARN UI界面上显示的任务名。

-qu(--queue):指定YARN队列名。

-tm(--taskManager):配置每个TaskManager所使用内存。

  • 注意:Flink1.11.0版本不再使用-n参数和-s参数分别指定TaskManager数量和slot数量,YARN会按照需求动态分配TaskManager和slot。所以YARN的会话模式不会把集群资源固定,是动态分配的。

  • YARN Session启动之后会给出一个Web UI地址以及一个YARN application ID,如下所示,用户可以通过Web UI 或者命令行 两种方式提交作业。
    通过运行后台输出日志,可以看到程序ID和对应的接口

powershell 复制代码
2022-11-17 15:20:52,711 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface hadoop104:40825 of application 'application_1668668287070_0005'.
JobManager Web Interface: http://hadoop104:40825
(2)提交作业
①通过Web UI提交作业
②通过命令行提交作业
  • 将FlinkTutorial-1.0-SNAPSHOT.jar任务上传至集群。
  • 执行以下命令将该任务提交到已经开启的Yarn-Session中运行。
powershell 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/flink run
-c com.atguigu.wc.SocketStreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar

客户端可以自行确定JobManager的地址,也可以通过-m或者-jobmanager参数指定JobManager的地址,JobManager的地址在YARN Session的启动页面中可以找到。

  • 任务提交成功后,可在YARN的Web UI界面查看运行情况。hadoop103:8088。

    从上图中可以看到我们创建的Yarn-Session实际上是一个Yarn的Application,并且有唯一的Application ID。

  • 也可以通过Flink的Web UI页面查看提交任务的运行情况,如下图所示。

(二)单作业模式(Per-Job Mode)

1.概念

会话模式因为资源共享会导致很多问题,所以为了更好地隔离资源,我们可以考虑为每个提交的作业启动一个集群 ,这就是所谓的单作业(Per-Job)模式。

  • 作业完成后,集群就会关闭,所有资源也会释放。
  • 这些特性使得单作业模式在生产环境运行更加稳定,所以是实际应用的首选模式
  • 需要注意的是,Flink本身无法直接这样运行,所以单作业模式一般需要借助一些资源管理框架来启动集群,比如YARN、Kubernetes(K8S)。

2.部署步骤

在YARN环境中,由于有了外部平台做资源调度,所以我们也可以直接向YARN提交一个单独的作业,从而启动一个Flink集群。

(1)执行命令提交作业。
powershell 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/flink run -d -t yarn-per-job -c com.atguigu.wc.SocketStreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar
  • 注意:如果启动过程中报如下异常。

Exception in thread "Thread-5" java.lang.IllegalStateException: Trying to access closed classloader. Please check if you store classloaders directly or indirectly in static fields. If the stacktrace suggests that the leak occurs in a third party library and cannot be fixed immediately, you can disable this check with the configuration 'classloader.check-leaked-classloader'.

at org.apache.flink.runtime.execution.librarycache.FlinkUserCodeClassLoaders

  • 解决办法: 在flink的/opt/module/flink-1.17.0/conf/flink-conf.yaml配置文件中设置
bash 复制代码
[atguigu@hadoop102 conf]$ vim flink-conf.yaml
classloader.check-leaked-classloader: false
(2)在YARN的ResourceManager界面查看执行情况
  • 点击可以打开Flink Web UI页面进行监控,如下图所示:
(3)可以使用命令行查看或取消作业,命令如下
bash 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY

[atguigu@hadoop102 flink-1.17.0]$ bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY <jobId>
  • 这里的application_XXXX_YY是当前应用的ID,是作业的ID。注意如果取消作业,整个Flink集群也会停掉。

(三)应用模式(Application Mode)

1.概念

前面提到的两种模式下,应用代码都是在客户端上执行,然后由客户端提交给JobManager的。但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的资源消耗。

  • 解决办法 :不要客户端,直接把应用提交到JobManger上运行。而这也就代表着,我们需要为每一个提交的应用单独启动一个JobManager,也就是创建一个集群。这个JobManager只为执行这一个应用而存在,执行结束之后JobManager也就关闭了,这就是所谓的应用模式。
  • 会话模式与单作业模式,都是提交作业之后才创建集群;
  • 单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;
  • 应用模式下,是直接由JobManager执行应用程序的。

2.部署步骤

应用模式同样非常简单,与单作业模式类似,直接执行flink run-application命令即可。

(1)命令行提交
  • 执行命令提交作业
bash 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/flink run-application -t yarn-application -c com.atguigu.wc.SocketStreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar 
  • 在命令行中查看或取消作业
bash 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY

[atguigu@hadoop102 flink-1.17.0]$ bin/flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
(2)上传HDFS提交

可以通过yarn.provided.lib.dirs配置选项指定位置,将flink的依赖上传到远程。

  • 上传flink的lib和plugins到HDFS上
bash 复制代码
[atguigu@hadoop102 flink-1.17.0]$ hadoop fs -mkdir /flink-dist
[atguigu@hadoop102 flink-1.17.0]$ hadoop fs -put lib/ /flink-dist
[atguigu@hadoop102 flink-1.17.0]$ hadoop fs -put plugins/ /flink-dist
  • 上传自己的jar包到HDFS
bash 复制代码
[atguigu@hadoop102 flink-1.17.0]$ hadoop fs -mkdir /flink-jars
[atguigu@hadoop102 flink-1.17.0]$ hadoop fs -put FlinkTutorial-1.0-SNAPSHOT.jar /flink-jars
(3)提交作业
bash 复制代码
[atguigu@hadoop102 flink-1.17.0]$ bin/flink run-application -t yarn-application	-Dyarn.provided.lib.dirs="hdfs://hadoop102:8020/flink-dist"	-c com.atguigu.wc.SocketStreamWordCount  hdfs://hadoop102:8020/flink-jars/FlinkTutorial-1.0-SNAPSHOT.jar

这种方式下,flink本身的依赖和用户jar可以预先上传到HDFS,而不需要单独发送到集群,这就使得作业提交更加轻量了。


四、历史服务器

(一)history server是什么

  • Flink提供了历史服务器,用来在相应的 Flink 集群关闭后查询已完成作业的统计信息。
  • 只有当作业处于运行中的状态,才能够查看到相关的WebUI统计信息。
  • 通过 History Server 我们才能查询这些已完成作业的统计信息,无论是正常退出还是异常退出。

(二)使用步骤

1.创建存储目录

bash 复制代码
	hadoop fs -mkdir -p /logs/flink-job
bash 复制代码
jobmanager.archive.fs.dir: hdfs://hadoop102:8020/logs/flink-job
historyserver.web.address: hadoop102
historyserver.web.port: 8082
historyserver.archive.fs.dir: hdfs://hadoop102:8020/logs/flink-job
historyserver.archive.fs.refresh-interval: 5000

3.启动历史服务器

bash 复制代码
	bin/historyserver.sh start

4.停止历史服务器

bash 复制代码
bin/historyserver.sh stop

5.在浏览器地址栏输入

http://hadoop102:8082 查看已经停止的 job 的统计信息


总结

Flink的Standalone模式简单轻量,适合开发测试;YARN模式借助资源管理平台实现动态资源分配与隔离,是生产环境的常用选择;K8S模式则顺应容器化趋势,提供更灵活的运维能力。在部署模式上,会话模式适合短小的批量作业但存在资源竞争风险,单作业模式为每个作业启动独立集群,稳定性更优,应用模式则消除了客户端的资源消耗,通过直接将应用提交至JobManager实现更高效的执行。对于作业的持久化监控,历史服务器能够保留已终止作业的统计信息,便于事后分析与审计。合理组合运行环境与部署模式,并配置历史服务,可以有效提升Flink作业的交付效率与可观测性。

相关推荐
逸Y 仙X1 小时前
文章二十一:ElasticSearch 词项查询与调度查询实战
java·大数据·数据库·elasticsearch·搜索引擎
Bechamz1 小时前
大数据开发学习Day25
java·大数据·学习
AI周红伟1 小时前
AI学习第一课:OpenClaw企业实战应用工作坊
大数据·人工智能
摇滚侠1 小时前
数据聚合 黑马 Elasticsearch 全套教程,黑马旅游网案例
大数据·elasticsearch·搜索引擎
智能化咨询2 小时前
(207页PPT)工业大数据采集处理与应用
大数据
智能化咨询3 小时前
(101页PPT)SAP凯致半导体数字化升级项目方案(附下载方式)
大数据
极光代码工作室4 小时前
基于大数据的校园消费行为分析系统
大数据·hadoop·python·数据分析·spark
雷工笔记4 小时前
MES 系统设备管理模块详细设计方案
大数据·运维·网络