1 环境配置
Flink 是一个分布式的流处理框架,所以实际应用一般都需要搭建集群环境。我们在进行
Flink 安装部署的学习时,需要准备 3 台 Linux 机器。具体要求如下:
⚫系统环境为 CentOS 7.5 版本。
⚫安装 Java 8。
⚫安装 Hadoop 集群,Hadoop 建议选择 Hadoop 2.7.5 以上版本。
⚫配置集群节点服务器间时间同步以及免密登录,关闭防火墙。
本书中三台服务器的具体设置如下:
⚫节点服务器 1,IP 地址为 192.168.10.102,主机名为 hadoop102。
⚫节点服务器 2,IP 地址为 192.168.10.103,主机名为 hadoop103。
⚫节点服务器 3,IP 地址为 192.168.10.104,主机名为 hadoop104。
1.下载安装包
进入 Flink 官网,下载 1.13.0 版本安装包 flink-1.13.0-bin-scala_2.12.tgz,注意此处选用对应 scala 版本为 scala 2.12 的安装包。
2.解压
在 hadoop102 节点服务器上创建安装目录/opt/module,将 flink 安装包放在该目录下,并执行解压命令,解压至当前目录。
$ tar -zxvf flink-1.13.0-bin-scala_2.12.tgz -C /opt/module/
flink-1.13.0/ flink-1.13.0/log/ flink-1.13.0/LICENSE flink-1.13.0/lib/ ……
3.启动
进入解压后的目录,执行启动命令,并查看进程。
$ cd flink-1.13.0/
$ bin/start-cluster.sh Starting cluster.
Starting standalonesession daemon on host hadoop102.
Starting taskexecutor daemon on host hadoop102.
$ jps
10369 StandaloneSessionClusterEntrypoint
10680 TaskManagerRunner
10717 Jps
4.访问 Web UI
启动成功后,访问 http://hadoop102:8081,可以对 flink 集群和任务进行监控管理,如图 3-2 所示。
5.关闭集群
如果想要让 Flink 集群停止运行,可以执行以下命令:
$ bin/stop-cluster.sh
Stopping taskexecutor daemon (pid: 10680) on host hadoop102.
Stopping standalonesession daemon (pid: 10369) on host hadoop102.
$ cd conf/
$ vim flink-conf.yaml
# JobManager节点地址.
jobmanager.rpc.address: hadoop102
这就指定了 hadoop102 节点服务器为 JobManager 节点。
(2)修改 workers 文件,将另外两台节点服务器添加为本 Flink 集群的 TaskManager 节点,具体修改如下:
$ vim workers
hadoop103
hadoop104
这样就指定了 hadoop103 和 hadoop104 为 TaskManager 节点。
(3)另外,在 flink-conf.yaml 文件中还可以对集群中的 JobManager 和 TaskManager 组件
进行优化配置,主要配置项如下:
⚫jobmanager.memory.process.size:对 JobManager 进程可使用到的全部内存进行配置,包括 JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
⚫taskmanager.memory.process.size:对 TaskManager 进程可使用到的全部内存进行配置,包括 JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
⚫taskmanager.numberOfTaskSlots:对每个 TaskManager 能够分配的 Slot 数量进行配置,默认为 1,可根据 TaskManager 所在的机器能够提供给 Flink 的 CPU 数量决定。所谓 Slot 就是 TaskManager 中具体运行一个任务所分配的计算资源。
⚫parallelism.default:Flink 任务执行的默认并行度,优先级低于代码中进行的并行度配置和任务提交时使用参数指定的并行度数量。关于 Slot 和并行度的概念,我们会在下一章做详细讲解。
3.分发安装目录配置修改完毕后,将 Flink 安装目录发给另外两个节点服务器。
$ scp -r ./flink-1.13.0 lyh@hadoop103:/opt/module
$ scp -r ./flink-1.13.0 lyh@hadoop104:/opt/module
4.启动集群
(1)在 hadoop102 节点服务器上执行 start-cluster.sh 启动 Flink 集群:
$ bin/start-cluster.sh Starting cluster.
Starting standalonesession daemon on host hadoop102.
Starting taskexecutor daemon on host hadoop103.
Starting taskexecutor daemon on host hadoop104.
(2)查看进程情况:
[lyh@hadoop102 flink-1.13.0]$ jps
13859 Jps
13782 StandaloneSessionClusterEntrypoint
[lyh@hadoop103 flink-1.13.0]$ jps
12215 Jps
12124 TaskManagerRunner
[lyh@hadoop104 flink-1.13.0]$ jps
11602 TaskManagerRunner
11694 Jps
访问 Web UI 启动成功后,同样可以访问
http://hadoop102:8081 对 flink 集群和任务进行监控管理,如图 3-3 所示。
1、程序打包
(1)为方便自定义结构和定制依赖,我们可以引入插件 maven-assembly-plugin 进行打包。
在 FlinkTutorial 项目的 pom.xml 文件中添加打包插件的配置,具体如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2)插件配置完毕后,可以使用 IDEA 的 Maven 工具执行 package 命令,出现如下提示即表示打包成功。
[INFO] ----------------------------------------------------------------------- [INFO] BUILD SUCCESS
[INFO] -----------------------------------------------------------------------
[INFO] Total time: 21.665 s
[INFO] Finished at: 2021-06-01T17:21:26+08:00
[INFO] Final Memory: 141M/770M
[INFO] -----------------------------------------------------------------------
打包完成后,在 target 目录下即可找到所需 JAR 包, JAR 包会有两个,
FlinkTutorial-1.0-SNAPSHOT.jar 和 FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar,因
为集群中已经具备任务运行所需的所有依赖,所以建议使用 FlinkTutorial-1.0-SNAPSHOT.jar。
2、在 Web UI 上提交作业
(1)任务打包完成后,我们打开 Flink 的 WEB UI 页面,在右侧导航栏点击“Submit New Job”,然后点击按钮“+ Add New”,选择要上传运行的 JAR 包,如图 3-4 所示。
上传完成后,如图 3-5 所示:
(2)点击该 JAR 包,出现任务配置页面,进行相应配置。
主要配置程序入口主类的全类名,任务运行的并行度,任务运行所需的配置参数和保存点路径等,如图 3-6 所示,配置完成后,即可点击按钮“Submit”,将任务提交到集群运行。
(3)任务提交成功之后,可点击左侧导航栏的“Running Jobs”查看程序运行列表情况,如图 3-7 所示。
(4)点击该任务,可以查看任务运行的具体情况,也可以通过点击“Cancel Job”结束任务运行,如图 3-8 所示。
3. 命令行提交作业
除了通过 WEB UI 界面提交任务之外,也可以直接通过命令行来提交任务。这里为方便起见,我们可以先把 jar 包直接上传到目录 flink-1.13.0 下
(1)首先需要启动集群。
$ bin/start-cluster.sh
(2)在 hadoop102 中执行以下命令启动 netcat。
$ nc -lk 7777
(3)进入到 Flink 的安装路径下,在命令行使用 flink run 命令提交作业。
$ bin/flink run -m hadoop102:8081
com.lyh.wc.StreamWordCount ./FlinkTutorial-1.0-SNAPSHOT.jar -c
这里的参数 –m 指定了提交到的 JobManager,-c 指定了入口类。
(4)在浏览器中打开 Web UI,http://hadoop102:8081 查看应用执行情况,如图 3-9 所示。
用 netcat 输入数据,可以在 TaskManager 的标准输出(Stdout)看到对应的统计结果。
(5)在 log 日志中,也可以查看执行结果,需要找到执行该数据任务的 TaskManager 节点查看日志。
$ cat flink-lyh-taskexecutor-0-hadoop102.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/opt/module/flink-1.13.0/lib/log4j-slf4j-impl-2.12.1.jar!/org/slf4j
/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/opt/module/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.
25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
(hello,1)
(hello,2)
(flink,1)
(hello,3)
(scala,1)
在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink 为各
种场景提供了不同的部署模式,主要有以下三种:
⚫会话模式(Session Mode)
⚫单作业模式(Per-Job Mode)
⚫应用模式(Application Mode)
它们的区别主要在于:集群的生命周期以及资源的分配方式;以及应用的 main 方法到底
在哪里执行——客户端(Client)还是 JobManager。接下来我们就做一个展开说明。
前面提到的两种模式下,应用代码都是在客户端上执行,然后由客户端提交给 JobManager 的。但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给 JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的资源消耗。
所以解决办法就是,我们不要客户端了,直接把应用提交到 JobManger 上运行。而这也就代表着,我们需要为每一个提交的应用单独启动一个 JobManager,也就是创建一个集群。这个 JobManager 只为执行这一个应用而存在,执行结束之后 JobManager 也就关闭了,这就是所谓的应用模式,如图 3-12 所示。
应用模式与单作业模式,都是提交作业之后才创建集群;单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;而应用模式下,是直接由 JobManager 执行应用程序的,并且即使应用包含了多个作业,也只创建一个集群。
总结一下,在会话模式下,集群的生命周期独立于集群上运行的任何作业的生命周期,并且提交的所有作业共享资源。而单作业模式为每个提交的作业创建一个集群,带来了更好的资源隔离,这时集群的生命周期与作业的生命周期绑定。最后,应用模式为每个应用程序创建一个会话集群,在 JobManager 上直接调用应用程序的 main()方法。
独立模式(Standalone)是部署 Flink 最基本也是最简单的方式:所需要的所有 Flink 组件,都只是操作系统上运行的一个 JVM 进程。
独立模式是独立运行的,不依赖任何外部的资源管理平台;当然独立也是有代价的:如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理。所以独立模式一般只用在开发测试或作业非常少的场景下。
另外,我们也可以将独立模式的集群放在容器中运行。Flink 提供了独立模式的容器化部署方式,可以在 Docker 或者 Kubernetes 上进行部署。
应用模式下不会提前创建集群,所以不能调用 start-cluster.sh 脚本。我们可以使用同样在
bin 目录下的 standalone-job.sh 来创建一个 JobManager。
具体步骤如下:
(1)进入到 Flink 的安装路径下,将应用程序的 jar 包放到 lib/目录下。
$ cp ./FlinkTutorial-1.0-SNAPSHOT.jar lib/
(2)执行以下命令,启动 JobManager。
$ ./bin/standalone-job.sh start --job-classname com.lyh.wc.StreamWordCount
这里我们直接指定作业入口类,脚本会到 lib 目录扫描所有的 jar 包。
(3)同样是使用 bin 目录下的脚本,启动 TaskManager。
$ ./bin/taskmanager.sh start
(4)如果希望停掉集群,同样可以使用脚本,命令如下。
$ ./bin/standalone-job.sh stop
$ ./bin/taskmanager.sh stop
具体配置如下:
(1)进入 Flink 的安装路径下的 conf 目录下,修改配置文件: flink-conf.yaml,增加如下配置。
high-availability: zookeeper
high-availability.storageDir: hdfs://hadoop102:9820/flink/standalone/ha
high-availability.zookeeper.quorum:
hadoop102:2181,hadoop103:2181,hadoop104:2181
high-availability.zookeeper.path.root: /flink-standalone high-availability.cluster-id: /cluster_lyh
(2)修改配置文件: masters,配置备用 JobManager 列表。
hadoop102:8081 hadoop103:8081
(3)分发修改后的配置文件到其他节点服务器。
(4)在/etc/profile.d/my_env.sh 中配置环境变量
export HADOOP_CLASSPATH=` hadoop classpath`
注意:
⚫需要提前保证 HAOOP_HOME 环境变量配置成功
⚫分发到其他节点具体部署方法如下:
(1)首先启动 HDFS 集群和 Zookeeper 集群。
(2)执行以下命令,启动 standalone HA 集群。
$ bin/start-cluster.sh
(3)可以分别访问两个备用 JobManager 的 Web UI 页面。
http://hadoop102:8081 http://hadoop103:8081
(4)在 zkCli.sh 中查看谁是 leader。
[zk: localhost:2181(CONNECTED) 1] get
/flink-standalone/cluster_lyh/leader/rest_server_lock
杀死 hadoop102 上的 Jobmanager, 再看 leader。
[zk: localhost:2181(CONNECTED) 7] get
/flink-standalone/cluster_lyh/leader/rest_server_lock
注意: 不管是不是 leader,从 WEB UI 上是看不到区别的, 都可以提交应用。
具体配置步骤如下:
(1)按照 3.1 节所述,下载并解压安装包,并将解压后的安装包重命名为 flink-1.13.0-yarn,本节的相关操作都将默认在此安装路径下执行。
(2)配置环境变量,增加环境变量配置如下:
$ sudo vim /etc/profile.d/my_env.sh
HADOOP_HOME=/opt/module/hadoop-2.7.5 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HADOOP_CLASSPATH=`hadoop classpath`
这里必须保证设置了环境变量 HADOOP_CLASSPATH。
(3)启动 Hadoop 集群,包括 HDFS 和 YARN。
[lyh@hadoop102 ~]$ start-dfs.sh
[lyh@hadoop103 ~]$ start-yarn.sh
分别在 3 台节点服务器查看进程启动情况。
[lyh@hadoop102 ~]$ jps
5190 Jps
5062 NodeManager
4408 NameNode
4589 DataNode
[lyh@hadoop103 ~]$ jps
5425 Jps
4680 ResourceManager
5241 NodeManager
4447 DataNode
[lyh@hadoop104 ~]$ jps
4731 NodeManager
4333 DataNode
4861 Jps
4478 SecondaryNameNode
(4)进入 conf 目录,修改 flink-conf.yaml 文件,修改以下配置,这些配置项的含义在进行 Standalone 模式配置的时候进行过讲解,若在提交命令中不特定指明,这些配置将作为默认配置。
$ cd /opt/module/flink-1.13.0-yarn/conf/
$ vim flink-conf.yaml
jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 1728m taskmanager.numberOfTaskSlots: 8
parallelism.default: 1
1、 启动集群
(1)启动 hadoop 集群(HDFS, YARN)。
(2)执行脚本命令向 YARN 集群申请资源,开启一个 YARN 会话,启动 Flink 集群。
$ 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 所使用内存。
客户端可以自行确定 JobManager 的地址,也可以通过-m 或者-jobmanager 参数指定 JobManager 的地址,JobManager 的地址在 YARN Session 的启动页面中可以找到。
③ 任务提交成功后,可在 YARN 的 Web UI 界面查看运行情况。
如图 3-14 所示,从图中可以看到我们创建的 Yarn-Session 实际上是一个 Yarn 的
Application,并且有唯一的 Application ID。
④也可以通过 Flink 的 Web UI 页面查看提交任务的运行情况,如图 3-15 所示。
$ bin/flink run -d -t yarn-per-job -c com.lyh.wc.StreamWordCount
FlinkTutorial-1.0-SNAPSHOT.jar
早期版本也有另一种写法:
$ bin/flink run -m yarn-cluster FlinkTutorial-1.0-SNAPSHOT.jar -c com.lyh.wc.StreamWordCount
注意这里是通过参数-m yarn-cluster 指定向 YARN 集群提交任务。
(2)在 YARN 的 ResourceManager 界面查看执行情况,如图 3-16 所示。
点击可以打开 Flink Web UI 页面进行监控,如图 3-17 所示:
(3)可以使用命令行查看或取消作业,命令如下。
$ ./bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
$ ./bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
<jobId>
这里的 application_XXXX_YY 是当前应用的 ID,是作业的 ID。注意如果取消作
业,整个 Flink 集群也会停掉。
(1)执行命令提交作业。
$ bin/flink run-application -t yarn-application -c com.lyh.wc.StreamWordCount
FlinkTutorial-1.0-SNAPSHOT.jar
(2)在命令行中查看或取消作业。
$ ./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
$ ./bin/flink cancel -t yarn-application
-Dyarn.application.id=application_XXXX_YY <jobId>
(3)也可以通过 yarn.provided.lib.dirs 配置选项指定位置,将 jar 上传到远程。
$ ./bin/flink run-application -t yarn-application
-Dyarn.provided.lib.dirs="hdfs://myhdfs/my-remote-flink-dist-dir" hdfs://myhdfs/jars/my-application.jar
(1)在 yarn-site.xml 中配置。
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>4</value>
<description>
The maximum number of application master execution attempts.
</description>
</property>
注意: 配置完不要忘记分发, 和重启 YARN。
(2)在 flink-conf.yaml 中配置。
yarn.application-attempts: 3
high-availability: zookeeper
high-availability.storageDir: hdfs://hadoop102:9820/flink/yarn/ha
high-availability.zookeeper.quorum:
hadoop102:2181,hadoop103:2181,hadoop104:2181
high-availability.zookeeper.path.root: /flink-yarn
(3)启动 yarn-session。
(4)杀死 JobManager, 查看复活情况。
注意: yarn-site.xml 中配置的是 JobManager 重启次数的上限, flink-conf.xml 中的次数应该小于这个值。
容器化部署是如今业界流行的一项技术,基于 Docker 镜像运行能够让用户更加方便地对应用进行管理和运维。容器管理工具中最为流行的就是 Kubernetes(k8s),而 Flink 也在最近的版本中支持了 k8s 部署模式。基本原理与 YARN 是类似的,具体配置可以参见官网说明,这里我们就不做过多讲解了。