简单介绍

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

使用方式

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

  1. Properties properties = new Properties();
  2. properties.setProperty("bootstrap.servers", "localhost:9092");
  3. // only required for Kafka 0.8
  4. properties.setProperty("zookeeper.connect", "localhost:2181");
  5. properties.setProperty("group.id", "test");
  6. DataStream<String> stream = env
  7. .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所消费,

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

在初始化时, 会放入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. 树莓派3 开机自启动(SPI)

    转自:https://www.raspberrypi-spy.co.uk/2014/08/enabling-the-spi-interface-on-the-raspberry-pi/ 方案一:图形界 ...

  2. ci框架nginx访问

    url:http://localhost:20082/index.php/welcome/index 问题:apache环境下可以访问,nginx环境下不可以

  3. Java获取请求主机真实ip

    一般情况下 getRemoteAddr()是可以正常使用的,代码如下: public String getIpAdress(HttpServletRequest request) { ip = req ...

  4. java之路 把1到100之间的数的偶数相加

    /** *把1到100之间的数的偶数相加 */ class Demo{ public static void main(String[] args){ int i =1; int sum = 0; d ...

  5. JavaSE编程题

    Test1–取出一个字符串中字母出现的次数.如:字符串:”abcdekka27qoq”,输出格式为:a(2)b(1)k(2)… Test2–假如我们在开发一个系统时需要对员工进行建模,[员工]包含3个 ...

  6. C#的app.Config文件中设置,可以选择执行环境(左配置,有程序),app.Config中的appSettings首字母必须小写,符合源码要求

  7. 描点的改进:运用chart画图。

    主要是利用Chart画图: 通过选中一部分曲线进行图像的放大和缩小,最小值为1格. 先计算最大值和最小差值.然后赋值给AxisY.Minimum 和AxisY.Maximum.x轴初始显示数目:Axi ...

  8. CCS中cmd文件的编写

    http://blog.sina.com.cn/s/blog_abe5740601015b3q.html CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的 ...

  9. Js2WordCloud 词云用法

    1.引入 npm 安装: npm install js2wordcloud --save 通过script引入: <script src="dist/js2wordcloud.min. ...

  10. Java JSONArray for循环 remove成员的一个好算法

    好久没写日志了,今天来写一个,JSONArry fro循环判断value,移除不需要的,不需再将JSONArry再次转换成 map或list. JSONArray移除成员只能通过for遍历取成员,判断 ...