配置Apache Kafka接收器jdbc连接器

时间:2019-07-04 21:17:33

标签: apache-kafka apache-kafka-connect

我想将发送到主题的数据发送到postgresql数据库。因此,我遵循this guide并配置了属性文件,如下所示:

name=transaction-sink
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
tasks.max=1
topics=transactions
connection.url=jdbc:postgresql://localhost:5432/db
connection.user=db-user
connection.password=
auto.create=true
insert.mode=insert
table.name.format=transaction
pk.mode=none

我通过以下方式启动连接器

./bin/connect-standalone etc/schema-registry/connect-avro-standalone.properties etc/kafka-connect-jdbc/sink-quickstart-postgresql.properties

接收器连接器已创建,但由于此错误而无法启动:

Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id -1
Caused by: org.apache.kafka.common.errors.SerializationException: Unknown magic byte!

该模式为avro格式并已注册,我可以向该主题发送(产生)消息并从该主题读取(使用)。但是我似乎无法将其发送到数据库。

这是我的./etc/schema-registry/connect-avro-standalone.properties

key.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://localhost:8081

这是使用java-api提供主题的生产者:

properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
properties.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://localhost:8081");

try (KafkaProducer<String, Transaction> producer = new KafkaProducer<>(properties)) {
    Transaction transaction = new Transaction();
    transaction.setFoo("foo");
    transaction.setBar("bar");
    UUID uuid = UUID.randomUUID();
    final ProducerRecord<String, Transaction> record = new ProducerRecord<>(TOPIC, uuid.toString(), transaction);
    producer.send(record);
}

我正在使用验证数据是否已正确序列化和反序列化

./bin/kafka-avro-console-consumer --bootstrap-server localhost:9092 \
    --property schema.registry.url=http://localhost:8081 \
    --topic transactions \
    --from-beginning --max-messages 1

数据库已启动并正在运行。

1 个答案:

答案 0 :(得分:1)

这是不正确的:

  

未知的魔术字节可能是由于id字段而不是架构的一部分

该错误意味着该主题上的消息未使用Schema Registry Avro序列化程序进行序列化。

您如何将数据放在该主题上?

也许所有消息都有问题,也许只有一部分-但默认情况下,这将暂停Kafka Connect任务。

您可以设置

"errors.tolerance":"all",

使其忽略不能反序列化的消息。但是,如果所有的序列都没有正确进行Avro序列化,这将无济于事,您需要正确地序列化它们,或者选择其他的Converter(例如,如果它们实际上是JSON,请使用JSONConverter)。

这些参考文献应该为您提供更多帮助:


编辑:

如果要使用StringSerializer序列化密钥,则需要在Connect配置中使用它:

key.converter=org.apache.kafka.connect.storage.StringConverter

您可以将其设置为worker(全局属性,适用于在其上运行的所有连接器),也可以仅为此连接器设置(即,将其放在连接器属性本身中,它将覆盖worker设置)