当前位置: 首页 > news >正文

Flink 部署模式

目录

概述

部署模式

会话模式(Session Mode)

单作业模式(Per-Job Mode)

应用模式(Application Mode)

运行模式(资源管理模式)

Standalone运行模式

会话模式部署

应用模式部署

Yarn运行模式

会话模式部署

单作业模式部署

应用模式部署

优化

K8S运行模式(了解)


概述

Flink 是一个多功能框架,以混合搭配的方式支持许多不同的部署场景。

下图显示了每个 Flink 集群的构建块。
 

Flink客户端:它获取 Flink 应用程序的代码,将其转换为 JobGraph 并将其提交给 JobManager。

JobManager :是 Fl​​ink 中央工作协调组件的名称。它具有针对不同资源提供者的实现,这些实现在高可用性、资源分配行为和支持的作业提交模式方面有所不同。将工作分配到 TaskManager,其中运行实际操作符(例如sources, transformations 和 sinks)。

TaskManager: 是实际执行 Flink 作业工作的服务。

Flink作业提交的一般提交流程如下:

部署模式

在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:

  • Application Mode(应用模式):专门为一个应用程序运行集群。作业的main方法在 JobManager 上执行。支持在应用程序中多次调用“execute”/“executeAsync”。
  • Per-Job Mode(Per-Job 模式)(已弃用):专门为一项作业运行一个集群。作业的main方法在客户端运行。
  • Session Mode(会话模式):一个 JobManager 实例管理同一 TaskManager 集群的多个作业。

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

会话模式(Session Mode)

会话模式:先启动一个集群,保持一个会话,通过客户端提交作业。集群启动时所有资源就都已经确定,所以所有提交的作业会竞争集群中的资源。

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

单作业模式(Per-Job Mode)

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

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

应用模式(Application Mode)

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

所以应用模式的解决办法就是,直接把应用提交到JobManger上运行。我们需要为每一个提交的应用单独启动一个JobManager,也就是创建一个集群。这个JobManager只为执行这一个应用而存在,执行结束之后JobManager也就关闭了,这就是所谓的应用模式。

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

运行模式(资源管理模式)

在了解了Flink的三种部署模式后,运行Flink作业需要资源,按照运行时使用资源的不同可以分为有三种:Standalone运行模式、Yarn运行模式、K8S运行模式。每种运行模式中,可以有不同的部署模式。

Standalone运行模式

Standalone运行模式:使用Flink集群的资源来运行Flink作业。

三种部署模式中,Standalone运行模式支持会话模式部署和应用模式部署,不支持单作业模式部署。

会话模式部署

提前启动集群,并通过Web页面/flink run命令客户端提交任务(可以多个任务,但是集群资源固定)。

案例:使用会话模式运行一个flink作业,例如:自己编写的WordCount作业,可参考Flink WordCount实践

启动flink standalone集群

[hadoop@node2 ~]$ start-cluster.sh

在node2启动nc命令

[hadoop@node2 ~]$ nc -lk 7777
​
Web UI提交作业

(1)任务打包完成后,我们打开Flink的WEB UI页面,在右侧导航栏点击“Submit New Job”,然后点击按钮“+ Add New”,选择要上传运行的JAR包,如下图所示。

点击jar包名称,填写主类和并行度信息

主类:org.example.wc.SocketStreamWordCount

并行度:1

点击Submit提交作业

测试

在nc终端发送数据

[hadoop@node2 ~]$ nc -lk 7777
hello world
​

查看结果

命令行提交作业

命令执行

[hadoop@node2 ~]$ flink run -m node2:8081 -c org.example.wc.SocketStreamWordCount flinkdemo-1.0-SNAPSHOT.jar

测试

[hadoop@node2 ~]$ nc -lk 7777
hello flink
​

在node3的Task Manager中查看到结果

注意:计算的机器不固定是node3,也可能在其他机器上。

在node3上,命令行查看结果

[hadoop@node3 ~]$ cd $FLINK_HOME/
[hadoop@node3 flink-1.17.1]$ ls
bin  conf  examples  lib  LICENSE  licenses  log  NOTICE  opt  plugins  README.txt
[hadoop@node3 flink-1.17.1]$ cd log/
[hadoop@node3 log]$ ls
flink-hadoop-client-node2.log            flink-hadoop-taskexecutor-0-node3.log.3
flink-hadoop-client-node3.log            flink-hadoop-taskexecutor-0-node3.log.4
flink-hadoop-taskexecutor-0-node3.log    flink-hadoop-taskexecutor-0-node3.log.5
flink-hadoop-taskexecutor-0-node3.log.1  flink-hadoop-taskexecutor-0-node3.out
flink-hadoop-taskexecutor-0-node3.log.2
[hadoop@node3 log]$ tail flink-hadoop-taskexecutor-0-node3.out 
(hello,1)
(flink,1)​
应用模式部署

应用模式下不会提前创建集群,所以不能调用start-cluster.sh脚本。我们可以standalone-job.sh来创建一个JobManager。

具体步骤如下:

(0)准备工作

如果之前开启了集群进程,先关闭之前开启的集群进程

[hadoop@node2 ~]$ stop-cluster.sh

如果之前没有开启集群进程,则不用关闭集群。

在node2中执行以下命令启动netcat。

[hadoop@node2 ~]$ nc -lk 7777
​

(1)进入到Flink的安装路径下,将应用程序的jar包放到lib/目录下。

[hadoop@node2 ~]$ mv flinkdemo-1.0-SNAPSHOT.jar $FLINK_HOME/lib/

(2)启动JobManager,并指定作业入口。

[hadoop@node2 ~]$ standalone-job.sh start --job-classname org.example.wc.SocketStreamWordCount
Starting standalonejob daemon on host node2.
​

这里我们直接指定作业入口类,脚本会到lib目录扫描所有的jar包。

查看进程,看到JobManager已经启动

[hadoop@node2 ~]$ jps
5061 StandaloneApplicationClusterEntryPoint
5095 Jps
​

(3)启动TaskManager

​
[hadoop@node2 ~]$ taskmanager.sh start
Starting taskexecutor daemon on host node2.
[hadoop@node2 ~]$ jps
5457 Jps
5061 StandaloneApplicationClusterEntryPoint
5429 TaskManagerRunner
​
​
[hadoop@node3 log]$ taskmanager.sh start
Starting taskexecutor daemon on host node3.
[hadoop@node3 log]$ jps
3105 TaskManagerRunner
3175 Jps
​
​
[hadoop@node4 log]$ taskmanager.sh start
Starting taskexecutor daemon on host node4.
[hadoop@node4 log]$ jps
2708 Jps
2637 TaskManagerRunner

注意:这里在集群里所有机器(node2、node3、node4)都启动TaskManager,也可以按需启动特定的机器作为TaskManager。

(4)发送单词数据

[hadoop@node2 ~]$ nc -lk 7777
hello hadoop
​

(5)在node2:8081查看结果

Yarn运行模式

使用YARN资源来运行Flink作业。

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

三种部署模式中,YARN运行模式均支持。

(1)配置环境变量,增加环境变量配置如下:

[hadoop@node2 ~]$ sudo vim /etc/profile.d/my_env.sh

添加如下内容

#FLINK YARN MODE NEED USE HADOOP CONF
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_CLASSPATH=`hadoop classpath`

让环境变量生效

[hadoop@node2 ~]$ source /etc/profile

注意:如果只在node2提交作业,只需要在node2上执行,不用分发到其他机器上(如果需要在其他机器操作,也需要设置。)。`符号表示在shell里执行命令。

(2)启动Hadoop集群,包括HDFS和YARN。

[hadoop@node2 ~]$ start-dfs.sh
[hadoop@node3 ~]$ start-yarn.sh

(3)在node2中执行以下命令启动netcat。

[hadoop@node2 ~]$ nc -lk 7777
​
会话模式部署

YARN的会话模式与独立集群略有不同,需要首先申请一个YARN会话(YARN Session)来启动Flink集群。

YARN Session模式作业提交流程如下:

查看命令帮助

[hadoop@node2 ~]$ yarn-session.sh --help
...
省略若干日志信息输出
...
Usage:Optional-at,--applicationType <arg>     Set a custom application type for the application on YARN-D <property=value>             use value for given property-d,--detached                   If present, runs the job in detached mode-h,--help                       Help for the Yarn session CLI.-id,--applicationId <arg>       Attach to running YARN session-j,--jar <arg>                  Path to Flink jar file-jm,--jobManagerMemory <arg>    Memory for JobManager Container with optional unit (default: MB)-m,--jobmanager <arg>           Set to yarn-cluster to use YARN execution mode.-nl,--nodeLabel <arg>           Specify YARN node label for the YARN application-nm,--name <arg>                Set a custom name for the application on YARN-q,--query                      Display available YARN resources (memory, cores)-qu,--queue <arg>               Specify YARN queue.-s,--slots <arg>                Number of slots per TaskManager-t,--ship <arg>                 Ship files in the specified directory (t for transfer)-tm,--taskManagerMemory <arg>   Memory per TaskManager Container with optional unit (default: MB)-yd,--yarndetached              If present, runs the job in detached mode (deprecated; use non-YARN specific option instead)-z,--zookeeperNamespace <arg>   Namespace to create the Zookeeper sub-paths for high availability mode
​

常用参数解读:

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

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

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

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

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

启动一个YARN session

[hadoop@node2 ~]$ yarn-session.sh -nm test
...
省略部分日志输出
...
2024-04-16 17:49:09,244 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface node3:37102 of application 'application_1713260243932_0002'.
JobManager Web Interface: http://node3:37102
​

可以看到:YARN Session启动之后会给出一个YARN application ID以及一个Web UI地址(http://node3:37102),Web UI地址是随机的,每次启动Session的Web UI地址也可能不一样。

注意:flink1.17的YARN模式,会自动覆盖之前standalone集群的配置。所以node3也可以作为master节点。

浏览器访问Web UI

node3:37102

通过Web UI提交作业

测试

nc发送数据

Web UI查看结果

8088端口查看作业

也可以点击Tracking UI的ApplicationMaster进入Flink Web UI界面

取消作业

通过命令行提交作业

启动yarn-session

[hadoop@node2 ~]$ yarn-session.sh -nm test
...
省略部分输出
...
2024-04-16 20:30:50,602 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface node2:37680 of application 'application_1713270240854_0001'.
JobManager Web Interface: http://node2:37680
​

 查看Web UI

http://node2:37680

此时还没有可用的Task Managers和Task Slots

将Flink作业jar包上传到node3

将该任务提交到已经开启的Yarn-Session中运行。

[hadoop@node3 ~]$ flink run -c org.example.wc.SocketStreamWordCount -m node2:37680 flinkdemo-1.0-SNAPSHOT.jar

提交作业后,Task Managers 变为1,Total Task Slots也为1

查看正在运行的作业

测试

发送数据

[hadoop@node2 ~]$ nc -lk 7777
hello flink
hello hadoop
​

刷新结果

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

node3:8088

Web UI查看结果

可以看到,通过8088同样也可以查看到Flink的Web UI,并能查看到作业的运行情况。

查看日志

命令查看日志

[hadoop@node3 ~]$ yarn logs -applicationId application_1713270240854_0001 
​
[hadoop@node3 ~]$ yarn logs -applicationId application_1713270240854_0001 | tail 
[hadoop@node3 ~]$ yarn logs -applicationId application_1713270240854_0001 | less

停止session

退回查看应用状态

改成是kill掉session,使用命令停止session更加优雅。

重新开启一个session会话

[hadoop@node2 ~]$ yarn-session.sh -nm test -d
...
2024-04-16 21:25:21,517 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface node2:36883 of application 'application_1713270240854_0002'.
JobManager Web Interface: http://node2:36883
2024-04-16 21:25:21,973 INFO  org.apache.flink.yarn.cli.FlinkYarnSessionCli                [] - The Flink YARN session cluster has been started in detached mode. In order to stop Flink gracefully, use the following command:
$ echo "stop" | ./bin/yarn-session.sh -id application_1713270240854_0002
If this should not be possible, then you can also kill Flink via YARN's web interface or via:
$ yarn application -kill application_1713270240854_0002
Note that killing Flink might not clean up all job artifacts and temporary files.
[hadoop@node2 ~]$ 

输出日志中看到,优雅地停止flink session的命令是

echo "stop" | ./bin/yarn-session.sh -id application_1713270240854_0002

查看8088端口,多了一个应用application_1713270240854_0002

优雅地停止flink应用

[hadoop@node2 ~]$ echo "stop" | yarn-session.sh -id application_1713270240854_0002
...
2024-04-16 21:31:48,210 INFO  org.apache.hadoop.yarn.client.RMProxy                        [] - Connecting to ResourceManager at node3/192.168.193.143:8032
2024-04-16 21:31:48,644 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface node2:36883 of application 'application_1713270240854_0002'.
2024-04-16 21:31:49,765 INFO  org.apache.flink.yarn.cli.FlinkYarnSessionCli                [] - Deleted Yarn properties file at /tmp/.yarn-properties-hadoop
2024-04-16 21:31:49,769 INFO  org.apache.flink.yarn.cli.FlinkYarnSessionCli                [] - Application application_1713270240854_0002 finished with state FINISHED and final state SUCCEEDED at 1713274309726
​

查看作业State为FINISHED,FinalStatus为SUCCEEDED

单作业模式部署

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

(1)执行命令提交作业。

在node3提交作业

[hadoop@node3 ~]$ flink run -d -t yarn-per-job -c org.example.wc.SocketStreamWordCount flinkdemo-1.0-SNAPSHOT.jar 
​
------------------------------------------------------------The program finished with the following exception:
​
org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: No Executor found. Please make sure to export the HADOOP_CLASSPATH environment variable or have hadoop in your classpath. For more information refer to the "Deployment" section of the official Apache Flink documentation.at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:372)at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:222)at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:105)at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:851)at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:245)at org.apache.flink.client.cli.CliFrontend.parseAndRun(CliFrontend.java:1095)at org.apache.flink.client.cli.CliFrontend.lambda$mainInternal$9(CliFrontend.java:1189)at org.apache.flink.runtime.security.contexts.NoOpSecurityContext.runSecured(NoOpSecurityContext.java:28)at org.apache.flink.client.cli.CliFrontend.mainInternal(CliFrontend.java:1189)at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:1157)
Caused by: java.lang.IllegalStateException: No Executor found. Please make sure to export the HADOOP_CLASSPATH environment variable or have hadoop in your classpath. For more information refer to the "Deployment" section of the official Apache Flink documentation.
​

因为,此前只在node2设置了环境变量,所以哪台需要以单作业运行,需要设置hadoop相关环境变量。

设置hadoop classpath环境变量后

再次执行

[hadoop@node3 ~]$ flink run -d -t yarn-per-job -c org.example.wc.SocketStreamWordCount flinkdemo-1.0-SNAPSHOT.jar 
​

报错如下

2024-04-16 21:53:16,364 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface node2:42969 of application 'application_1713270240854_0003'.
Job has been submitted with JobID 2da4916c92fe28098976286b72700f6c
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.util.FlinkUserCodeClassLoaders$SafetyNetWrapperClassLoader.ensureInner(FlinkUserCodeClassLoaders.java:184)at org.apache.flink.util.FlinkUserCodeClassLoaders$SafetyNetWrapperClassLoader.getResource(FlinkUserCodeClassLoaders.java:208)
​

解决方式:

方法1.配置文件flink-conf.yaml添加如下配置,并分发到其他机器。

classloader.check-leaked-classloader: false

方法2.命令行设置-Dclassloader.check-leaked-classloader=false

 

这里采用方法2解决。

[hadoop@node3 ~]$ flink run -d -t yarn-per-job -c org.example.wc.SocketStreamWordCount -Dclassloader.check-leaked-classloader=false flinkdemo-1.0-SNAPSHOT.jar

   ...省略部分输出...

2024-04-16 21:58:45,827 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Cannot use kerberos delegation token manager, no valid kerberos credentials provided.
2024-04-16 21:58:45,845 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Submitting application master application_1713270240854_0004
2024-04-16 21:58:45,908 INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl        [] - Submitted application application_1713270240854_0004
2024-04-16 21:58:45,909 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Waiting for the cluster to be allocated
2024-04-16 21:58:45,911 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Deploying cluster, current state ACCEPTED
2024-04-16 21:58:54,017 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - YARN application has been deployed successfully.
2024-04-16 21:58:54,018 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - The Flink YARN session cluster has been started in detached mode. In order to stop Flink gracefully, use the following command:
$ echo "stop" | ./bin/yarn-session.sh -id application_1713270240854_0004
If this should not be possible, then you can also kill Flink via YARN's web interface or via:
$ yarn application -kill application_1713270240854_0004
Note that killing Flink might not clean up all job artifacts and temporary files.
2024-04-16 21:58:54,019 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface node4:44661 of application 'application_1713270240854_0004'.
Job has been submitted with JobID ef5ff58d20e6acc616eeb4a2c32352e5
[hadoop@node3 ~]$ 
​

点击ApplicationMaster跳到Web UI界面,这里003作业可以跳过去,003和004都在跑,资源不够。停掉003和004,然后,重新启动per-job作业,此时作业ID为005

点击跳转到Flink Web UI界面如下

测试

nc发送数据,例如:hello java

查看Web UI结果

可以使用命令行查看或取消作业

查看作业命令:

[hadoop@node3 ~]$ flink list -t yarn-per-job -Dyarn.application.id=application_1713270240854_0005

取消作业命令格式:

flink cancel -t yarn-per-job -Dyarn.application.id=application_xxxx_yy <jobId>

这里的application_XXXX_YY是当前应用的ID,<jobId>是作业的ID。注意如果取消作业,整个Flink集群也会停掉。

具体命令如下:

flink cancel -t yarn-per-job -Dyarn.application.id=application_1713270240854_0005 5ca1a56ec0b15b0a3f5990438dde8430

查看8088端口

应用模式部署

应用模式部署,允许main()方法在JobManager上执行,这样可以分担Client的压力。

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

per-job模式命令

flink run -d -t yarn-per-job -c org.example.wc.SocketStreamWordCount -Dclassloader.check-leaked-classloader=false flinkdemo-1.0-SNAPSHOT.jar

应用模式命令

flink run-application -d -t yarn-application -c org.example.wc.SocketStreamWordCount -Dclassloader.check-leaked-classloader=false flinkdemo-1.0-SNAPSHOT.jar

区别:

1.per-job是run,应用模式是run-application

2.per-job -t是yarn-per-job,应用模式 -t是yarn-application

执行应用模式

[hadoop@node3 ~]$ flink run-application -d -t yarn-application -c org.example.wc.SocketStreamWordCount -Dclassloader.check-leaked-classloader=false flinkdemo-1.0-SNAPSHOT.jar

部分日志如下

测试

nc发送数据

hello flink

查看结果

查看或取消作业命令格式

$ flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
​
$ flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>

查看作业

[hadoop@node3 ~]$ flink list -t yarn-application -Dyarn.application.id=application_1713270240854_0006

取消作业

[hadoop@node3 ~]$ flink cancel -t yarn-application -Dyarn.application.id=application_1713270240854_0006 c09dd8a76391a1264d3b33fec7f80266

优化

把作业需要用到的依赖、插件等资源提前上传到HDFS,作业需要的资源直接从HDFS获取。

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

(1)上传flink的lib和plugins到HDFS上

[hadoop@node3 ~]$ hadoop fs -mkdir /flink-dist
[hadoop@node3 ~]$ hadoop fs -put $FLINK_HOME/lib/ /flink-dist
[hadoop@node3 ~]$ hadoop fs -put $FLINK_HOME/plugins/ /flink-dist
[hadoop@node3 ~]$ hdfs dfs -ls /flink-dist
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2024-04-16 22:54 /flink-dist/lib
drwxr-xr-x   - hadoop supergroup          0 2024-04-16 22:54 /flink-dist/plugins
[hadoop@node3 ~]$ 
​

put操作提示

2024-04-16 22:54:59,200 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

不用管这个提示信息。

(2)上传Flink作业jar包到HDFS

[hadoop@node3 ~]$ hadoop fs -mkdir /flink-jars
[hadoop@node3 ~]$ hadoop fs -put flinkdemo-1.0-SNAPSHOT.jar /flink-jars

(3)提交作业

[hadoop@node3 ~]$ flink run-application -t yarn-application -Dyarn.provided.lib.dirs="hdfs://node2:9820/flink-dist" -c org.example.wc.SocketStreamWordCount hdfs://node2:9820/flink-jars/flinkdemo-1.0-SNAPSHOT.jar

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

测试

nc发送数据

hello flink

查看结果

查看作业

[hadoop@node3 ~]$ flink list -t yarn-application -Dyarn.application.id=application_1713270240854_0008

取消作业

[hadoop@node3 ~]$ flink cancel -t yarn-application -Dyarn.application.id=application_1713270240854_0008 5656744f88b9384620d93d178859d047

K8S运行模式(了解)

使用K8S资源来运行Flink作业。

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

K8S原生Session模式作业提交流程如下:

完成!enjoy it!

相关文章:

Flink 部署模式

目录 概述 部署模式 会话模式&#xff08;Session Mode&#xff09; 单作业模式(Per-Job Mode) 应用模式(Application Mode) 运行模式&#xff08;资源管理模式&#xff09; Standalone运行模式 会话模式部署 应用模式部署 Yarn运行模式 会话模式部署 单作业模式部…...

第十三节:Vben Admin实战-系统管理之菜单管理

系列文章目录 基础篇 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式…...

2024------MySQL数据库基础知识点总结

-- 最好的选择不是最明智的&#xff0c;而是最勇敢的&#xff0c;最能体现我们真实意愿的选择。 MySQL数据库基础知识点总结 一、概念 数据库&#xff1a;DataBase&#xff0c;简称DB。按照一定格式存储数据的一些文件的组合顾名思义: 存储数据的仓库&#xff0c;实际上就是一…...

机器学习之基于Jupyter中国环境治理投资数据分析及可视化

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 机器学习之基于Jupyter中国环境治理投资数据分析及可视化项目是一个结合了机器学习和数据可视化技术的项目&#xf…...

【Word】写论文,参考文献涉及的上标、尾注、脚注 怎么用

一、功能位置 二、脚注和尾注区别 1.首先脚注是一个汉语词汇&#xff0c;论文脚注就是附在论文页面的最底端&#xff0c;对某些内容加以说明&#xff0c;印在书页下端的注文。脚注和尾注是对文本的补充说明。 2.其次脚注一般位于页面的底部&#xff0c;可以作为文档某处内容的…...

能将图片转为WebP格式的WebP Server Go

本文完成于 2023 年 11 月 之前老苏介绍过 webp2jpg-online&#xff0c;可以将 webp 格式的图片&#xff0c;转为 jpg 等&#xff0c;今天介绍的 WebP Server Go 是将 jpg 等转为 webp 格式 文章传送门&#xff1a;多功能图片转换器webp2jpg-online 什么是 WebP ? WebP 它是由…...

省份数量00

题目链接 省份数量 题目描述 注意点 1 < n < 200isConnected[i][j] 为 1 或 0isConnected[i][i] 1isConnected[i][j] isConnected[j][i] 解答思路 最初想到的是广度优先遍历&#xff0c;当某个城市不属于省份&#xff0c;需要从该城市开始&#xff0c;根据isConne…...

Android Native内存泄漏检测方案详解

文章目录 1. AddressSanitizer (ASan)2. LeakSanitizer (LSan)3. Valgrind4. 手动检测5. 实践建议6. 总结 在Android Native层开发过程中&#xff0c;内存泄漏是一个常见的问题。内存泄漏不仅会导致应用程序占用越来越多的内存&#xff0c;还可能引发性能问题和崩溃。因此&…...

有限单元法-编程与软件应用(崔济东、沈雪龙)【PDF下载】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…...

蓝桥杯练习系统(算法训练)ALGO-950 逆序数奇偶

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 老虎moreD是一个勤于思考的青年&#xff0c;线性代数行列式时&#xff0c;其定义中提到了逆序数这一概念。不过众所周知我们…...

uniapp踩坑 uni.showToast 和 uni.showLoading

uniapp踩坑 uni.showToast 和 uni.showLoading 一、问题描述 uni.showLoading 和 uni.showToast 混合使用时&#xff0c;showLoading和showToast会相互覆盖对方&#xff0c;调用hideLoading时也会将toast内容进行隐藏。 二、触发条件 1.uniapp中使用自己封装的axois&#x…...

BIGRU、CNN-BIGRU、CNN-BIGRU-ATTENTION、TCN-BIGRU、TCN-BIGRU-ATTENTION合集

&#xff08;BIGRU、CNN-BIGRU、CNN-BIGRU-ATTENTION、TCN-BIGRU、TCN-BIGRU-ATTENTION&#xff09;时&#xff0c;我们可以从它们的基本结构、工作原理、应用场景以及优缺点等方面进行详细介绍和分析。 BIGRU、CNN-BIGRU、CNN-BIGRU-ATTENTION、TCN-BIGRU等&#xff08;matlab…...

通过 Java 操作 redis -- 基本通用命令

目录 使用 String 类型的 get 和 set 方法 使用通用命令 exists &#xff0c;del 使用通用命令 keys 使用通用命令 expire,ttl 使用通用命令 type 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 关…...

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…...

个股期权是什么期权?个股期权什么时候推出?

今天期权懂带你了解个股期权是什么期权&#xff1f;个股期权什么时候推出&#xff1f;期权也称选择权&#xff0c;是指期权的买方有权在约定的期限内&#xff0c;按照事先确定的价格&#xff0c;买入或卖出一定数量某种特定商品或金融指标的权利。 个股期权是什么期权&#xff…...

TCP UDP

传输层 端口号 tcp udp 网络层 IP地址 IP TCP&#xff0c;UDP 1&#xff0c;TCP是面向链接的协议&#xff0c;而UDP是无连接的协议; 2&#xff0c;TCP协议的传输是可靠的&#xff0c;而UDP协议的传输“尽力而为” 3&#xff0c;TCP可以实现流控&#xff0c;但UDP不行;…...

PCIE协议-1

1. PCIe结构拓扑 一个结构由点对点的链路组成&#xff0c;这些链路将一组组件互相连接 - 图1-2展示了一个结构拓扑示例。该图展示了一个称为层级结构的单一结构实例&#xff0c;由一个根复合体&#xff08;Root Complex, RC&#xff09;、多个端点&#xff08;I/O设备&#xf…...

[C++][PCL]pcl安装包预编译包国内源下载地址

版本名称下载地址PCL-1.14.1-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.14.0-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.13.1-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.13.0-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.12.1-AllInOne-msvc2019-win64含…...

海洋行业工业气体检测传感器的重要性

海洋行业是一个广阔而复杂的领域&#xff0c;涉及多个分支和应用&#xff0c;包括浮式生产、储存和卸载&#xff08;FPSO&#xff09;装置、渡轮和潜艇等。这些船舶和设施在执行任务时&#xff0c;都可能遇到各种潜在的气体危害。因此&#xff0c;对于海洋行业来说&#xff0c;…...

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…...

5V升9V2A升压恒压WT3231

5V升9V2A升压恒压WT3231 WT3231&#xff0c;一款性能卓越的DC-DC转换器&#xff0c;采用了集成10A、26mΩ功率的MOSFET电源开关转换器。它能够输出高达12V的电压&#xff0c;稳定可靠。这款产品以固定的600KHz运行&#xff0c;因此可以使用小型的外部感应器和电容器&#xff0…...

Java中枚举类的使用详解

Java中枚举类的使用详解 在Java编程中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的类&#xff0c;用于表示固定数量的常量。与常量相比&#xff0c;枚举类型具有类型安全、可读性强和易于管理的优点。下面我们将详细讲解Java中枚举类的使用&#xff0c;并通过示…...

C++11 设计模式6. 建造者模式,也叫做生成器模式

一 什么是建造者模式&#xff1f; // 小木公司对于SQL有配置&#xff0c;因此要输入sql url&#xff0c;然后输入 sql username&#xff0c;然后是 sql ps //因此小木就想到了使用 SystemConfig这个类来完成上述的三个初始化 //5.1号小木公司加入了redis的缓存机制&#xff0…...

GPS与精致农业 无人机应用 农业遥感 农业类

全球定位系统是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。GPS系统最基本的特点是以“多星、高轨、高频、测量-测距”为体制&#xff0c;以高精度的原子钟为核心。GPS作为新一代卫星导航与定位系统&#xff0c;不仅具有全球性、全…...

Kotlin注解简介

Kotlin注解 注解&#xff08;Annotations&#xff09;在 Kotlin 中和在 Java 中有类似的地位&#xff0c;它们都是元数据的形式&#xff0c;为代码提供了额外的信息。注解不会直接影响代码的操作&#xff0c;但可以被编译器或者运行时环境用来生成额外的代码、进行类型检查、处…...

代码随想录训练营

Day45代码随想录 322.零钱兑换 1.题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -…...

java中的变量、数据类型、人机交互

变量 变量要素 1、类型&#xff1b;每一个变量都需要定义类型&#xff08;强类型&#xff09;其它语言有弱类型&#xff08;js&#xff09; 2、变量名&#xff1b; 3、存储的值&#xff1b; 声明方式&#xff1a; 数据类型 变量名 变量值&#xff1b; public static vo…...

Python中的生成器是什么

生成器的工作原理 只要Python函数的主体中有yield关键字,该函数就是生成器函数。调用生成器函数,返回一个生成器对象。也就是说,生成器函数是生成器工厂。 下面以一个简单的函数说明生成器的行为: def gen123():yield 1yield 2yield 3print(gen123) # <function gen…...

【Camera2完整流程分析四】从log角度分析CameraService启动流程

下面直接带你通过log打印来一起读CameraService启动的过程。 1)Camera service对象构建,在启动的时候先创建CameraService 这里会打印: CameraService: CameraService started (pid=559)接着启动的时候会执行 –》onFirstRef() 进入这里面看,先输出打印: CameraService:…...

基于SSM SpringBoot vue教务排课系统

基于SSM SpringBoot vue教务排课系统 系统功能 登录 个人中心 学生信息管理 教师信息管理 课室信息管理 班级信息管理 系别信息管理 专业信息管理 课程信息管理 选课信息管理 课表信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Myba…...

深入理解 LinkedList 及底层源码分析

LinkedList 是基于链表结构的一种 List&#xff0c;在分析 LinkedList 源码前我们先对对链表结构做一个简单的了解。 一、链表的概念 链表是由一系列非连续的节点组成的存储结构&#xff0c;简单分下类的话&#xff0c;链表又分为_单向链表和双向链表&#xff0c;而单向 / 双…...

美易官方:英伟达业绩将难以撑起股价?

美股市场似乎总是对各大公司的业绩表现抱有极大的期待&#xff0c;就像一个永远填不饱的“巨胃”。在这样的市场环境下&#xff0c;即使是业绩骄人的公司也可能难以支撑其股价。英伟达&#xff0c;这家在图形处理单元&#xff08;GPU&#xff09;领域享有盛誉的公司&#xff0c…...

超实用干货!FP独立站引流攻略

在当前的市场环境下&#xff0c;对于希望继续从事FP和黑五类产品销售的商家来说&#xff0c;搭建独立站绝对是一个明智的选择。没有了第三方平台的限制&#xff0c;拥有自己的独立站意味着你可以完全掌控自己的商业策略和操作。 但脱离了平台&#xff0c;独立站推广会更加困难。…...

php之框架底层中间件模式开发实现、array_reduce的应用

众所周知php框架的中间件核心是通过array_reduce实现的 php之框架中间件模式开发实现、array_reduce的应用 1.先写个测试用例看一下函数的特性2.根据执行特性实现中间件 1.先写个测试用例看一下函数的特性 <?phpfunction kernal($a,$b){return $a . " and " .…...

fabric搭建生产网络

fabric搭建生产网络 一、生成组织结构与身份证书 解包 hyperledger-fabric-linux-amd64-2.5.0.tar.gz 1.1、crypto-config.yaml配置文件 ./bin/cryptogen showtemplate > crypto-config.yaml 将crypto-config.yaml内容修改为&#xff1a; # -------------------------…...

聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别

前言 有些小伙伴看到上一篇文章后&#xff0c;可能会发现中间件和我们之前讲的筛选器非常类似&#xff0c;比如它们都是通过 next 串起来的一系列的组件&#xff0c;并且都可以在请求处理前后执行代码&#xff0c;都可以通过不执行 next 来进行请求的终止。那么筛选器和中间件…...

Nginx配置Https缺少SSL模块

1、Linux下Nginx配置https nginx下载和安装此处就忽略&#xff0c;可自行百度 1.1、配置https 打开nginx配置文件 vim /opt/app/nginx/conf/nginx.conf相关https配置 server {listen 443 ssl; #开放端口server_name echarts.net;#域名#redirect to https#ssl on; #旧版#ssl证…...

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…...

串口通信标准RS232 RS485 RS422的区别

很多工程师经常把RS-232、RS-422、RS-485称为通讯协议&#xff0c;其实这是不对的&#xff0c;它们仅仅是关于串口通讯的一个机械和电气接口标准&#xff08;顶多是网络协议中的物理层&#xff09;&#xff0c;不是通讯协议&#xff0c;那它们又有哪些区别呢&#xff1a; 第一…...

jdk环境安装

jdk安装 创建软件安装的目录 mkdir -p /bigdata/{soft,server} /bigdata/soft 安装文件的存放目录 /bigdata/server 软件安装的目录 把安装的软件上传到/bigdata/soft 目录 解压到指定目录 -C :指定解压到指定目录 tar -zxvf /bigdata/soft/jdk-8u241-linux-x64.tar.gz -C /b…...

QT+网络调试助手+TCP服务器

一、UI界面设计 二、单线程 代码设计 1、 查找合法的本地地址&#xff0c;用于当作服务器的IP地址 #include <QThread> #include <QTcpSocket> #include <QNetworkInterface> #include <QMessageBox>QList<QHostAddress> ipAddressesList QNe…...

【unity】(1)场景

Unity的场景&#xff08;Scene&#xff09;是构建游戏中各种环境和级别的基础。一个场景可以包含游戏中的所有对象&#xff0c;如角色、道具、地形等。 创建和管理场景 创建新场景&#xff1a; 在Unity编辑器中&#xff0c;选择File > New Scene&#xff0c;或者使用快捷键…...

【Linux】进程间通信IPC机制

目录 一、无名管道 二、有名管道 三、共享内存 四、信号量 五、消息队列 六、套接字 一、无名管道 1.只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程)。 2.是一个单工的通信模式&#xff0c;具有固定的读端和写端。 3.管道也可以看成是一种特殊的文件…...

【如此简单!数据库入门系列】之效率基石 -- 磁盘空间管理

文章目录 1 前言2 磁盘空间管理3 磁盘空间管理的实现4 存储对象关系5 总结6 系列文章 1 前言 如何将表中的记录存储在物理磁盘上呢&#xff1f; 概念模式中&#xff0c;记录&#xff08;Record&#xff09;表示表中的一行数据&#xff0c;由多个列&#xff08;字段或者属性&…...

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(五)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 在下面的图片中&#…...

5月7日监控二叉树+斐波那契数

968.监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&#xff…...

C++类的设计编程示例

一、银行账户类 【问题描述】 定义银行账户BankAccount类。 私有数据成员&#xff1a;余额balance&#xff08;整型&#xff09;。 公有成员方法&#xff1a; 无参构造方法BankAccount()&#xff1a;将账户余额初始化为0&#xff1b; 带参构造方法BankAccount(int m)&#xff1…...

YOLOv5 V7.0 - rknn模型的验证 输出精度(P)、召回率(R)、mAP50、mAP50-95

1.简介 RKNN官方没有提供YOLOv5模型的验证工具&#xff0c;而YOLOv5自带的验证工具只能验证pytorch、ONNX等常见格式的模型性能&#xff0c;无法运行rknn格式。考虑到YOLOv5模型转换为rknn会有一定的精度损失&#xff0c;但是需要具体数值才能进行评估&#xff0c;所以需要一个…...

CUDA、CUDNN、Pytorch三者之间的关系

这个东西嘛&#xff0c;我一开始真的是一头雾水&#xff0c;安装起来真是麻烦死了。但是随着要复现的项目越来越多&#xff0c;我也不得不去学会他们是什么&#xff0c;以及他们之间的关系。 首先&#xff0c;一台电脑里面允许有多种版本的cuda存在&#xff0c;然后cuda分为run…...

vue-cli2,vue-cli3,vite 生产环境去掉console.log

console.log一般都是在开发环境下使用的&#xff0c;在生产环境下需要去除 &#xff0c;如果手动删除未免也太累了&#xff0c;我们可以用插件对于具体环境全局处理。 vue-cli2 项目build 下面webpack.prod.config.js 文件中: plugins: [new webpack.DefinePlugin({process.en…...

Spring MVC(响应 + 状态码)

文章目录 一、RestController VS Controller VS ResponseBody1.1 关于元注解1.2 Controller1.3 ResponseBody1.4 RestController 二、响应2.1 Spring 对于响应的设置2.2 返回静态页面2.3 返回HTML代码片段2.4 返回JSON2.5 设置HTTP状态码2.6 设置响应部分的Header 二、状态码2.…...

Unity Mirror 从入门到入神(一)

Mirror从入门到成神 文章目录 Mirror从入门到成神简介NetworkClientRegisterPrefabConnect (string address)Disconnect ()activeactiveHost NetworkServerSpawn 简介 Mirror是一个unity网络同步框架&#xff0c;基于MonoBehaviour生命周期的回调的基础上进行数值的同步&#…...

【动态规划】子序列问题II|最长定差子序列|最长的斐波那契数列的长度|最长等差数列|等差数列的划分

一、最长定差子序列 1218. 最长定差子序列 算法原理&#xff1a; &#x1f4a1;细节&#xff1a; 1.正常创建dp表&#xff0c;分析状态转移方程&#xff1a;可能b存在于多个不同的位置&#xff0c;那么要用哪个下标的dp呢&#xff1f; 用最后一个b的&#xff0c;因为用前面的可…...

R实验 基础(二)

实验目的&#xff1a; 掌握向量的几种类型&#xff1a;数值向量、逻辑向量、字符向量、复数向量&#xff1b;掌握生成向量几个的函数使用和向量的下标运算&#xff1b;掌握因子的定义和相关函数的使用。 实验内容&#xff1a; R语言中&#xff0c;数值向量用得非常多。生成数…...

Kotlin核心编程知识点-02-面向对象

文章目录 1.类和构造方法1.1.Kotlin 中的类及接口1.1.1.Kotlin 中的类1.1.2.可带有属性和默认方法的接口 1.2.更简洁地构造类的对象1.2.1.构造方法默认参数1.2.2.init 语句块1.2.3.延迟初始化&#xff1a;by lazy 和 lateinit 1.3.主从构造方法 2.不同的访问控制原则2.1.限制修…...

开源的图形化Windows软件安装升级方案:WingetUI

WingetUI&#xff1a;简化数字生活&#xff0c;WingetUI让软件管理轻松便捷- 精选真开源&#xff0c;释放新价值。 概览 WingetUI是在GitHub上开发的一个实用工具&#xff0c;专为Windows用户设计&#xff0c;旨在为常见的命令行包管理工具&#xff08;如Winget、Scoop、Pip、…...