《Flink学习笔记》——第三章 Flink的部署模式
不同的应用场景,有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。
3.1 部署模式(作业角度/通用分类)
根据集群的生命周期、资源的分配方式、main方法到底在哪里执行——客户端还是Client还是JobManager、资源管理 将Flink的部署模式分为四类:
-
会话模式
-
单作业模式
-
应用模式
3.1.1 会话模式(Session Mode)
会话模式首先要启动一个集群,这个集群的资源提前配置好。总共就一个集群,所有资源确定,所有作业/应用竞争这一个集群中的资源。所有job共享相同的JobManager和一定数量的TaskManager。
JobManager/TaskManager的生命周期不受job影响,在job提交之前集群预先将JobManager和TaskManager创建好,并且job执行结束之后不会被销毁。
在Client中生成JobGraph,然后提交给JobManager
优点:
- 资源共享,提升资源利用率
- 运维简单,不需要重复创建、销毁JobManager和TaskManager(job结束则释放资源,集群继续正常运行,集群的生命周期是超越于作业之上的)
缺点:
- 资源伸缩性差,由于资源提前分配好了,如果资源不够了,后续提交作业则会失败
- 资源隔离性差,由于一个集群运行着多个作业,如果其中一个作业发生故障则可能导致JobManager宕机
- Client生成JobGraph会消耗大量CPU,并且生成之后发送给JobManager消耗网络带宽,如果频繁的提交任务,Client的压力会非常大。并且Client是顺序提交任务的,一旦某一个任务执行时间过长就会阻塞后面提价的任务。
适合场景:
单个规模小、执行时间短的大量作业
3.1.2 单作业模式(Per-Job-Mode)
会话模式由于多个作业运行在同一个集群,容易导致集群宕机,资源隔离性差。所以考虑为每个作业启动一个集群,这就是单作业模式。每个job都有单独的JobManager和TaskManager,随着job的提交而创建,job结束而销毁。
优点:
- 资源隔离,某个作业即使发生故障导致运行它的集群的JobManager宕机,也不会影响其它作业
- 根据不同的job可以申请不同大小的资源,slot数量可以不一样
缺点:
-
资源浪费,重复创建和销毁JobManager和TaskManager
-
JobManager和TaskManager的生命周期全部交给CLusterManagement管理,管理复杂
-
Client生成JobGraph会消耗大量CPU,并且生成之后发送给JobManager消耗网络带宽,如果频繁提交任务,Client的压力会非常大。并且Client是顺序提交任务的,一旦某一个任务执行时间过长就会阻塞后面提交的任务
注:这个模式由于需要对各个job的资源是分开的,各个job的JobManager、TaskManager创建和销毁等管理和资源的分配是比会话模式要复杂的。所以Flink本身暂时不支持这种模式,需要结合外部的资源管理平台来完成。
3.1.3 应用模式(Application Mode)
1.11版本之后支持应用模式,Client将jar包等发送给JobManager,在JobManager中生成JobGraph,也就是说main方法在JobManager上执行而不是客户端上执行。以应用为单位(一个应用可能多个作业),一个应用创建一个集群。这里可以看成是创建仅在特定应用程序的Job之间共享的session集群。因为一个应用可能有多个job,而这多个job是在一个集群中的。Application 模式允许提交由多个Job组成的应用程序。Job执行的顺序不受部署模式的影响,但受启动Job的调用的影响。使用阻塞的
execute()
方法,将是一个顺序执行的效果,结果就是"下一个"Job的执行被推迟到“该”Job完成为止。相反,一旦提交当前作业,非阻塞executeAsync()
方法将立即继续提交“下一个”Job。
优点:
- 降低客户端和网络压力
- Application之间实现资源隔离,而Application里面的job实现资源共享
缺点:
- 仅支持Yarn和kubernetes等
这里我们所讲到的部署模式,相对是比较抽象的概念。实际应用时,一般需要和资源管理平台结合起来,选择特定的模式来分配资源、部署应用。
3.1.4 Native Mode
默认只启动jobmanager,之后根据job任务提交情况,动态的申请、启动taskmanager计算资源。这个资源的动态分配,也就是资源管理是交由第三方资源管理器如Yarn、K8s等
3.2 部署模式(资源调度管理器角度)
Flink自己可以进行资源管理,但是没有那么灵活、好用。同时也可以结合第三方的资源管理器进行资源管理,flink专注业务逻辑的实现而资源的管理交由第三方资源管理器。
3.2.1 Standalone运行模式(了解)
独立模式是独立运行的,不依赖任何外部的资源管理平台;当然独立也是有代价的:如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理。所以独立模式一般只用在开发测试或作业非常少的场景下。
1、会话模式部署
1)先启动一个集群
./start-cluster.sh
2)通过Client提交作业(参考第二章)
方式一:通过Web UI提交
方式二:通过命令
flink run -m hadoop102:8081 -c com.zlin.wc.StreamWordCount ./chapter2-1.0-SNAPSHOT.jar
2、单作业模式部署
Flink的Standalone集群并不支持单作业模式部署。因为单作业模式需要借助一些资源管理平台。
3、应用模式部署
应用模式下不会提前创建集群,所以不能调用start-cluster.sh脚本。我们可以使用同样在bin目录下的standalone-job.sh来创建一个JobManager
具体步骤如下:
(1)将jar包放到lib/目录下
[root@hadoop102 lib]# cp /opt/jars/chapter2-1.0-SNAPSHOT.jar /opt/module/flink-1.17.1/lib
(2)启动JobManager
[root@hadoop102 bin]# /opt/module/flink-1.17.1/bin/standalone-job.sh start --job-classname com.zlin.wc.StreamWordCount
这里不用再指定jar包,因为脚本会到lib/目录下扫描
我们可以看到,虽然提交了作业,但是申请不到资源,一直处于CREATED状态。需要启动TaskManager。
(3)启动TaskManager
[root@hadoop102 bin]# /opt/module/flink-1.17.1/bin/taskmanager.sh start
(4) 如果希望停掉集群,可以使用
/opt/module/flink-1.16.0/bin/standalone-job.sh stop
/opt/module/flink-1.16.0/bin/taskmanager.sh stop
3.2.2 Native Mode
Native模式是对Session和Per-Job的优化,把生成多少TaskManager交给资源调度器。支持的资源调度器有Yarn,Mesos,Kubernetes等。
前期准备
-
需要安装hadoop(Yarn、HDFS)
-
配置环境变量
[root@hadoop102 ~]# vim ~/.bashrc#SET HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.7 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HADOOP_CLASSPATH=`hadoop classpath`
-
启动hadoop(Yarn、HDFS服务)
[root@hadoop102 sbin]# /opt/module/hadoop-2.7.7/sbin/start-all.sh
1、Flink on Yarn(重点)
(1)会话模式部署
1)启动集群
第一步:首先要启动hadoop相关服务(yarn、hdfs)
第二步:执行脚本命令向YARN集群申请资源,开启一个YARN会话,启动Flink集群
bin/yarn-session.sh -nm test -d
在YARN的ResourceManager界面查看执行情况
Yarn WEB UI: http://hadoop102:8088/
可用参数:
-d:分离模式,即yarn session后台运行
-jm:JobManager内存,默认单位MB
-nm:任务名
-qu:指定Yarn队列名
-tm:每个TaskManager的内存
2)提交作业
两种提交方式:
-
Web UI提交(略)
-
命令行提交
[root@hadoop102 bin]# flink run -c com.zlin.wc.StreamWordCount /opt/jars/chapter2-1.0-SNAPSHOT.jar
从Yarn Web UI -> 点击对应提交的任务的application ID -> 点击Tracking URL:ApplicationMaster -> 进入到Flink web ui 可查看到提交的任务
尝试1:可以再提交一个任务吗?
可以,而且由yarn自己去动态分配,且提交到同一个application中
尝试2:再创建一个Yarn session?
2023-06-18 18:36:55,836 INFO org.apache.flink.yarn.YarnClusterDescriptor [] - Deployment took more than 60 seconds. Please check if the requested resources are available in the YARN cluster
会卡住,无法创建成功,不知道是不是资源问题还是说会话模式本来就只有一个集群不让创建。
(2)单作业模式部署
[root@hadoop102 bin]# flink run -t yarn-per-job -c com.zlin.wc.StreamWordCount /opt/jars/chapter2-1.0-SNAPSHOT.jar
查看或者取消作业:
[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集群也会停掉。
(3)应用模式部署
-
命令行提交
1)提交
[root@hadoop102 bin]# flink run-application -t yarn-application -c com.zlin.wc.StreamWordCount /opt/jars/chapter2-1.0-SNAPSHOT.jar
2)查看和取消作业
flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
-
上传HDFS提交
1)上传jar包到hdfs
我们知道在客户端生成JobGraph一旦提交任务数过多,会造成很大压力,而应用模式部署在JM上生成JobGraph所以可以解决这个问题。但是我们提交时还是需要经过网络传输将jar包传送到JM,提交速度会受到影响。我们可以将jar包提前上传到hdfs。
可以通过yarn.provided.lib.dirs配置选项指定位置,将jar上传到hdfs。这种方式下 jar 可以预先上传到 HDFS,而不需要单独发送到集群,这就使得作业提交更加轻量了。
[root@hadoop102 flink-1.17.1]# hadoop fs -mkdir /flink-jars [root@hadoop102 flink-1.17.1]# hadoop fs -put /opt/jars/chapter2-1.0-SNAPSHOT.jar /flink-jars
2)上传flink的lib和plugins到HDFS上
[root@hadoop102 flink-1.17.1]# hadoop fs -mkdir /flink-dist [root@hadoop102 flink-1.17.1]# hadoop fs -put lib/ /flink-dist [root@hadoop102 flink-1.17.1]# hadoop fs -put plugins/ /flink-dist
2)提交作业
[root@hadoop102 flink-1.17.1]# bin/flink run-application -t yarn-application -Dyarn.provided.lib.dirs="hdfs://hadoop102:8020/flink-dist" -c com.zlin.wc.StreamWordCount hdfs://hadoop102:8020/flink-jars/chapter2-1.0-SNAPSHOT.jar
2、Flink on k8s(了解)
容器化部署是如今业界流行的一项技术,基于Docker镜像运行能够让用户更加方便地对应用进行管理和运维。容器管理工具中最为流行的就是Kubernetes(k8s),而Flink也在最近的版本中支持了k8s部署模式。后续补充。。。
附:Flink可以结合常见的资源管理器,各种资源调度器中支持的运行模式如下图:

3.3 历史服务器
运行 Flink job 的集群一旦停止,只能去 yarn 或本地磁盘上查看日志,不再可以查看作业挂掉之前的运行的 Web UI,很难清楚知道作业在挂的那一刻到底发生了什么。如果我们还没有 Metrics 监控的话,那么完全就只能通过日志去分析和定位问题了,所以如果能还原之前的 Web UI,我们可以通过 UI 发现和定位一些问题。
Flink提供了历史服务器,用来在相应的 Flink 集群关闭后查询已完成作业的统计信息。我们都知道只有当作业处于运行中的状态,才能够查看到相关的WebUI统计信息。通过 History Server 我们才能查询这些已完成作业的统计信息,无论是正常退出还是异常退出。
此外,它对外提供了 REST API,它接受 HTTP 请求并使用 JSON 数据进行响应。Flink 任务停止后,JobManager 会将已经完成任务的统计信息进行存档,History Server 进程则在任务停止后可以对任务统计信息进行查询。比如:最后一次的 Checkpoint、任务运行时的相关配置。
配置历史服务器:
1)创建存储目录
hadoop fs -mkdir -p /logs/flink-job
2)在flink配置问价flink-conf.yaml进行配置
jobmanager.archive.fs.dir: hdfs://hadoop102:9000/logs/flink-job
historyserver.web.address: hadoop102
historyserver.web.port: 8082
historyserver.archive.fs.dir: hdfs://hadoop102:9000/logs/flink-job
historyserver.archive.fs.refresh-interval: 5000
注意:这里hdfs://hadoop102:9000/logs/flink-job的端口需要根据hadoop版本来定。hadoop1.x是8020,hadoop2.x是9000
3)启动历史服务器
[root@hadoop102 bin]# ./historyserver.sh start
Starting historyserver daemon on host hadoop102.# 启动成功会有一个HistoryServer的进程
HistoryServer
4)停止历史服务器
[root@hadoop102 bin]# ./historyserver.sh stop
5)在浏览器地址栏输入:**[http://hadoop102:8082]**查看已经停止的job的统计信息
相关文章:

《Flink学习笔记》——第三章 Flink的部署模式
不同的应用场景,有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。 3.1 部署模式(作业角度/通用分类) 根据集群的生命周期、资源的分配方式、main方法到底在哪里执行——客户端还是Client还是JobManage…...

网络安全(黑客技术)0基础学习手册
目录梗概 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来…...

腾讯云服务器价格表大全_轻量服务器_CVM云服务器报价明细
腾讯云服务器租用费用表:轻量应用服务器2核2G4M带宽112元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天,腾讯云服务器网长期更新腾讯云轻量…...

vue中bus的使用和涉及到的问题
创建一个js文件 import Vue from "Vue" export default new Vue 我们可以直接在要使用的页面中引用使用 import bus from /assets/js/eventBus.js;bus.$emit("info", "123") // 使用bus.$on("info", (val) > { // 接收console.l…...

Flink的简要概述
以下是Flink的各种架构的简要概述: 1. Flink概述:Apache Flink是一个开源的流处理和批处理框架,具有高性能、容错性和数据一致性保证。它支持事件驱动的流处理和批量处理,并提供了丰富的API和工具来处理实时数据流和大规模数据集…...

多线程下的signal信号处理
多线程中,信号在哪个线程中处理是不确定的,可能被任意一个线程处理 下边的代码可以验证该结论,多次Ctrlc,会被不同的线程捕获此信号,并处理,最终每个线程死锁,阻塞在等待锁的状态 #include &l…...

〖Python网络爬虫实战㉞〗- 图形验证码OCR识别
订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者࿱…...

Python Scrapy网络爬虫框架从入门到实战
Python Scrapy是一个强大的网络爬虫框架,它提供了丰富的功能和灵活的扩展性,使得爬取网页数据变得简单高效。本文将介绍Scrapy框架的基本概念、用法和实际案例,帮助你快速上手和应用Scrapy进行数据抓取。 Scrapy是一个基于Python的开源网络爬…...

后端面试话术集锦第四篇:ElasticSearch面试话术
🚗后端面试集锦目录 💖后端面试话术集锦第 1 篇:spring面试话术💖 💖后端面试话术集锦第 2 篇:spring boot面试话术💖 💖后端面试话术集锦第 3 篇:spring cloud面试话术💖 💖后端面试话术集锦第 4 篇:ElasticSearch面试话术💖 💖后端面试话术集锦第 5 …...

C++之ifstream成员函数get、tellg、eof实例(一百八十五)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

安卓webview,网页端生成安卓项目(极速生成)教程
安卓webview,网页端生成安卓项目(极速生成)教程 一,前言 当自己做了一个PC端的页面,也就是前端的页面,或者已经上服的页面,但也想生成一个安卓端供用户使用,本教程详细讲解如何把前…...

如何在vscode导入下载的插件安装包
点击vscode插件 --> 点击3个点 --> 选择从VSIX安装 点击更新报 Cannot update while running on a read-only volume. The application is on a read-only volume. Please move the application and try again. If you’re on macOS Sierra or later, you’ll need to m…...

springboot 多线程实战
先说下业务场景,业务1:基于实时轨迹数据打卡,业务2:基于非实时轨迹的时间差,计算累计时长。 简单点说就是从websocket获取到的实时数据,既要兼容不耗时操作,又要兼容耗时操作。 单线程做的话&a…...

求生之路2社区服务器sourcemod安装配置搭建教程centos
求生之路2社区服务器sourcemod安装配置搭建教程centos 大家好我是艾西,通过上文我们已经成功搭建了求生之路2的服务端。但是这个服务端是纯净的服务端,就是那种最纯粹的原版。如果想要实现插件、sm开头的命令等功能,需要安装这个sourcemod。…...

通达OAV12版本,表单及流程,定制开发总结
通达OA-V12版本,表单及流程,定制开发总结 触发器金蝶系统对接 日期:2023年8月29日 触发器 一键转交操作,不会调用触发器。 解决办法:可以按需要按步骤,关闭一键转交按钮。这里会隐藏一键转交、一键结束按钮…...

浅析Linux 物理内存外碎片化
本文出现的内核代码来自Linux4.19,如果有兴趣,读者可以配合代码阅读本文。 一、Linux物理内存外碎片化概述 什么是Linux物理内存碎片化?Linux物理内存碎片化包括两种: 1.物理内存内碎片:指分配给用户的内存空间中未…...

C#中的get和set
当我们定义属性的 get 访问器和 set 访问器时,其中的 return 和 value 分别代表以下含义: return:在 get 访问器中使用,表示返回属性的值给调用方。它用于将属性关联的字段的值返回给外部代码。value:在 set 访问器中…...

mysql8.0以上忘记密码的重置方法 - window系统
1、关闭 mysql 服务,以 管理员身份 运行命令提示符工具,执行下面的命令 net stop mysql可以在任务管理器的服务中查看状态 2、跳过 mysql 权限验证,以管理员身份运行 cmd,进入 mysql 的安装 bin 目录,执行如下指令 m…...

手写Vue3响应式数据原理
Vue3响应式数据 前言一、proxy是什么?1.1 proxy基本使用 二、实现最基本的reactive函数三、实现基本响应式系统四、完善基本响应式系统4.1 执行每一个副作用函数4.2 实现依赖收集4.2.1 基本实现 4.3 改进桶结构 五、相关面试题1.Object.defineProperty 和 Proxy 的区…...

基于PIC单片机篮球计分计时器
一、系统方案 本设计采用PIC单片机作为主控制器,矩阵键盘控制,比分,计时控制,24秒,液晶12864显示。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 2、液晶显示程序 /*************…...

关于Maxwell与Kafka和数据库的监控
1.Maxwell的配置 其实就是配置两端的配置信息,都要能连接上,然后才能去传输数据 config.properties #Maxwell数据发送目的地,可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis producerkafka # 目标Kafka集群地址 kafka.bootstrap.servershadoop102…...

【设计模式】Java设计模式详细讲解
一、概述 Java设计模式是Java程序设计中一种重要的最佳实践,它提供了一种框架和结构,可以帮助开发者更好地理解和设计复杂的系统。设计模式不仅仅是一种语法规则,更是一种思想和方法论,它能够帮助开发者更好地分析、设计和实现软…...

【MySQL】表的增删查改(进阶)
目录 1.数据库约束 1.1NOT NULL:非空约束 1.2UNIQUE:唯一值约束 1.3DEFAULT:默认值约束 1.4PRIMARY KEY:主键约束 1.5FOREIGN KEY:外键约束 1.6CHECK约束 2.表的设计 2.1一对一 2.2一对多 2.3多对多 3.新增…...

Vim几种跳转方式
ps: 以下时我常用的一些跳转指令,用于参考和复习记忆。还有一些后续会更新。 文件内跳转 移动光标 普通模式下左h,右l,上k,下j。(可以使用数字hlkj,实现跳跃式移动)。 字符间跳转 …...

element-ui 弹窗里面嵌套弹窗,解决第二个弹窗被遮罩层掩盖无法显示的问题
当我们在 element-ui 中使用弹窗嵌套弹窗时,会出现第二个弹窗打开时被一个遮罩层挡着,就像下面这样: 下面提供两种解决方案 : 一、第一种方案 我们查询element-ui 官网可以发现 el-dialog 有这样几个属性: 具体使用就…...

【业务功能篇76】微服务网关路由predicates断言条件-filters路由转换地址-跨域问题-多级目录树化层级设计-mybatisPlus逻辑删除
业务开发-基础业务-分类管理 启动renren-fast如果出现如下错误 -Djps.track.ap.dependenciesfalse 添加相关配置即可 分类管理 1.后端分类接口 JDK8特性:https://blog.csdn.net/qq_38526573/category_11113126.html 在后端服务中我们需要查询出所有的三级分类信…...

apache的ab工具测试网页优化效果速度以及服务器承载
今天为大家介绍一款apache自带的一种的测试网页优化效果速度以及服务器承载的工具——ab.exe。 大家在工作中或者开发中可以使用apache的ab工具来测试自己的网站并发量大小,和某个页面的访问时间。 一、基本用法 如果你是用的是apache的话,那么只要进…...

【进阶篇】MySQL 存储引擎详解
文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构:InnoDB索引页结构: 3. MVCC 详解3.1. 版本号分配:3.2. 数据读取:3.3. 数据写入:3.4. 事务隔离级别ÿ…...

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍
一,spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成,以实现更便捷的开发和管理。在集成过程中,Spring 提供了许多特性和功能,如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…...

PyCharm下安装配置PySide6开发环境(Qt Designer(打开,编辑)、PyUIC和PyRCC)
一.准备工作 1.安装python和pycharm并配置好环境变量 python安装路径 pycharm安装路径: python系统变量: pycharm环境变量: 注意:正常安装,并勾选ADD PATH一般会自动配好 2.在pycharm创建一个新的python的虚拟环境 …...