了解Kafka连接的概念

122 阅读6分钟

Kafka Connect是一个框架,用于将数据流导入和导出Apache Kafka。

有几个主要的概念。

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

连接器

Kafka Connect中的连接器定义了数据应该被复制到哪里以及从哪里复制。一个连接器实例是一个逻辑工作,负责管理Kafka和另一个系统之间的数据复制。所有实现或被连接器使用的类,都在连接器插件中定义。连接器实例和连接器插件都可以被称为 "连接器",但在上下文中应该始终明确哪个是被提及的(例如,"安装一个连接器 "是指插件,而 "检查一个连接器的状态 "是指连接器实例)。

我们鼓励用户利用现有的连接器。然而,从头开始编写一个新的连接器插件也是可能的。在高层次上,希望编写一个新的连接器插件的开发者遵循以下工作流程。更多信息可在开发者指南中找到。

任务

任务是Connect的数据模型中的主要角色。每个连接器实例都会协调一组实际复制数据的任务。通过允许连接器将一个任务分解成许多任务,Kafka Connect提供了对并行性和可扩展数据复制的内置支持,只需很少的配置。这些任务中没有存储状态。任务状态存储在Kafka的特殊主题config.storage.topicstatus.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连接器的概念