TaskManager的Slot数设多少合适?并行度怎么定?
总结
Slot是资源槽位,并行度是算子并发数。Slot数设为CPU核数。Source并行度=Kafka分区数。Slot Sharing让不同算子共享Slot,节省资源。面试时能说清楚Slot和并行度的关系、Slot Sharing的原理、并行度的设置依据,就很有深度。
下一篇聊一个很容易混淆的概念:Savepoint和Checkpoint有什么区别?从Savepoint恢复后为什么数据重复了?
你们生产环境的Flink并行度设的多少?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
Slot和并行度是Flink资源管理的核心。很多人分不清楚Slot和并行度的关系,以为“Slot就是并行度”。实际上Slot是资源槽位,并行度是算子的并发数。今天把它们的关系和设置原则讲清楚。
先说结论
Slot是TaskManager的资源切片,每个Slot分到固定的内存。并行度是算子的并发Subtask数。一个Slot可以跑多个不同算子的Subtask(Slot Sharing),但同一个算子的不同Subtask必须在不同Slot上。
Slot和并行度的关系
假设你有一个作业:Source(p=4) → Map(p=4) → KeyBy+Window(p=8) → Sink(p=4)
最大并行度是8(取所有算子的最大值),所以至少需要8个Slot。
因为Slot Sharing,Source(p=4)、Map(p=4)、Sink(p=4)的Subtask会和KeyBy+Window(p=8)的Subtask共享Slot。所以8个Slot就够了,不需要4+4+8+4=20个。
Slot数的设置原则
经验法则:Slot数 = TaskManager的CPU核数。比如TaskManager有4核,就设4个Slot。每个Slot分到的内存 = TaskManager总内存 / Slot数。
# 假设TaskManager 8核 16GB
taskmanager.numberOfTaskSlots: 8 # 每核一个Slot
# 每个Slot分到 16GB / 8 = 2GB 内存
# 并行度设置(整个作业级别)
# 通常等于Kafka的分区数,比如Kafka有16个分区
env.setParallelism(16); // 16个Subtask,需要16个Slot
并行度怎么定?
原则一:Source并行度 = Kafka分区数
如果Kafka有16个分区,Source并行度设16。如果设多了(比如32),多出来的16个Subtask没有数据读,浪费资源。
原则二:处理算子并行度看吐吐量
如果处理算子是瓶颈(反压),加大并行度。如果没有反压,保持和Source一样就行。
原则三:Sink并行度看目标存储承受能力
如果Sink写Doris,Doris的BE节点有限,Sink并行度太高会压垁Doris。我在元宇宙社交App的经验是Sink并行度设为Doris BE节点数×2。