简单介绍

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. 20170506计划-----(基于python查询oracle语句)

    在日常的工作中,经常接到开发同事查询生产SQL的请求,公司又不允许对开发开放查询SQL的权限,并且查询的堡垒机又很慢,计划做一个可以自动查询SQL的小工具,一周内完成吧. 大概功能实现了,一些涉及敏感 ...

  2. django .all .values .value_list 数据库获取数据

    .all 获取所有的对象 .values 获取所有的字典 .value_list 获取所有的元组

  3. Django form验证

    # 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ...

  4. sparse_matrix

    (1)ndarray 与 scipy.sparse.csr.csr_matrix 的互转 import numpy as npfrom scipy import sparse 1.1 ndarry 转 ...

  5. vscode+MinGW+cmake设置轻量ide

    本地随手写一些题目的时候,发现visual studio非常庞大emmm vscodevscode是一个轻量编辑器 (1)vscode插件与设置自动同步 在两个电脑上,用vscode可以同步插件 ,利 ...

  6. java37

    1.键盘录入格式: Scanner sc = new Scanner(System.in); int i = sc.nextInt();//录入整数 字符: Scanner sc1 = new Sca ...

  7. git操作之git clean删除一些没有git add的文件

    删除 一些 没有 git add 的 文件: git clean 参数 -n 显示 将要 删除的 文件 和  目录 -f 删除 文件,-df 删除 文件 和 目录

  8. 在windows上传一个新的项目到GitHub上

    不多说,直接上步骤 1,新建GitHub的账号密码. 2,新建一个项目  点击new repository 3,选择自己项目,填写格式 点击创建  create  repository,这时候一个雏形 ...

  9. 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题

    Centons下 其大概意思是fastestmirror不能使用,fastestmirror是yum的一个加速插件,具体我也没有仔细了解过,可能是系统不支持或者缺少组建导致的.处理办法就是禁用这个插件 ...

  10. 怎样用git上传代码到github以及如何更新代码

    上传代码: 1.进入指定文件夹: cd 指定文件夹 2.初始化git仓库: git init 3.将项目所有文件添加到暂存区: git add . 4.提交到仓库: git commit -m &qu ...