原文链接:https://blog.csdn.net/D55dffdh/article/details/82423831
AI 前线导读:Kafka Connect 是一个简单但功能强大的工具,可用于 Kafka 和其他系统之间的集成。人们对 Kafka Connect 最常见的误解之一是它的转换器。这篇文章将告诉我们如何正确地使用消息的序列化格式,以及如何在 Kafka Connect 连接器中对其进行标准化。
Kafka Connect 是 Apache Kafka 的一部分,为其他数据存储和 Kafka 提供流式集成。对于数据工程师来说,他们只需要配置一下 JSON 文件就可以了。Kafka 提供了一些可用于常见数据存储的连接器,如 JDBC、Elasticsearch、IBM MQ、S3 和 BigQuery,等等。
对于开发人员来说,Kafka Connect 提供了丰富的 API,如果有必要还可以开发其他连接器。除此之外,它还提供了用于配置和管理连接器的 REST API。
Kafka Connect 是一种模块化组件,提供了一种非常强大的集成方法。一些关键组件包括:
- 连接器——定义如何与数据存储集成的 JAR 文件;
- 转换器——处理数据的序列化和反序列化;
- 变换——可选的运行时消息操作。
人们对 Kafka Connect 最常见的误解与数据的序列化有关。Kafka Connect 使用转换器处理数据序列化。接下来让我们看看它们是如何工作的,并说明如何解决一些常见问题。
Kafka 消息都是字节
Kafka 消息被保存在主题中,每条消息就是一个键值对。当它们存储在 Kafka 中时,键和值都只是字节。Kafka 因此可以适用于各种场景,但这也意味着开发人员需要决定如何序列化数据。
在配置 Kafka Connect 时,序列化格式是最关键的配置选项之一。你需要确保从主题读取数据时使用的序列化格式与写入主题的序列化格式相同,否则就会出现混乱和错误!
序列化格式有很多种,常见的包括:
- JSON;
- Avro;
- Protobuf;
- 字符串分隔(如 CSV)。
选择序列化格式
选择序列化格式的一些指导原则:
- schema。很多时候,你的数据都有对应的 schema。你可能不喜欢,但作为开发人员,你有责任保留和传播 schema。schema 为服务之间提供了一种契约。某些消息格式(例如 Avro 和 Protobuf)具有强大的 schema 支持,而其他消息格式支持较少(JSON)或根本没有(CVS)。
- 生态系统兼容性。Avro 是 Confluent 平台的一等公民,拥有来自 Confluent Schema Registry、Kafka Connect、KSQL 的原生支持。另一方面,Protobuf 依赖社区为部分功能提供支持。
- 消息大小。JSON 是纯文本的,并且依赖了 Kafka 本身的压缩机制,Avro 和 Protobuf 都是二进制格式,序列化的消息体积更小。
- 语言支持。Avro 在 Java 领域得到了强大的支持,但如果你的公司不是基于 Java 的,那么可能会觉得它不太好用。
如果目标系统使用 JSON,Kafka 主题也必须使用 JSON 吗?
完全不需要这样。从数据源读取数据或将数据写入外部数据存储的格式不需要与 Kafka 消息的序列化格式一样。
Kafka Connect 中的连接器负责从源数据存储(例如数据库)获取数据,并以数据内部表示将数据传给转换器。然后,Kafka Connect 的转换器将这些源数据对象序列化到主题上。
在使用 Kafka Connect 作为接收器时刚好相反——转换器将来自主题的数据反序列化为内部表示,传给连接器,以便能够使用特定于目标的适当方法将数据写入目标数据存储。
也就是说,主题数据可以是 Avro 格式,当你将数据写入 HDFS 时,指定接收器的连接器使用 HDFS 支持的格式即可。
配置转换器
Kafka Connect 默认使用了 worker 级别的转换器配置,连接器可以对其进行覆盖。由于在整个管道中使用相同的序列化格式通常会更好,所以一般只需要在 worker 级别设置转换器,而不需要在连接器中指定。但你可能需要从别人的主题拉取数据,而他们使了用不同的序列化格式——对于这种情况,你需要在连接器配置中设置转换器。即使你在连接器的配置中进行了覆盖,它仍然是执行实际任务的转换器。
好的连接器一般不会序列化或反序列化存储在 Kafka 中的消息,它会让转换器完成这项工作。
请记住,Kafka 消息是键值对字节,你需要使用 key.converter 和 value.converter 为键和值指定转换器。在某些情况下,你可以为键和值使用不同的转换器。
这是使用 String 转换器的一个示例。
复制代码
|
有些转换器有一些额外的配置。对于 Avro,你需要指定 Schema Registry。对于 JSON,你需要指定是否希望 Kafka Connect 将 schema 嵌入到 JSON 消息中。在指定特定于转换器的配置时,请始终使用 key.converter. 或 value.converter. 前缀。例如,要将 Avro 用于消息载荷,你需要指定以下内容:
复制代码
|
|
|
常见的转换器包括:
- Avro——来自 Confluent 的开源项目
复制代码
|
- String——Apache Kafka 的一部分
复制代码
|
- JSON——Apache Kafka 的一部分
复制代码
|
- ByteArray——Apache Kafka 的一部分
复制代码
|
- Protobuf——来自社区的开源项目
复制代码
|
JSON 和 schema
虽然 JSON 默认不支持嵌入 schema,但 Kafka Connect 提供了一种可以将 schema 嵌入到消息中的特定 JSON 格式。由于 schema 被包含在消息中,因此生成的消息大小可能会变大。
如果你正在设置 Kafka Connect 源,并希望 Kafka Connect 在写入 Kafka 消息包含 schema,可以这样:
复制代码
|
|
|
生成的 Kafka 消息看起来像下面这样,其中包含 schema 和 payload 节点元素:
复制代码
|
|
|
|
|
|
|
|
|
|
|