flink并行度
1.TaskSlot
TaskSlot、TaskManager、Task
一个taskManager可以有多个taskSlot,可以在flink-conf中设置。
一个taskSlot中可以有多个task。
TaskSlot是Flink中最小的资源管理单元,它仅均分TaskManager上的内存,但不隔离CPU。例如图中,每个TaskManager上面有3个TaskSlot,那么意味着每个TaskSlot有三分之一TaskManage内存。
Flink的Job逻辑会被分为一个一个的Task,在资源分配上,Flink保证Task的每个并行度一定有个TaskSlot使用。例如图中,source/map组成的Task的并行度为2,它就分别占用两个TaskManager上各一个TaskSlot。
同一个TaskManager上面的多个TaskSlot它们共享一个TCP连接、心跳、以及一些数据集和数据结构。避免每个TaskSlot都维护这些东西,导致资源浪费。
TaskSlot共享
TaskSlot是可以共享的,前提是同一个Job的多个Task,那么其中几个Task是可以共享使用同一个TaskSlot的。例如图中,source/map,keyBy/windows/appy,sink这三个Task共享使用了一个TaskSlot。
这种共享方式主要有两个优点:
- 提高资源利用率。以source/map,keyBy/windows/appy,sink这三个Task共享一个TaskSlot为例。如果没有TaskSlot共享,那么source/map就会独立占用一个TaskSlot,而source/map操作并不是一个资源密集型逻辑,就会造成一个TaskSlot资源空闲。相反keyBy/windows/apply却是一个资源密集逻辑,需要比较多的资源(内存和CPU),但此时缺要分配额外的一个TaskSlot去跑,而不是去使用空闲的资源,这时就造成了资源浪费。
- 无需关心一个Job有几个Task从而去计算需要几个TaskSlot。如果没有TaskSlot共享,那么为了最大程度上提高Flink Job的运行性能,就必须要去计算我需要配置几个TaskSlot(因为一个Task独占一个TaskSlot),此时用户就需要去计算我需要配置几个TaskSlot。而在有了TaskSlot共享的基础上,Flink会保证TaskSlot的数量一定是等于Job的最大并发数,每个TaskSlot至少一个Task使用。此时,用户要考虑的仅仅是如何设置TaskSlot数量,保证CPU被充分利用,以及内存被适度均分。