客户端不是运行时和程序执行的一部分 但它用于准备并发送dataflow(JobGraph)给Master(JobManager) 然后客户端断开连接或维持连接以等待接受计算结果 当Flink集群启动后 首先会启动一个JobManager和一个或多个TaskManager去执行 然后TaskManager将心跳和统计信息汇报给JobManager TaskManager之间以流的形式进行数据传输 以上三者均为独立的JVM进程
- Client
提交Job的客户端 可以是运行在任何机器上 (与JobManager环境连通即可) 提交Job后 Clinet可以结束进程(Streaming的任务) 也可以不结束并等待结果返回
- JobManager
主要负责调度Job并协调Task做checkpoint 职责很像Storm的Nimbus 从Clinet处接受Job和Jar包等资源后 会生成优化后的执行计划 并以Task的单元调度到各个TaskManager去执行
- TaskManager
TaskManager启动的时候就设置好了槽位数(Slot) 每个Slot能启动一个Task 。Task为线程 从JobManager处接受需要部署的Task 部署启动后 与自己上游建立Netty连接 接受数据并处理
TaskManager与Slots
- Flink中的每一个worker(TaskManager)都是一个JVM进程
它可能会在独立的线程上执行一个或多个subtask
- 控制一个worker能接受多少个task ,worker通过task slot来进行控制
一个worker至少有一个task slot
- 每个task slot表示TaskManager拥有资源的一个固定大小的子集
假如一个TaksManager有三个slot 那么它会将其管理的内存分成三份分给三个slot
- 资源slot化意味着一个subtask将不需要跟来自其他job的subtask竞争被管理的内存 取而代之的是它将拥有一定数量的内存储备
需要注意的是 这里不会涉及到CPU的隔离 slot目前仅仅用来隔离task受管理的内存
- 通过调整task slot的数量 允许用户定义subtask之间如何互相隔离
如果一个taskManager一个slot 那将意味着每个task group运行在独立的JVM中 (该JVM可能通过一个特定的容器启动的) 而一个TaskManager多个slot意味着更多的subtask可以共享同一个JVM 而同一个JVM进程中的task将共享TCP连接(基于多路复用)和心跳消息 它们也可能共享数据集和数据结构 因此这减少了每个task的负载
子任务共享slot
- 默认情况下 Flink允许子任务共享slot
即使它们是不同任务的子任务(前提是它们来自同一个job) 这样的结果是 一个slot可以保存业务的整个管道
- Task slot是静态概念 是指TaskManager具有并发执行能力
可以通过taskmanager.numberOfTaskSlots进行配置
- 并行度 parallelism是动态概念 即每个TaskManager运行程序时实际使用的并发能力
可以通过参数 parallelism.default进行配置
假设一共有3个TaskManager 每个TaskManager中分配3个TaskSlot 也就是说每个TaskManager可以接收3个task 一共9个TaskSlot 如果设置parralelism.default=1即运行程序默认的并行度为1 9个TaskSlot只用了一个 有8个空闲 因此需要设置合适的并行度才能提高效率