Flink Table Api中kafka连接器,一个Kafka source表对应一个kafka topic,一个kafka topic一般有多个partition;Flink流处理作业的并行度一般大于1,一个source Task对应一个kafka consumer。Flink需要把 kafka 分区分配给各task。
Flink的设计要点如下:
1)在JobMaster侧,Flink通过kafka API发现所有的分区,然后将分区分配给各source task。
2)JobMaster通过RPC消息给Source Task(在TaskExecutor上运行)发送对应的分区信息。
3)Source Task收到分区消息后,创建kafka consumer,消费对应分区的消息。
相关的源码如下:
1)根据Sql生成PlannerQueryOperation的时候,生成 KafkaSource对象
2)构建 JobGraph 的时候就生成一个 SourceCoordinatorProvider 对象
3)构建 ExecutionGraph 的时候生成 SourceCoordinator 对象。
3)JobMaster开始调度的时候, SourceCoordinator通过KafkaSource 创建 KafkaSourceEnumerator, 再通过 KafkaSourceEnumerator 发现kafka的分区,并分配分区给各Source task,这个处理逻辑参见 KafkaSourceEnumerator#addPartitionSplitChangeToPendingAssignments 方法。
private void addPartiti