Flink 源码分析之 Flink 是如何 kafka 读取数据的

本文深入探讨了 Flink 从 Kafka 源中读取数据的过程,从 FlinkKafkaConsumerBase 的 run 方法开始,详细介绍了 createFetcher 方法、KafkaFetcher 的构造及工作原理,特别是 KafkaConsumerThread 如何启动并进行数据拉取。在拉取过程中,包括了 offset 的提交、新分区的处理等关键步骤。
摘要由CSDN通过智能技术生成

首先来看一下 FlinkKafkaConsumerBase.run方法,相当于是Flink 从kafka中拉取数据的入口方法:



 

//入口方法 start a source

public void run(SourceContext<T> sourceContext) throws Exception {

......

// from this point forward:

// - 'snapshotState' will draw offsets from the fetcher,

// instead of being built from `subscribedPartitionsToStartOffsets`

// - 'notifyCheckpointComplete' will start to do work (i.e. commit offsets to

// Kafka through the fetcher, if configured to do so)

//创建Fetcher 从kafka中拉取数据

this.kafkaFetcher = createFetcher(

sourceContext,

subscribedPartitionsToStartOffsets,

periodicWatermarkAssigner,

punctuatedWatermarkAssigner,

(StreamingRuntimeContext) getRuntimeContext(),

offsetCommitMode,

getRuntimeContext().getMetricGroup().addGroup(KAFKA_CONSUMER_METRICS_GROUP),

useMetrics);

if (!running) {

return;

}

// depending on whether we were restored with the current state version (1.3),

// remaining logic branches off into 2 paths:

// 1) New state - partition discovery loop executed as separate thread, with this

// thread running the main fetcher loop

// 2) Old state - partition discovery is disabled and only the main fetcher loop is executed

if (discoveryIntervalMillis == PARTITION_DISCOVERY_DISABLED) {

//未配置KEY_PARTITION_DISCOVERY_INTERVAL_MILLIS

kafkaFetcher.runFetchLoop();

} else {

//仍然调用了kafkaFetcher.runFetchLoop();

runWithPartitionDiscovery();

}

}

createFetcher方法



 

@Override

protected AbstractFetcher<T, ?> createFetcher(

SourceContext<T> sourceContext,

Map<KafkaTopicPartition, Long> assignedPartitionsWithInitialOffsets,

SerializedValue<AssignerWithPeriodicWatermarks<T>> watermarksPeriodic,

SerializedValue<AssignerWithPunctuatedWatermarks<T>> watermarksPunctuated,

StreamingRuntimeContext runtimeContext,

OffsetCommitMode offsetCommitMode,

Metr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值