接着上篇哈~
work部分,先总结 work 要干的工作
1.rpc 到 SourceCoordinator 表示 我已经开始工作了,要注册自己的id,并且获取对应切分的分区信息。
2.等传来的分区信息,等到后,做准备工作,获取tp的offset,然后,要构建一个拉取tp数据的线程。维护 tp的offset状态。
3.异常处理。
先看注册部分,该部分发生在SourceOperator 的Open方法
可能会发生的rpc 部分
// 这里是获取split,如果失败重启,就从ck readerState 中获得split
final List<SplitT> splits = CollectionUtil.iterableToList(readerState.get());
// 如果split不为空,基本上就可以按照split 先去消费数据
if (!splits.isEmpty()) {
sourceReader.addSplits(splits);
}
//看英文翻译,也知这就是注册,表示有新的分区信息,记得通知。
// Register the reader to the coordinator.
registerReader();
// Start the reader after registration, sending messages in start is allowed.
sourceReader.start();
其中 注册就是 rpc 操作了,向SourceCoordinator发送注册消息。然后,SourceCoordinator就会回传split消息。
private void registerReader() {
operatorEventGateway.sendEventToCoordinator(
new ReaderRegistrationEvent(
getRuntimeContext().getIndexOfThisSubtask(), localHostname));
}
从此开始添加split的旅程
而在SourceOperator 上的处理SourceCoordinator回传的split消息,就是添加该split
public void handleOperatorEvent(OperatorEvent event) {
if (event instanceof AddSplitEvent) {
try {
sourceReader.addSplits(((AddSplitEvent<SplitT>) event).splits(splitSerializer));
} catch (IOException e) {
throw new FlinkRuntimeException("Failed to deserialize the splits.", e);
}
}
}
上述代码中的 sourceReader 正是KafkaSource 的createReader() 所产生。
KafkaSource 创建了KafkaPartitionSplitReader(后续用来创建consumer消费 kafka数据) 、KafkaRecordEmitter ( 发送 record、以及维持 split的 offset)等
代码是创建KafkaSourceReader的过程
public SourceReader<OUT, KafkaPartitionSplit> createReader(SourceReaderContext readerContext)
throws Exception {
FutureCompletingBlockingQueue<RecordsWithSplitIds<Tuple3<OUT, Long, Long>>> elementsQueue =
new FutureCompletingBlockingQueue<>();
deserializationSchema.open(
new DeserializationSchema.InitializationContext() {
@Override
public MetricGroup getMetricGroup() {
return readerContext.metricGroup().addGroup(

本文深入解析Flink连接Kafka的源码,重点介绍SourceCoordinator的工作流程,包括worker的注册、split的获取与处理。SourceOperator在Open方法中进行注册,SourceCoordinator通过RPC传递split信息。KafkaSource创建KafkaPartitionSplitReader和KafkaRecordEmitter,用于消费Kafka数据并维护offset状态。SplitFetcherManager管理split,维护线程池,SplitFetcher负责实际的数据拉取任务。
最低0.47元/天 解锁文章
336

被折叠的 条评论
为什么被折叠?



