上下文
我编码了几个小的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的正确设置是什么?
答案 0 :(得分:4)
您缺少key.converter
和value.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.converter
或value.converter
属性中指定了相应的转换器配置时,才使用这些参数。