Flink 源码分析之 FlinkConsumer 是如何保证一个 partition 对应一个 thread 的
我们都知道flink 连接kafka时,默认是一个partition对应一个thread,它究竟是怎么实现的呢?以及到我们自己定义 RichParallelSourceFunction 的时候如何借鉴这部分代码呢?
我们一起来看一下(基于flink-1.8)
看过flink kafka连接器源码的同学对 FlinkKafkaConsumerBase 应该不陌生(没有看过的也无所谓,我们一起来看就好)
一起来看一下 FlinkKafkaConsumerBase 的 open 方法中关键的部分
没错这就是查看Flink Consumer 保证 一个partition对应一个Thread的入口方法
关键性的部分 setAndCheckDiscoveredPartition 方法,点进去
indexOfThisSubtask 表示当前线程是那个subtask,numParallelSubtasks 表示总共并行的subtask 的个数, 当其返回true的时候,表示此partition 属于此indexOfThisSubtask。
下面来看一下具体是怎么划分的
基于topic 和 partition,然后对numParallelSubtasks取余。
那么,当我们自己去定义RichParallelSourceFunction的时候如何去借鉴它呢,直接上代码:
当当当,自此,自己定义个RichParallelSourceFunction也可以并行发数据了,啦啦啦啦!
版权声明: 本文为 InfoQ 作者【shengjk1】的原创文章。
原文链接:【http://xie.infoq.cn/article/dbb74f5590eef53500e9813a4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论