1. Flink 集群组成
Flink 运行时主要由两部分构成(图中橘色部分):
- JobManager
- TaskManager
JobManager
Flink集群中至少有一个JobManager, 在HA环境下可以由多个,其中只有一个是leader, 其他都是standby. JobManager负责协调Flink应用的分布式执行,由三个组件组成:
ResourceManager
ResourceManager负责分配和回收Flink集群的 task slots资源(task slot是Flink集群的最小资源调度单位)。针对不同的环境和资源管理器如YARN, Mesos, K8S, Flink提供了不同的ResourceManager的实现。Dispatcher
Dispatcher提供了REST API来提交Flink应用的执行,并为每个新提交的job启动一个JobMasterJobMaster
JobMaster负责管理JobGraph的执行,Flink集群中同时可以由多个job执行,每个job都有自己的JobMaster
TaskManager
TaskManager也叫worker, 执行数据流处理任务,缓存并转发data stream. 集群中至少要有一个TaskManager. TaskManager的最小资源调度单位是task slot, task slots的数量代表了任务的最大并发数,多个opearator可以在一个task slot中执行。
2. Tasks and Operator Chains
在分布式执行过程中,Flink会把多个operator subtasks连成一个task, 在一个线程中执行。这样做有几个好处是节省线程之间数据交换和缓存的开销,减少latency的同时提高吞吐量。
图中source和map操作被连成一个task在一个线程中执行。整个应用由五个线程执行。
3. Task Slots 和资源
一个TaskManager是一个JVM进程,包含多个task slots. 一个task slot是一个线程。一个task slot代表了TaskManager中的一部分资源。task slots评分TaskManager的内存,但是共享CPU,TCP连接和心跳消息,同时也共享数据集和数据结构从而减小per-task的开销。
默认情况下,只要subtask属于同一个job, 即使不属于同一个task,也可以同时运行在一个task slot中,即slot是job共享的,所以一个slot可能会包含一个job的所有pipeline.
能够提高资源的利用率。
4. Flink应用执行
一个Flink应用就是从main()方法里提交的一个或多个job. job可以在本地环境执行,也可以在远程集群环境执行。Flink的集群也分三种,主要差异点在集群的生命周期和资源隔离保障。
Flink Session Cluster | Flink Job Cluster | Flink Application Cluster | |
---|---|---|---|
集群生命周期 | 集群持续运行直到手动停止session, 可以接收多次job提交 | 一个job对应一个集群,ResourceManager根据job的资源需求懒加载,job结束集群销毁 | 由一个main方法启动的应用 |
资源隔离 | job提交时分配task slots, job结束时slots被回收。所有job共享资源,一个TaskManager挂掉会导致其上运行的所有job都失败 | JobManager的失败仅影响当前job | 一个Application内的所有job共享资源 |
适用场景 | 集群启动时间长, job执行时间短 | 集群启动时间短,job执行时间长,对稳定性要求高 |