Kafka Connect Integration

时间:2017-07-25 23:40:28

标签: apache-kafka apache-kafka-connect

我正在尝试使用Kafka Connect从Oracle数据库中提取数据。 Kafka连接器提供的默认对象是“GenericRecord”类型。这使得它过于具体,导致通过执行record.getAsString(“someIDENTIFIER”)获取数据的情况。是否有可能获得特定类型的对象而不是GenericRecord类型。

1 个答案:

答案 0 :(得分:2)

Kafka Connect源连接器与SourceRecord个对象配合使用,Kafka Connect工作程序配置为使用转换器SourceRecord序列化为二进制形式,然后写入到卡夫卡主题。 Kafka Connect附带JSON转换器,Confluent提供Avro转换器。因此,写入Kafka的消息的二进制形式取决于您使用的转换器。

(同样,接收器连接器使用SinkRecord个对象,Kafka Connect工作器使用其转换器将从Kafka读取的消息的二进制形式反序列化为连接器处理的SinkRecord对象。 )

听起来你正在写一个Kafka消费者并在那里看到GenericRecord个对象。如果是这样,那么您可能已将Kafka Connect工作人员配置为使用Confluent的Avro转换器,对于JDBC连接器等源连接器,将SourceRecord转换为Kafka Connect随后写入的Avro二进制格式到卡夫卡主题。您的客户端可能正在使用配置了Avro反序列化器的Kafka使用者,除非您为反序列化器提供Avro架构以使用它,否则会将Avro编码的消息反序列化为Avro GenericRecord

但是,您可以将应用程序配置为了解特定版本的Avro架构,并让构建系统为该版本的Avro架构生成代码,以创建将反序列化Avro编码消息的特定代码到模式描述的内存形式。在Java中,这意味着您要从模式生成类,然后在代码中使用该生成的类将GenericRecord复制到类的实例中。有关GenericRecord的转化,请参阅this complete consumer example,特别是this line。在该示例中,LogLine是从Avro架构生成的类:

GenericRecord genericEvent = (GenericRecord) messageAndMetadata.message();
LogLine event = (LogLine) SpecificData.get().deepCopy(LogLine.SCHEMA$, genericEvent);

Avro的一个重要好处是它直接支持模式演变,Confluent的Schema Registry利用了这一点。因此,虽然源连接器可以演变生成的表的Avro架构以响应表中数据库中的结构更改,但只要更改数据库架构以使Avro架构向后和/或向前兼容,您的客户端应用程序使用的Avro库将自动从消息的Avro架构转换为您的应用程序使用的Avro架构。

当然,在某些时候,您将应用程序更改为使用新的Avro架构,但这并非必须同时进行。实际上,如果将Schema Registry配置为强制执行,则模式版本既可向前兼容,也可以在之前更改客户端应用程序更改数据库之后 JDBC源连接器开始使用新版本的Avro架构。