文章目录

  • ​​Flink架构介绍​​
  • ​​基本架构​​
  • ​​安装部署​​
  • ​​文件准备及部署规划​​
  • ​​上传文件到服务器并解压​​
  • ​​修改配置文件​​
  • ​​分发安装文件到其他服务器​​
  • ​​启动集群​​
  • ​​访问webUI​​
  • ​​上传任务到集群​​
  • ​​开发实例程序WordCount​​
  • ​​通过命令上传任务到Flink集群​​
  • ​​通过webUI上传任务到Flink集群​​

Flink架构介绍

Flink 的安装和部署主要分为本地(单机)模式和集群模式,其中本地模式只需直接解压就可以使用,不以修改任何参数,一般在做一些简单测试的时候使用。本地模式在我们的课程里面不再赘述。集群模式包含:
Standalone。
Flink on Yarn。
Mesos。
Docker。
Kubernetes。
AWS。
Goole Compute Engine。
这里先部署Standalone 模式集群

基本架构

Flink 整个系统主要由两个组件组成,分别为 JobManager 和 TaskManager,Flink 架构也遵循 Master-Slave 架构设计原则,JobManager 为 Master 节点,TaskManager 为 Worker(Slave)节点。所有组件之间的通信都是借助于 Akka Framework,包括任务的状态以及Checkpoint 触发等信息,架构图如下:

Flink Standalone集群安装和部署_安装部署


客户端

客户端负责将任务提交到集群,与 JobManager 构建 Akka 连接,然后将任务提交到JobManager,通过和 JobManager 之间进行交互获取任务执行状态。客户端提交任务可以采用 CLI 方式或者通过使用 Flink WebUI 提交,也可以在应用程序中指定 JobManager 的 RPC网络端口构建 ExecutionEnvironment 提交 Flink 应用

JobManager

JobManager 负责整个 Flink 集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中 TaskManager 上 TaskSlot 的使用情况,为提交的应用分配TaskSlots 资源并命令 TaskManger 启动应用。JobManager 相当于整个集群的 Master 节点,且整个集群中有且仅有一个活跃的 JobManager,负责整个集群的任务管理和资源管理。

JobManager 和 TaskManager 之间通过 Actor System 进行通信,获取任务执行的情况并通过 Actor System 将执行情况发送给客户端。同时在任务执行过程中,Flink JobManager 会触发 Checkpoints 操作,每个 TaskManager 节点收到 Checkpoint触发指令后,完成 Checkpoint 操作,所有的 checkpoint 协调过程都是在 Flink JobManager中完成。当任务完成后,Flink 会将任务执行的信息反馈给客户端,并且释放掉 TaskManager中的资源以供下一次提交任务使用

TaskManager
TaskManager 相当于整个集群的 Slave 节点,负责具体的任务执行和对应任务在每个节点上的资源申请与管理。客户端通过将编写好的 Flink 应用编译打包,提交到 JobManager,然后 JobManager 会根据已注册 TaskManager 的资源情况,将任务分配给有资源的 TaskManager 节点,然后启动并运行任务。TaskManager 从 JobManager 接收需要部署的任务,然后使用 Slot 资源启动 Task,建立数据接入的网络连接,接收数据并开始数处理。同时 TaskManager 之间的数据交互都是通过数据流的方式进行的。
Flink 的任务运行其实是采用多线程的方式,这和 MapReduce 多 JVM 进程的方式有很大的区别 Fink 能够极大提高 CPU 使用效率,在多个任务和 Task 之间通过 TaskSlot方式共享系统资源,每个 TaskManager 中通过管理多个 TaskSlot 资源池进行对资源进行有效管理

安装部署

文件准备及部署规划

我们准备三台服务器 server01、server02、server03
server01作为 jobManager(master) server01、server02、server03 作为TaskManager(slave) server01既作为master又作为一个slave 下载安装文件 flink-1.9.1-bin-scala_2.12.tgz,

上传文件到服务器并解压

将文件flink-1.9.1-bin-scala_2.12.tgz 上传到server01服务器 /opt/apps目录
并解压如下:

[root@server01 apps]# ll
total 750912
lrwxrwxrwx. 1 root root 11 Jun 14 22:54 flink -> flink-1.9.1
drwxr-xr-x. 10 502 games 156 Sep 30 2019 flink-1.9.1
-rw-r--r--. 1 root root 246364329 Aug 20 2020 flink-1.9.1-bin-scala_2.12.tgz

修改配置文件

进入flink 下 conf 目录 修改配置文件 flink-conf.yaml ,修改如下两项

jobmanager.rpc.address: server01   # 修改master节点服务器 我这里是 server01 做master
taskmanager.numberOfTaskSlots: 3 # taskmanager.numberOfTaskSlot 参数默认值为 1,修改成 3。表示数每一个TaskManager 上有 3 个 Slot

修改 slaves 文件内容如下:

"flink-conf.yaml" 259L, 10326C written
[root@server01 conf]# vi slaves
server01
server02
server03
~

分发安装文件到其他服务器

将修改后的flink目录复制到 server02 和 server03 两台服务器,命令如下:

[root@server01 apps]# scp -r flink-1.9.1  root@server02:/opt/apps 
[root@server01 apps]# scp -r flink-1.9.1 root@server03:/opt/apps

启动集群

执行bin下的 start-cluster.sh 命令启动集群如下:

[root@server01 flink]# bin/start-cluster.sh 
Starting cluster.
Starting standalonesession daemon on host server01.
Starting taskexecutor daemon on host server01.
Starting taskexecutor daemon on host server02.
Starting taskexecutor daemon on host server03.

访问webUI

启动成功后访问 http://server01:8081 可以访问到flinkwebUI如下:

Flink Standalone集群安装和部署_架构介绍_02

上传任务到集群

开发实例程序WordCount

代码如下

package com.test.flink.wc

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment

object StreamWordCount {
def main(args: Array[String]): Unit = {
val streamEnv: StreamExecutionEnvironment =
StreamExecutionEnvironment.getExecutionEnvironment
//导入隐式转换,建议写在这里,可以防止IDEA代码提示出错的问题
import org.apache.flink.streaming.api.scala._
//读取数据
val stream: DataStream[String] = streamEnv.socketTextStream("server01",8888)
//转换计算
val result: DataStream[(String, Int)] = stream.flatMap(_.split(","))
.map((_, 1))
.keyBy(0)
.sum(1)
//打印结果到控制台
result.print()
//启动流式处理,如果没有该行代码上面的程序不会运行
streamEnv.execute("wordcount")
}
}

通过命令上传任务到Flink集群

将程序jar包上传到server01位置如下:

[root@server01 flink]# ll appjars
total 24
-rw-r--r--. 1 root root 22361 Aug 20 2020 test-1.0-SNAPSHOT.jar

执行命令 上传任务

由于程序中需要连接server01 的 8888端口,因此要先通过如下命令 开启数据发送程序,否则任务会由于连接失败而导致启动失败
server01上执行如下命令(如果提示命令不存在 执行 yum install -y nc 进行安装):

[root@server01 flink]# nc -lk 8888

上传程序包到flink引擎

[root@server01 flink]# bin/flink run -d -c com.test.flink.wc.StreamWordCount ./appjars/test-1.0-SNAPSHOT.jar 
Starting execution of program
Job has been submitted with JobID 75fd7304caa7d429b343b77dff4ce65d

通过在终端中发送字符串给处理程序,可以在webUI中看到任务的执行情况

[root@server01 flink]# nc -lk 8888
a
a
a
a
a
a
a
a

Flink Standalone集群安装和部署_安装部署_03


Flink Standalone集群安装和部署_Standalone_04

通过webUI上传任务到Flink集群

也可以通过webUI界面上传任务程序

Flink Standalone集群安装和部署_架构介绍_05