Flink与Kafka的爱恨情仇

FlinkKafkaConsumer 源码剖析

FlinkKafkaConsumer 的继承关系如下图所示。
在这里插入图片描述

可以发现几个版本的 FlinkKafkaConsumer 都继承自 FlinkKafkaConsumerBase 抽象类,所以可知 FlinkKafkaConsumerBase 是最核心的类了。FlinkKafkaConsumerBase 实现了 CheckpointedFunction、CheckpointListener 接口,继承了 RichParallelSourceFunction 抽象类来读取 Kafka 数据。
在这里插入图片描述

在 FlinkKafkaConsumerBase 中的 open 方法中做了大量的配置初始化工作,然后在 run 方法里面是由 AbstractFetcher 来获取数据的,在 AbstractFetcher 中有用 List> 来存储着所有订阅分区的状态信息,包括了下面这些字段:

private final KafkaTopicPartition partition;    //分区
private final KPH kafkaPartitionHandle;
private volatile long offset;   //消费到的 offset
private volatile long committedOffset;  //提交的 offset

在 FlinkKafkaConsumerBase 中还有字段定义 Flink 自动发现 Kafka 主题和分区个数的时间,默认是不开启的(时间为 Long.MIN_VALUE),像如果传入的是正则表达式参数,那么动态的发现主题还是有意义的,如果配置的已经是固定的 Topic,那么完全就没有开启这个的必要,另外就是 Kafka 的分区个数的自动发现,像高峰流量的时期,如果 Kafka 的分区扩容了,但是在 Flink 这边没有配置这个参数那就会导致 Kafka 新分区中的数据不会被消费到,这个参数由 flink.partition-discovery.interval-millis 控制。

FlinkKafkaProducer 源码剖析
FlinkKafkaProducer 这个有些特殊,不同版本的类结构有些不一样,如 FlinkKafkaProducer011 是继承的 TwoPhaseCommitSinkFunction 抽象类,而 FlinkKafkaProducer010 和 FlinkKafkaProducer09 是基于 FlinkKafkaProducerBase 类来实现的。
在这里插入图片描述

在这里插入图片描述

在 Kafka 0.11.x 版本后支持了事务,这让 Flink 与 Kafka 的事务相结合从而实现端到端的 Exactly once 才有了可能。

数据 Sink 到下游的 Kafka,可你能会关心数据的分区策略,在 Flink 中自带了一种就是 FlinkFixedPartitioner,它使用的是 round-robin 策略进行下发到下游 Kafka Topic 的分区上的,当然也提供了 FlinkKafkaPartitioner 接口供你去实现自定义的分区策略。

使用 Flink-connector-kafka 可能会遇到的问题

如何消费多个 Kafka Topic

通常可能会有很多类型的数据全部发到 Kafka,但是发送的数据却不是在同一个 Topic 里面,然后在 Flink 处消费的时候,又要去同时消费这些多个 Topic,在 Flink 中除了支持可以消费单个 Topic 的数据,还支持传入多个 Topic,另外还支持 Topic 的正则表达式(因为有时候可能会事先不确定到底会有多少个 Topic,所以使用正则来处理会比较好,只要在 Kafka 建立的 Topic 名是有规律的就行),如下几种构造器可以传入不同参数来创建 FlinkKafkaConsumer 对象。

//单个 Topic
public FlinkKafkaConsumer011(String topic, DeserializationSchema<T> valueDeserializer, Properties props) {
   
    this(Collections.singletonList(topic), valueDeserializer, props);
}

//多个 Topic
public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值