简单介绍

flink-kafka-connector用来连接kafka,用于消费kafka的数据, 并传入给下游的算子。

使用方式

首先来看下flink-kafka-connector的简单使用, 在官方文档中已经介绍了,传入相关的配置, 创建consumer对象, 并调用addsource即可

Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
// only required for Kafka 0.8
properties.setProperty("zookeeper.connect", "localhost:2181");
properties.setProperty("group.id", "test");
DataStream<String> stream = env
.addSource(new FlinkKafkaConsumer08<>("topic", new SimpleStringSchema(), properties));

类图分析

从类图来看,flink-kafka-connector 基本类为FlinkKafkaConsumerBase, 继承RichParallelSourceFunction, 重写了open和run方法。

再open方法中主要是做一些初始化的工作, 获得所有的topic的partiiton信息, 使用partitionDiscoverer来获得topic的parition信息, 不同版本的connector对于getAllPartitionsForTopics有着不同的实现。 在run方法中用于从kafka中读取消息放入SourceContext中, 其中消息获取逻辑放在了AbstractFetcher中, 不同版本的Fetcher对于runFetchLoop有不同的实现,不同版本的kafka-connector有着不同的实现.

并行逻辑解析

对于RichParallelSourceFunction, 是可以设置并行的, 通过设置设置并行度, 可以在多个taskMansger中同时消费kafka在AbstractFetcher中, 有两个队列, subscribedPartitionStates和unassignedPartitionsQueue分别用于保存当前已经在读取的topic的parition和未读取的parition。 通过partitionDiscoverer中的getAllPartitionsForTopics来获得所有topic的partition, 后通过KafkaTopicPartiitonAssigner来判断当前parition是否为当前的source所消费,

	public static int assign(KafkaTopicPartition partition, int numParallelSubtasks) {
int startIndex = ((partition.getTopic().hashCode() * 31) & 0x7FFFFFFF) % numParallelSubtasks; // here, the assumption is that the id of Kafka partitions are always ascending
// starting from 0, and therefore can be used directly as the offset clockwise from the start index
return (startIndex + partition.getPartition()) % numParallelSubtasks;
}

在初始化时, 会放入subscribedPartitionStates((此逻辑在FlinkKafkaConsumerBase的open方法中), 之后发现的新的topicparition(在FlinkFafkaConsumerBase的run方法中),调用kafkaFetcher.addDiscoveredPartitions() 会同时放入 subscribedPartitionStates和unassignedPartitionsQueue,。

unassignedPartitionsQueue主要用于将新发现的parition信息传递给消费线程, 在kafka-0.9版本中, 由ConsumerThread不断获取,如果有新的partition, 会由client一并消费.

在kafka-08版本中,使用线程池来消费, 每个borker对应一个线程, 会在Kafka08Fetcher的runfetchloop中不断获取,会放到parition的所在的borker对应的线程中.

subscribedPartitionStates 用于初始化的工作消费设置和保存所有的topic的消费信息。 在消息的消费中, 会不断更新队列中每个partition的partitionstate. 主要用于其他线程的offset上报或者metric的上报.

watermark的处理

flink-kafka提供了设置watermark的接口 assignTimestampsAndWatermarks(), 在emitRecord中会调用对所设置的watermater生成函数,为每个partition生成其对应的watermark.

如果设置了PeriodicWatermark, 会起一个线程, 定时发送watermark。

如果设置了PunctuatedWatermark, 会在emitRecordWithTimestampAndPunctuatedWatermark中, 调用checkAndGetNewWatermark(), 是否有新的watermark生成.

checkpoint的处理

通过继承相关的类和接口。 CheckpointedFunction,initializeState用于初始化checkpoint, snapshotState用于保存checkpoint

CheckpointListener中notifyCheckpointComplete, 用作checkpoint保存成功的回调, 在kafka-connector中调用commitInternalOffsetsToKafka, 将offset信息上报给kafka.

metric的使用

flink-kafka-connector中使用了flink中的metric库, 用来监控消费信息, 主要是commitoffset和currentOffset信息。

在AbstractFetcher的registerOffsetMetrics中, 注册了对于CurrentOffset和CommitOffset的监控.

通过flink job的查看页面,可以看到各个topic的partition的消费情况.

flink-kafka-connector 的实现的更多相关文章

  1. Flink Kafka Connector 与 Exactly Once 剖析

    Flink Kafka Connector 是 Flink 内置的 Kafka 连接器,它包含了从 Kafka Topic 读入数据的 Flink Kafka Consumer 以及向 Kafka T ...

  2. 《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode

    目录 问题 思路 kafka参数问题 支持batchmode的问题 参数提交至kafkasource的问题 group by支持问题 实现 编译 测试 因为在一篇博文上看到介绍"汽车之家介绍 ...

  3. Kafka设计解析(二十)Apache Flink Kafka consumer

    转载自 huxihx,原文链接 Apache Flink Kafka consumer Flink提供了Kafka connector用于消费/生产Apache Kafka topic的数据.Flin ...

  4. 【译】Apache Flink Kafka consumer

    Flink提供了Kafka connector用于消费/生产Apache Kafka topic的数据.Flink的Kafka consumer集成了checkpoint机制以提供精确一次的处理语义. ...

  5. 【译】Flink + Kafka 0.11端到端精确一次处理语义的实现

    本文是翻译作品,作者是Piotr Nowojski和Michael Winters.前者是该方案的实现者. 原文地址是https://data-artisans.com/blog/end-to-end ...

  6. Kafka设计解析(二十二)Flink + Kafka 0.11端到端精确一次处理语义的实现

    转载自 huxihx,原文链接 [译]Flink + Kafka 0.11端到端精确一次处理语义的实现 本文是翻译作品,作者是Piotr Nowojski和Michael Winters.前者是该方案 ...

  7. Flink+Kafka整合的实例

    Flink+Kafka整合实例 1.使用工具Intellig IDEA新建一个maven项目,为项目命名为kafka01. 2.我的pom.xml文件配置如下. <?xml version=&q ...

  8. debezium、kafka connector 解析 mysql binlog 到 kafak

    目的: 需要搭建一个可以自动监听MySQL数据库的变化,将变化的数据捕获处理,此处只讲解如何自动捕获mysql 中数据的变化 使用的技术 debezium :https://debezium.io/d ...

  9. Flink+kafka实现Wordcount实时计算

    1. Flink Flink介绍: Flink 是一个针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.目前主要还是依靠开源社区的贡献而发展.对 Flink 而言,其所要处理的主要场 ...

  10. Flink+Kafka 接收流数据并打印到控制台

    试验环境 Windows:IDEA Linux:Kafka,Zookeeper POM和Demo <?xml version="1.0" encoding="UTF ...

随机推荐

  1. Finance财务软件(自定义报表专题)

    我们可以通过存储过程自定义报表 1.在菜单中新增报表菜单,这里的代码约束为报表对应存储过程名称,配置完成成后重启客户端生效 2.在自定义模板中适配存储过程入参,这里的功能键值为存储过程名称,字段键值与 ...

  2. android listview里包含组件(checkbox)点击事件和Item的点击事件冲突

    在listview的item中包含有textview和checkBox.我们既想获取listitem的点击事件,又想获取listitem中textview的点击事件和listitem中checkBox ...

  3. Redis学习笔记:与SpringBoot结合使用

    首先需要在pom文件中导入相应的Redis依赖(版本可以会变化,下面坐标也可能会变化) <dependency> <groupId>org.springframework.bo ...

  4. 【Python】 Python3 环境搭建

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. Windo ...

  5. unity中的Culling Mask

    摄像机按层渲染 Camera.cullingMask = 1<<x;//渲染x层 Camera.cullingMask = ~(1<<x);//渲染除去x的所有层 Camera ...

  6. http post 请求详解

    一步一步了解http post 请求 (大白话版). 1.创建一 个 CloseableHttpClient  对象 CloseableHttpClient client = HttpClients. ...

  7. Go的Get命令兼容公司Gitlab仓库的HTTP协议

    对于公司的私有Gitlab仓库,没有对https支持,在使用最新版本的go get命令时,需要使用-insecure参数来支持http,但如果导入的包里边依赖了需要https的仓库,就不好使了,折腾了 ...

  8. 无知小子踏入python web大门

    学习python flask的第一天,费劲我小白的脑子,总算完成了环境配置 详情如下,其他小白误走弯路,希望和我一样爱好python的人坚信:python或许是最好的语言! 那么,开始喽,有不对的地方 ...

  9. [ 10.05 ]CF每日一题系列—— 962B贪心和思维?

    Description: 非 * 号的地方可以放A或B,不能AA或BB,一共有a个A,b个B,问你最多放几个 Solution: 1.模拟一下,找连续空位长度,如果长度为奇数,则我可以有一个位置放任意 ...

  10. ServiceStack.Redis记录

    一.事务 (一)AcquireLock方法 1.说明:申请对一个Key加锁(期间其他对象不能访问). 2.带using的使用,或带过期时间参数,否则锁不会自动释放. using (RedisCache ...