Kafka Connect Develop Details 开发详解
目录
Kafka Connect Develop Details 开发详解
不得不吐槽下Kafka的官方文档写的不够详细,可能他们需要干的事情太多了,无暇顾及。
看本文之前请先阅读:Kafka Connect Details 详解 。
Core Concepts 核心概念
Connecttors
Kafka Connect分2种,一种是Source Connector,一种是Sink Connector。
Source将数据从第三方系统导入到Kafka;Sink将Kafka中的数据导出到第三方系统。
Connector主要是接收配置文件,描述如何将数据进行传输。
并且将工作(job)分解成任务(task)分配给Task去执行。
Tasks
Task也分2种,SourceTask和SinkTask。
主要工作就是将Connector分配给的数据集,进行处理传递。
SourceTask使用的pull拉的方式,SinkTask使用的push推的方式。
它们处理的都是Record的子类,包含topics,partition,offset,key和value信息。
Task是无状态的,不需要处理offset等信息,这些是由Connector来处理的。
Workers
Connector和Task是逻辑单元,一个Worker对应一个进程,包含Connector和Tasks的。
在分布式模式下,是在Worker层面进行failover的处理的。
具体实现
只需要实现2个抽象类,一个是Connector,一个是Task。
Source Connector的就是SourceConnector和SourceTask。
Sink Connector的就是SinkConnector和SinkTask。
具体代码怎么写,可以直接抄file包目录下的FileStreamSourceTask和FileStreamSinkTask,
或者参看我的Github项目:maxwell-sink。
其实Kafka Connect本质就是包了一层的producer和consumer。
新建项目,添加依赖
1.新建maven项目,添加依赖:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>connect-api</artifactId>
<version>0.10.1.1</version>
<!--<version>0.11.0.0</version>-->
</dependency>
这里的版本最好保持和线上Kafka Brokers集群的版本一致。
这里要提下的是0.11.0.0版本的Kafka实现了exactly once消息投递语义,还是非常强大的。
-
添加maven assembly plugin
因为我们最终要将实现的Connector作为插件打包成jar,部署到Kafka Broker机器上。
要注意的是:connector的依赖,不要kafka的运行时jar的版本有冲突。 - 继承并实现抽象类
- 打包,部署
详情请参看:Kafka Connect Deploy 部署
注意事项
这里我说几点要注意的:
- Sink Connector中不需要自己提交offset,但是要保证put方法中得到的records集合的处理,要么全部成功,要么全部失败
@Override public void put(final Collection<SinkRecord> records) { }
特别是在做JDBC的batch的时候,有可能将一次records分成多个batch,必须要保证在所有batch执行完后,
再设置connection.commit(),而不是每次batch之后就commit了。 -
顺序性
maxwell使用的主键hash策略,所以能够保证相同primary key值的记录的所有增删改产生的消息都hash到相同的partition上去,
而且我们知道一个partiton只会被分配到一个task上去(也就是一个消费者),所以不会有乱序的问题。 - version()方法
不太重要,反正我直接用的”1.0.0”。
参考
8.3 Connector Development Guide
Kafka Concepts