- 还有视频讲解在我的B站-宝哥chbxw, 希望大家可以支持一下,谢谢。
- 一、集群基本架构
- 1.1、Client 客户端
- 1.2、 JobManager
- 1.3、TaskManager
- 二、集群安装和部署
- 2.1、[Standlone](https://chbxw.blog.csdn.net/article/details/106883950)
- 2.2、[Flink提交到Yarn](https://chbxw.blog.csdn.net/article/details/106885847)
- 2.3、[Flink提交到HA](https://chbxw.blog.csdn.net/article/details/106901312)
- 三、Flink并行度和Slot
- 3.1、并行度设置
- 3.1.1、Operator Level
- 3.1.2、Execution Environment Level
- 3.1.3、Client Level
- 3.1.4、System Level
- 3.2、并行度案例分析
Flink 的安装和部署主要分为本地(单机)模式和集群模式,其中本地模式只需直接解压就可以使用,不以修改任何参数,一般在做一些简单测试的时候使用。本地模式在本文不再赘述。集群模式包含:
- Standalone
- Flink on Yarn
- Mesos
- Docker
- Kubernetes
- AWS
- Goole Compute Engine
目前在企业中使用最多的是 Flink on Yarn 模式。本文讲 Standalone 和 Flink onYarn 这两种模式。
一、集群基本架构Flink 整个系统主要由两个组件组成,分别为 JobManager 和 TaskManager,Flink 架构也遵循 Master-Slave 架构设计原则,JobManager 为 Master 节点,TaskManager 为 Worker(Slave)节点。所有组件之间的通信都是借助于 Akka Framework,包括任务的状态以及Checkpoint 触发等信息。
客户端负责将任务提交到集群,与 JobManager 构建 Akka 连接,然后将任务提交到JobManager,通过和 JobManager 之间进行交互获取任务执行状态。客户端提交任务可以采用 CLI 方式或者通过使用 Flink WebUI 提交,也可以在应用程序中指定JobManager的RPC网络端口构建 ExecutionEnvironment 提交 Flink 应用。
1.2、 JobManagerJobManager 负责整个 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中的资源以供下一次提交任务使用。
1.3、TaskManagerTaskManager 相当于整个集群的 Slave 节点,负责具体的任务执行和对应任务在每个节点上的资源申请与管理。客户端通过将编写好的 Flink 应用编译打包,提交到 JobManager,然后 JobManager 会根据已经注册在 JobManager 中 TaskManager 的资源情况,将任务分配给有资源的 TaskManager 节点,然后启动并运行任务。TaskManager 从 JobManager 接收需要部署的任务,然后使用 Slot 资源启动 Task,建立数据接入的网络连接,接收数据并开始数据处理。同时 TaskManager 之间的数据交互都是通过数据流的方式进行的。 可以看出,Flink 的任务运行其实是采用多线程的方式,这和 MR 多JVM 进程的方式有很大的区别 Fink 能够极大提高 CPU 使用效率,在多个任务和 Task 之间通过 TaskSlot方式共享系统资源,每个 TaskManager 中通过管理多个 TaskSlot 资源池进行对资源进行有效管理。
二、集群安装和部署 2.1、Standlone 2.2、Flink提交到Yarn 2.3、Flink提交到HA 三、Flink并行度和Slot Flink中每一个worker(TaskManager)都是一个JVM进程,它可能会在独立的线程(Solt)上执行一个或多个subtask。Flink的每个TaskManager为集群提供Solt。Solt的数量通常与每个TaskManager节点的可用CPU内核数成比例,一般情况下Slot的数量就是每个节点的CPU的核数。 Slot的数量由集群中flink-conf.yaml
配置文件中设置taskmanager.numberOfTaskSlots
的值为3,这个值的大小建议和节点CPU的数量保持一致。
一个任务的并行度设置可以从4个层面指定:
- Operator Level(算子层面)。
- Execution Environment Level(执行环境层面)。
- Client Level(客户端层面)。
- System Level(系统层面)。 这些并行度的优先级为
OperatorLevel > ExecutionEnvironmentLevel > Client Level > System Level
Operator、Source
和Sink
目的地的并行度可以通过调用setParallelism()
方法来指定
任务的默认并行度可以通过调用setParallelism()
方法指定。为了以并行度3来执行所有的Operator、Source 和 Sink
,可以通过如下方式设置执行环境的并行度
并行度还可以在客户端提交Job到Flink时设定。对于 CLI 客户端,可以通过-p
参数指定并行度。
在系统级可以通过设置flink-conf.yaml
文件中的parallelism.default
属性来指定所有执行环境的默认并行度。
Flink集群中有3个TaskManager节点,每个TaskManager的Slot 数量为 3