OpenEuler部署Flink 1.19.2完全分布式集群
前期准备
环境准备:
-
三台OpenEuler-24.03-LTS-SP1系统的主机
-
JDK 11
-
Hadoop集群
Flink版本:
flink-1.19.2-bin-scala_2.12
集群规划:
节点服务器 | node1 | node2 | node3 |
---|---|---|---|
IP地址 | 10.90.100.101 | 10.90.100.102 | 10.90.100.103 |
Flink服务进程 | JobManager 、TaskManager | TaskManager | TaskManager |
一、 Flink集群安装部署
1.1 Flink 安装
-
下载Flink安装包并上传该Flink软件包到node1主机。
上传方式有很多,任选一种方式即可,在此不再赘述。
-
上传成功后,通过 ls 命令查看是否上传成功。
[hadoop@node1 ~]$ ls
flink-1.19.2-bin-scala_2.12.tgz
[hadoop@node1 ~]$
- 解压
flink-1.19.2-bin-scala_2.12.tgz
到/opt/software/
目录下。
[hadoop@node1 ~]$ tar -zxvf flink-1.19.2-bin-scala_2.12.tgz -C /opt/software/
[hadoop@node1 ~]$ ls /opt/software/
flink-1.19.2
[hadoop@node1 ~]$
1.2 配置Flink
- 进入flink的
conf
目录,修改flink-conf.yaml
文件,指定node1
节点服务器为JobManager
。
[hadoop@node1 ~]$ cd /opt/software/flink-1.19.2
[hadoop@node1 flink-1.19.2]$ ls
bin conf examples lib LICENSE licenses log NOTICE opt plugins README.txt
[hadoop@node1 flink-1.19.2]$ cd conf/
[hadoop@node1 conf]$ ls
config.yaml log4j-console.properties log4j-session.properties logback-session.xml masters zoo.cfg
log4j-cli.properties log4j.properties logback-console.xml logback.xml workers
[hadoop@node1 conf]$ vim config.yaml
config.yaml
修改如下内容:
提示:本环境的jdk版本是jdk11,要把该文件21-24行兼容jdk17的配置删掉或注释掉
# JobManager节点地址
jobmanager:
bind-host: 0.0.0.0
rpc:
address: node1
port: 6123
# TaskManager节点地址.需要配置为当前机器名
taskmanager:
bind-host: 0.0.0.0
host: node1
#Rest
rest:
address: node1
bind-address: 0.0.0.0
- 修改
workers
文件,指定node1
、node2
和node3
为TaskManager
。
[hadoop@node1 conf]$ vim workers
#修改后的内容如下
[hadoop@node1 conf]$ cat workers
node1
node2
node3
- 修改
masters
文件。
[hadoop@node1 conf]$ vim masters
#修改后的内容如下
[hadoop@node1 conf]$ cat masters
node1:8081
1.3 分发Flink配置
- 将Flink安装目录发给集群的节点
node2
和node3
。
[hadoop@node1 conf]$ cd /opt/software/
[hadoop@node1 software]$ ls
flink-1.19.2
#分发到node2
[hadoop@node1 software]$ rsync -avz /opt/software/flink-1.19.2 node2:/opt/software/
#分发到node3
[hadoop@node1 software]$ rsync -avz /opt/software/flink-1.19.2 node3:/opt/software/
#此时可以看到node2和node3主机的/opt/software/目录下载存在flink-1.19.2
- 登录到
node2
,修改node2
的taskmanager.host
配置,
[hadoop@node2 ~]$ cd /opt/software/
[hadoop@node2 software]$ ls
flink-1.19.2
[hadoop@node2 software]$ cd flink-1.19.2/conf/
[hadoop@node2 conf]$ vim config.yaml
修改内容如下:
# TaskManager节点地址.需要配置为当前机器名
taskmanager:
host: node2
- 登录到
node3
,修改node3
的taskmanager.host
配置。
[hadoop@node3 ~]$ cd /opt/software/
[hadoop@node3 software]$ ls
flink-1.19.2
[hadoop@node3 software]$ cd flink-1.19.2/conf/
[hadoop@node3 conf]$ vim config.yaml
修改内容如下:
# TaskManager节点地址.需要配置为当前机器名
taskmanager:
host: node3
1.4 配置环境变量
配置flink的环境变量
[hadoop@node1 ~]$ sudo vim /etc/profile
在profile
末尾添加如下内容
#FLINK_HOME
export FLINK_HOME=/opt/software/flink-1.19.2
export PATH=$PATH:$FLINK_HOME/bin
让环境变量生效
[hadoop@node1 ~]$ source /etc/profile
验证版本号
[hadoop@node1 software]$ flink -v
Version: 1.19.2, Commit ID: 7d9f0e0
[hadoop@node1 software]$
看到版本信息说明配置环境设置完成。
在node2、node3主机执行相同的操作,完成Flink环境变量的配置。
二、Flink集群Standalone运行模式
环境准备
① 为了提供无界流的测试,在任意节点(这里以node2为例)安装网络工具Netcat,并开启本地监听端口(这里以9999端口为例)。
[hadoop@node2 ~]$ sudo yum install nc [hadoop@node2 ~]$ nc -lk 9999
② 为了提交Flink程序任务到集群中执行验证。本例中提供无界流词频统计的程序
FlinkWC-1.0-SNAPSHOT.jar
进行测试。其中,程序入口为com.flink.wc.demo.WordCountUnbounded
2.1 会话模式部署
2.1.1 启动集群
在node1
主机上执行start-cluster.sh
启动Flink
集群
[hadoop@node1 ~]$ start-cluster.sh
查看进程情况:
node1:
[hadoop@node1 ~]$ jps
3376 StandaloneSessionClusterEntrypoint
4177 Jps
4091 TaskManagerRunner
node2:
[hadoop@node2 ~]$ jps
5898 Jps
5740 TaskManagerRunner
node3:
[hadoop@node3 ~]$ jps
5896 TaskManagerRunner
6059 Jps
2.1.2 访问Web UI
启动成功后,同样可以访问http://10.90.100.101:8081
对flink集群和任务进行监控管理
提示:在该例中,10.90.100.101是该集群node1节点的IP地址,请根据实际IP访问。
从图中可以看到,当前集群的TaskManager数量为3;由于默认每个TaskManager的Slot数量为1,所以总Slot数和可用Slot数都为3。
2.1.3 提交作业验证
环境准备
① 为了提供无界流的测试,在任意节点(这里以node2为例)安装网络工具Netcat,并开启本地监听端口(这里以9999端口为例)。
[hadoop@node2 ~]$ sudo yum install nc
[hadoop@node2 ~]$ nc -lk 9999
② 为了提交Flink程序任务到集群中执行验证。本例中提供无界流词频统计的程序FlinkWC-1.0-SNAPSHOT.jar
进行测试。其中,程序入口为com.flink.wc.demo.WordCountUnbounded
2.1.3.1 方式1: Web UI上提交作业
- 任务打包完成后,打开Flink的WEB UI页面,在右侧导航栏点击
Submit New Job
,然后点击按钮Add New
,选择要上传运行的FlinkWC-1.0-SNAPSHOT.jar
包,如下图所示。
jar包上传完成,如下图所示:
- 鼠标点击该jar包,出现任务配置页面,进行相应配置。
主要配置程序入口主类的全类名,任务运行的并行度
,任务运行所需的配置参数和保存点路径等,配置完成后,即可点击按钮Submit
,将任务提交到集群运行。
在本文提供的无界流词频统计的程序配置如下:
- 程序类的路径即程序入口(Entry Class ):
com.flink.wc.demo.WordCountUnbounded
- 并行度(Parallelism):
1
- 程序传参(Program Arguments):
10.90.100.102 9999
其中,
10.90.100.102
为netcat运行所在的主机地址,9999
是netcat本地监听端口。根据实际情况填写对应的IP地址和监听端口,(注意:填写传参时,IP地址和端口中间要有空格)
- 任务提交成功之后,可点击左侧导航栏的
Running Jobs
查看程序运行列表情况
- 测试
① 在netcat的socket中输入内容,如hello world
[hadoop@node2 ~]$ nc -lk 9999
hello world
② 点击Web UI界面左侧的导航栏Task Manager
,然后点击右侧服务器节点node1(注:任务可能运行任意工作节点,逐个观察)
③ 点击Stdout,就可以看到netcat输出单词的统计
④ 如果要结束任务。点击该任务,可以查看任务运行的具体情况,也可以通过点击Cancel Job
结束任务运行。
2.1.3.2 方式2: 命令行提交作业
除了通过WEB UI界面提交任务之外,也可以直接通过命令行来提交任务。
- 将词频统计程序
FlinkWC-1.0-SNAPSHOT.jar
包上传到node1
[hadoop@node1 ~]$ ls
FlinkWC-1.0-SNAPSHOT.jar
- 在node1的命令行使用
flink run
命令提交作业。
要执行的命令内容:
flink run -m node1:8081 -c com.flink.wc.demo.WordCountUnbounded ./FlinkWC-1.0-SNAPSHOT.jar 10.90.100.102 9999
(-m
指定了提交到的JobManager,-c
指定了程序入口。其中,10.90.100.102 9999
是netcat的地址和监听端口,要根据实际情况填入)
执行操作:
[hadoop@node1 ~]$ flink run -m node1:8081 -c com.flink.wc.demo.WordCountUnbounded ./FlinkWC-1.0-SNAPSHOT.jar 10.90.100.102 9999
Job has been submitted with JobID f3cde1cf550e4ead76413b7afff1d40c
- 在node2中netcat输入内容
[hadoop@node2 ~]$ nc -lk 9999
hello flink
- 验证结果。
可以在浏览器中打开Web UI查看应用执行情况
在命令行上查看,在/opt/software/flink-1.19.2/log路径中,可以查看TaskManager节点
[hadoop@node1 log]$ cd /opt/software/flink-1.19.2/log
[hadoop@node1 log]$ cat flink-hadoop-taskexecutor-0-node1.out
(hello,1)
(flink,1)
2.1.4 关闭集群
在node1
主机上执行stop-cluster.sh
关闭Flink
集群
[hadoop@node1 ~]$ stop-cluster.sh
至此,Standalone资源模式运行的会话模式部署方式已经完成。
2.2 应用模式部署
应用模式下
不会提前创建集群,所以不能调用start-cluster.sh脚本
。而是使用在bin目录下的standalone-job.sh
来创建一个JobManager
。
- 将应用程序的jar包放到Flink的安装路径的
/opt/software/flink-1.19.2/lib/
目录下。
[hadoop@node1 ~]$ ls
FlinkWC-1.0-SNAPSHOT.jar
[hadoop@node1 ~]$ cp FlinkWC-1.0-SNAPSHOT.jar /opt/software/flink-1.19.2/lib/
hadoop@node1 ~]$ ls /opt/software/flink-1.19.2/lib/
FlinkWC-1.0-SNAPSHOT.jar
- 启动JobManager
需要执行的命令:
standalone-job.sh start --job-classname com.flink.wc.demo.WordCountUnbounded 10.90.100.102 9999
这里直接指定作业入口类,脚本会到lib
目录扫描所有的jar
包,其中,10.90.100.102 9999
是netcat的地址和监听端口,要根据实际情况填入。
执行如下:
[hadoop@node1 ~]$ standalone-job.sh start --job-classname com.flink.wc.demo.WordCountUnbounded 10.90.100.102 9999
Starting standalonejob daemon on host node1.
[hadoop@node1 ~]$ jps
6016 Jps
5959 StandaloneApplicationClusterEntryPoint
提示:执行该命令之前一定要先启动该程序所连接的监听服务即先启动Netcat
- 启动TaskManager
[hadoop@node1 ~]$ taskmanager.sh start
Starting taskexecutor daemon on host node1.
[hadoop@node1 ~]$ jps
6627 Jps
5959 StandaloneApplicationClusterEntryPoint
6569 TaskManagerRunner
注:这里只在node1上启动一个taskmanager,如果需要多个taskmanager需要在其它节点上单独执行该命令启动。
- 在netcat的socket中输入内容,如hello world
[hadoop@node2 ~]$ nc -lk 9999
hello world
- 浏览器访问Flink Web监控界面的地址10.90.100.101:8081,在Web界面中观察输出数据
从输出的结果可以看到提交的任务已经实现词的统计。
- 如果需要停掉集群,使用如下命令
#关闭TaskManager
[hadoop@node1 ~]$ taskmanager.sh stop
#关闭JobManager
[hadoop@node1 ~]$ standalone-job.sh stop
至此,Standalone资源模式运行的应用模式部署方式已经完成。
三、 Flink集群YARN运行模式
YARN上部署的过程是:客户端把Flink应用提交给Yarn的ResourceManager,Yarn的ResourceManager会向Yarn的NodeManager申请容器。在这些容器上,Flink会部署JobManager和TaskManager的实例,从而启动集群。Flink会根据运行在JobManger上的作业所需要的Slot数量动态分配TaskManager资源。
3.1 环境准备
- 为了提供无界流的测试,在任意节点(这里以node2为例)安装网络工具Netcat,并开启本地监听端口(这里以9999端口为例)。
[hadoop@node2 ~]$ sudo yum install nc
[hadoop@node2 ~]$ nc -lk 9999
- 为了提交Flink程序任务到集群中执行验证。本例中提供无界流词频统计的程序
FlinkWC-1.0-SNAPSHOT.jar
进行测试。其中,程序入口为com.flink.wc.demo.WordCountUnbounded
- 在将Flink任务部署至YARN集群之前,一定要有Hadoop集群,并完成如下配置:
① 配置环境变量
[hadoop@node1 ~]$ sudo vim /etc/profile
在profile文件末尾添加如下内容:
#FLINK_HADOOP_CONF
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_CLASSPATH=`hadoop classpath`
刷新环境变量
[hadoop@node1 ~]$ source /etc/profile
② 启动Hadoop集群,包括HDFS和YARN
[hadoop@node1 ~]$ hdp.sh start
[hadoop@node1 ~]$ hdp.sh jps
==================== node1 ====================
8210 NameNode
8885 NodeManager
8518 DataNode
9129 Jps
==================== node2 ====================
3875 ResourceManager
3606 DataNode
4041 NodeManager
4511 Jps
==================== node3 ====================
4066 NodeManager
3670 DataNode
4310 Jps
3882 SecondaryNameNode
注:
hdp.sh
脚本已经封装好hdfs和yarn的启动命令。
3.2 会话模式部署
YARN的会话模式与独立集群略有不同,需要首先申请一个YARN会话(YARN Session)来启动Flink集群。具体步骤如下
3.2.1 启动Flink集群
执行脚本命令向YARN集群申请资源,开启一个YARN会话,启动Flink集群。操作如下:
[hadoop@node1 ~]$ yarn-session.sh -nm yarn-session-cluster
常用参数:
-d
:分离模式,如果你不想让Flink YARN客户端一直前台运行,可以使用这个参数,即使关掉当前对话窗口,YARN session也可以后台运行。-jm
(–jobManagerMemory):配置JobManager所需内存,默认单位MB。-nm
(–name):配置在YARN UI界面上显示的任务名。如以上命令的yarn-session-cluster-qu
(–queue):指定YARN队列名-tm
(–taskManager):配置每个TaskManager所使用内存。
YARN Session启动之后会给出一个Web UI地址以及一个YARN application ID,如下所示,用户可以通过Web UI或者命令行两种方式提交作业,如:
pplication 'application_1741879375303_0001'.
JobManager Web Interface: http://node1:43167
可以通过以上显示的地址http://node1:43167
访问flink的web界面。
3.2.2 提交作业
方式一:通过Web UI方式提交作业。
这种方式比较简单,与上文所述Standalone部署模式基本相同。
操作过程在此不在赘述,请自己完成。
方式二 :通过命令行提交作业
- 执行以下命令将该任务提交到已经开启的Yarn-Session中运行 (因为node1在启动集群是在前台服务,这里可以重新打开一个node1的连接,在新的连接中执行提交作业命令)
命令格式:
flink run -c <程序入口> <程序jar包路径> [参数]
执行命令如下:
[hadoop@node1 ~]$ ls
FlinkWC-1.0-SNAPSHOT.jar
[hadoop@node1 ~]$ flink run -c com.flink.wc.demo.WordCountUnbounded ./FlinkWC-1.0-SNAPSHOT.jar 10.90.100.102 9999
注意:这种模式下,客户端可以自行确定JobManager的地址,也可以通过-m或者-jobmanager参数指定JobManager的地址,JobManager的地址在YARN Session的启动页面中可以找到。
- 任务提交成功后,可在YARN的Web UI界面查看运行情况。
创建的Yarn-Session实际上是一个Yarn的Application,并且有唯一的Application ID
- 在netcat的socket中输入内容,如hello flink
[hadoop@node2 ~]$ nc -lk 9999
hello flink
- 在yarn的Tracking UI找到flink的Web入口。
进入taskmanager,看到词的统计
3.2.3 关闭flink集群
如果要关闭集群,在终端按Ctrl +C 即可。
至此,YARN资源模式运行的会话模式部署方式已经完成。
3.3 单作业模式部署
在YARN环境中,由于有了外部平台做资源调度,所以也可以直接向YARN提交一个单独的作业,从而启动一个Flink集群。
- 执行命令提交作业。
命令格式:
flink run -d -t yarn-per-job -c <程序入口> <程序jar包路径> [参数]
执行命令如下:
[hadoop@node1 ~]$ ls
FlinkWC-1.0-SNAPSHOT.jar
[hadoop@node1 ~]$ flink run -d -t yarn-per-job -c com.flink.wc.demo.WordCountUnbounded ./FlinkWC-1.0-SNAPSHOT.jar 10.90.100.102 9999
注意:
如果启动过程中报如下异常。
Exception in thread "Thread-4" 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:189) ......
可以不用理会,并不会影响结果,因为任务已经提交到yarn中。如果一定要解决可以在flink的
/opt/software/flink-1.19.2/conf/config.yaml
[hadoop@node1 conf]$ vim config.yaml
配置文件中添加以下配置:
classloader.check-leaked-classloader: false
- 在YARN的ResourceManager界面查看执行情况
点击可以打开Flink Web UI页面进行监控,如下图所示
- 测试词频统计 。
Flink集群已经启动,词频统计与之前的操作步骤都一样,在此就不在赘述。请自己完成相关操作。
- 如果需使用命令行查看或取消作业,可以使用如下命令:
#查看
[hadoop@node1 ~]$ flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
#取消
[hadoop@node1 ~]$ flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY <jobId>
这里的application_XXXX_YY
是当前应用的ID,<jobId>
是作业的ID。在提交作业的时候,终端是能看到应用ID和jobID的,如:
执行取消作业命令:
[hadoop@node1 ~]$ flink cancel -t yarn-per-job -Dyarn.application.id=application_1741879375303_0003 69d156ad4b1750e44d807611f8ab8d81
注意:如果取消作业,整个Flink集群也会停掉。
至此,YARN资源模式运行的单机作业模式部署方式已经完成。
3.4 应用模式部署
应用模式同样非常简单,与单作业模式类似,直接执行flink run-application
命令即可。
3.4.1 命令行提交
- 执行命令提交作业。
命令格式:
flink run-application -t yarn-application -c <程序入口> <程序jar包路径> [参数]
执行以下命令:
[hadoop@node1 ~]$ ls
FlinkWC-1.0-SNAPSHOT.jar
[hadoop@node1 ~]$ flink run-application -t yarn-application -c com.flink.wc.demo.WordCountUnbounded ./FlinkWC-1.0-SNAPSHOT.jar 10.90.100.102 9999
- 词频统计
Flink集群已经启动,词频统计与之前的操作步骤都一样,在此就不在赘述。请自己完成相关操作。
- 在命令行中查看或取消作业
#通过application ID可以查看到jobID
[hadoop@node1 ~]$ flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
#取消
[hadoop@node1 ~]$ flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
这里的application_XXXX_YY
是当前应用的ID,<jobId>
是作业的ID。
3.4.2 上传HDFS提交
根据YARN的工作机制,以上这些操作中,每次执行操作,flink依赖jar包和程序jar包都会单独上传到集群hdfs,如果做要提交的作业非常多,就显得很繁重了,此时可将flink本身的依赖和用户jar可以预先上传到HDFS,而不需要单独发送到集群,这就使得作业提交更加轻量了,执行更加快。
可以通过yarn.provided.lib.dirs配置选项指定位置,将flink的依赖上传到远程。
- 上传flink的lib和plugins到HDFS上。
#在hdfs上创建存放flink依赖的目录
[hadoop@node1 ~]$ hdfs dfs -mkdir /flink-libs
#上传依赖到hdfs到flink-libs
[hadoop@node1 ~]$ hdfs dfs -put /opt/software/flink-1.19.2/lib /flink-libs
[hadoop@node1 ~]$ hdfs dfs -put /opt/software/flink-1.19.2/plugins /flink-libs
- 程序的jar包到HDFS
#在hdfs上创建存放用户的程序jar的目录
[hadoop@node1 ~]$ hdfs dfs -mkdir /flink-jars
#上传用户程序jar到hdfs到flink-jars
[hadoop@node1 ~]$ ls
FlinkWC-1.0-SNAPSHOT.jar
[hadoop@node1 ~]$ hdfs dfs -put FlinkWC-1.0-SNAPSHOT.jar /flink-jars
- 提交作业
[hadoop@node1 ~]$ flink run-application -t yarn-application -Dyarn.provided.lib.dirs="hdfs://node1:9820/flink-libs" -c com.flink.wc.demo.WordCountUnbounded hdfs://node1:9820/flink-jars/FlinkWC-1.0-SNAPSHOT.jar 10.90.100.102 9999
- 词频统计
Flink集群已经启动,词频统计与之前的操作步骤都一样,在此就不在赘述。请自己完成相关操作。
- 在命令行中查看或取消作业
#通过application ID可以查看到jobID
[hadoop@node1 ~]$ flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
#取消
[hadoop@node1 ~]$ flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
这里的application_XXXX_YY
是当前应用的ID,<jobId>
是作业的ID。
至此,YARN资源模式运行的应用模式部署方式已经完成。