Kafka Connect是一个框架,用于将数据流导入和导出Apache Kafka。
有几个主要的概念。
- 连接器--通过管理任务来协调数据流的高级抽象概念
- 任务 - 如何从Kafka复制数据的实现
- 工人--执行连接器和任务的运行进程
- 转换器 - 用于在Connect和发送或接收数据的系统之间转换数据的代码
- 转换--改变连接器产生或发送的每条消息的简单逻辑
- 死信队列--Connect如何处理连接器的错误
连接器


Kafka Connect中的连接器定义了数据应该被复制到哪里以及从哪里复制。一个连接器实例是一个逻辑工作,负责管理Kafka和另一个系统之间的数据复制。所有实现或被连接器使用的类,都在连接器插件中定义。连接器实例和连接器插件都可以被称为 "连接器",但在上下文中应该始终明确哪个是被提及的(例如,"安装一个连接器 "是指插件,而 "检查一个连接器的状态 "是指连接器实例)。
我们鼓励用户利用现有的连接器。然而,从头开始编写一个新的连接器插件也是可能的。在高层次上,希望编写一个新的连接器插件的开发者遵循以下工作流程。更多信息可在开发者指南中找到。
任务


任务是Connect的数据模型中的主要角色。每个连接器实例都会协调一组实际复制数据的任务。通过允许连接器将一个任务分解成许多任务,Kafka Connect提供了对并行性和可扩展数据复制的内置支持,只需很少的配置。这些任务中没有存储状态。任务状态存储在Kafka的特殊主题config.storage.topic 和status.storage.topic ,并由相关的连接器管理。
任务再平衡
当一个连接器第一次提交给集群时,工作者会重新平衡集群中的全部连接器和它们的任务,以便每个工作者有大致相同的工作量。当连接器增加或减少它们所需的任务数量时,也会采用这种重新平衡的程序。
工作者
连接器和任务是逻辑上的工作单位。Kafka Connect将这些流程称为工作者,有两种类型的工作者:独立的和分布式的。
独立式工作者
独立模式是最简单的模式,由一个进程负责执行所有的连接器和任务。
由于它是一个单一的进程,它需要最小的配置。单机模式便于起步,在开发过程中,以及在某些只有一个进程有意义的情况下,例如从主机收集日志。
分布式工作者
分布式模式为Kafka Connect提供可扩展性和自动容错。在分布式模式下,你使用相同的group.id ,启动许多工作者进程,他们会自动协调,在所有可用的工作者中安排连接器和任务的执行。如果你增加了一个工作器,关闭了一个工作器,或者一个工作器意外失败,其余的工作器会检测到这一点,并自动协调,在更新的可用工作器集合中重新分配连接器和任务。请注意与消费者组再平衡的相似性。掩耳盗铃,连接者正在使用消费者组来协调和重新平衡。
转换器


为了让Kafka Connect部署在向Kafka写入或从Kafka读取数据时支持特定的数据格式,转换器是必要的。任务使用转换器来改变数据的格式,从字节到Connect内部数据格式,反之亦然。
默认情况下,Confluent平台提供以下转换器。
- AvroConverter
io.confluent.connect.avro.AvroConverter: 与模式注册表一起使用 - ProtobufConverter
io.confluent.connect.protobuf.ProtobufConverter:与Schema Registry一起使用。 - JsonSchemaConverter
io.confluent.connect.json.JsonSchemaConverter:与Schema Registry一起使用。 - JsonConverter
org.apache.kafka.connect.json.JsonConverter(不含Schema Registry):使用结构化数据 - StringConverter
org.apache.kafka.connect.storage.StringConverter:简单的字符串格式 - ByteArrayConverter
org.apache.kafka.connect.converters.ByteArrayConverter: 提供一个 "直通 "选项,不做任何转换。
变换
连接器可以配置转换功能,对单个消息进行简单和轻量级的修改。这对于微小的数据调整和事件路由来说是很方便的。在连接器的配置中,可以将多个转换串联起来。
一个转换是一个简单的函数,它接受一条记录作为输入,并输出一个修改后的记录。Kafka Connect提供的所有转换都会进行简单但常用的修改。请注意,你可以用你自己的自定义逻辑来实现转换接口,将它们打包成Kafka Connect插件,并将它们用于任何连接器。
当转换与源连接器一起使用时。Kafka Connect将连接器产生的每条源记录传递给第一个转换,该转换进行修改并输出一个新的源记录。这个更新的源记录被传递给链中的下一个转换,它产生了一个新的修改过的源记录。这个过程对其余的转换继续进行。最后更新的源记录被转换为二进制形式并写入Kafka中。
转化也可以与水槽连接器一起使用。Kafka Connect从Kafka读取消息,并将二进制表示法转换为水槽记录。如果有转换,Kafka Connect会将记录传递给第一个转换,它进行修改并输出一个新的、更新的sink记录。
死信队列
一个无效的记录可能会因为一些原因而发生。一个例子是,当一条记录以JSON格式到达sink连接器的序列化,但sink连接器的配置是期望Avro格式。当一个无效的记录不能被汇流连接器处理时,错误会根据连接器配置属性errors.tolerance 。
这个配置属性有两个有效值:none (默认)或all 。
当errors.tolerance 被设置为none ,错误或无效的记录会导致连接器任务立即失败,连接器进入失败状态。要解决这个问题,你需要查看Kafka Connect Worker的日志,找出导致失败的原因,纠正它,并重新启动连接器。
当errors.tolerance 被设置为all ,所有的错误或无效记录都会被忽略,并继续处理。要确定记录是否失败,你必须使用内部指标或计算源头的记录数,并将其与处理的记录数进行比较。
总结
在这篇文章中,我们了解了Kafka连接器的概念
