Kafka Connect无法使用主题策略

时间:2018-11-28 14:25:25

标签: apache-kafka apache-kafka-connect confluent-schema-registry

上下文

我编码了几个小的Kafka Connect连接器。一个每秒仅生成随机数据,另一个每秒将其记录在控制台中。它们与Schema Registry集成在一起,因此数据通过Avro进行序列化。

我使用fast-data-dev Docker image provided by Landoop

将它们部署到了本地Kafka环境中

基本设置有效,并每秒产生一条记录的消息

但是,我想更改subject name strategy。默认值是生成两个主题:

  • ${topic}-key
  • ${topic}-value

根据我的用例,我将需要生成具有不同模式的事件,这些事件最终会涉及同一主题。因此,我需要的主题名称是:

  • ${topic}-${keyRecordName}
  • ${topic}-${valueRecordName}

根据the docs,我的需求符合TopicRecordNameStrategy

我尝试了什么

我创建了avroData对象,用于发送值以进行连接:

class SampleSourceConnectorTask : SourceTask() {

    private lateinit var avroData: AvroData 

    override fun start(props: Map<String, String>) {
        [...]
        avroData = AvroData(AvroDataConfig(props))
    }

并随后用于创建SourceRecord响应对象

The documentation指出,为了在Kafka Connect中使用架构注册表,我必须在连接器配置中设置一些属性。因此,当我创建它时,将它们添加:

name=SampleSourceConnector
connector.class=[...]
tasks.max=1
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
key.subject.name.strategy=io.confluent.kafka.serializers.subject.TopicRecordNameStrategy
value.subject.name.strategy=io.confluent.kafka.serializers.subject.TopicRecordNameStrategy

问题

连接器似乎忽略了这些属性,并继续使用旧的${topic}-key${topic}-value主题。

问题

Kafka Connect应该支持不同的主题策略。通过编写自己的AvroConverter版本并硬编码主题策略是我需要的策略,我设法解决了该问题。但是,这似乎不是一种好方法,并且在尝试使用Sink Kafka Connector占用数据时也带来了问题。我复制了这个主题,所以有一个旧名称(${topic}-key)的版本可以正常工作

将主题策略指定给Kafka Connect的正确设置是什么?

1 个答案:

答案 0 :(得分:4)

您缺少key.convertervalue.converter前缀,以便将配置传递到对流器。因此,代替:

key.subject.name.strategy
value.subject.name.strategy

您想要的:

key.converter.key.subject.name.strategy
value.converter.value.subject.name.strategy

来源https://docs.confluent.io/current/connect/managing/configuring.html

  

要将配置参数传递给键和值转换器,请在定义默认转换器时像在工作程序配置中一样为它们加上前缀key.converter.value.converter.。请注意,只有在key.convertervalue.converter属性中指定了相应的转换器配置时,才使用这些参数。