我正在尝试使用Kafka connect来使用独立模式写入数据。我正在写数据的主题是有多个分区。但是,数据仅写入其中一个分区。当我启动多个消费者控制台时,数据仅打印到其中一个。其他消费者控制台仅在第一个数据关闭后获取任何数据。我无法弄清楚我需要在配置文件中进行哪些更改才能使其写入多个分区。
这是standalone.properties
bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=1000
rest.port=8084
connect-file-source.properties:
name=local-file-source
connector.class=FileStreamSource
tasks.max=1
file=test4.txt
topic=consumer_group
现在我使用以下命令运行连接器:
bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties
使用以下命令启动使用者控制台:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic consumer_group --from-beginning --consumer-property group.id=new-consumer-group
它仅将打印数据保存到其中一个消费者控制台。但是,如果我使用生产者控制台而不是Kafka连接来编写消息,那么我可以看到多个消费者的消息(以循环方式),它应该是这样的。但是使用Kafka connect,它只是将所有数据写入单个分区,而同一组中的其他消费者必须闲置。需要更改什么才能将其写入循环系统中的所有分区?
答案 0 :(得分:3)
此答案适用于Apache Kafka 0.10.2.1,但未必适用于未来版本。
如您所知,文件源连接器会生成带有null
密钥和null
主题分区号的邮件。这意味着由Kafka Connect的制作人使用它的 partitioner 来分配主题分区,对于具有空键的消息,default partitioner将尝试舍入-robin消息到可用的分区。
然而 ,您正在遇到JSON转换器的一个怪癖,它通过{{在standalone.properties
文件中配置1}}和key.converter
属性:
value.converter
当JSON转换器配置为启用架构时,JSON表示包含值周围的包络,以便键或值包含架构和有效负载:
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
您的{
"schema": ...,
"payload": ...
}
文件配置了模式启用的密钥转换器,因此即使连接器生成的邮件包含standalone.properties
个密钥和null
模式,JSON转换器(启用了模式)始终将它们包装在一个信封中。因此,每条消息的密钥都将是:
null
生产者的默认分区程序始终将这些相同的密钥哈希到相同的分区。
要更改行为,请修改{
"schema": null,
"payload": null
}
个文件并将standalone.properties
属性更改为key.converter.schemas.enable
:
false
您可以选择将key.converter.schemas.enable=false
属性更改为value.converter.schemas.enable
,以更改值的写入方式,而不是将值包装在信封中并包含架构:
false
这也会影响转换器处理空值的方式,某些连接器在删除具有特定键的源实体时会生成这些值。例如,某些更改数据捕获连接器在从源数据库中删除行时执行此操作。这适用于log compacted topics,因为每条消息代表键控实体的最后已知状态,并且因为null 值对应于 tombstone 记录,告诉Kafka在该逻辑删除之前具有相同密钥的所有消息都可以从日志中删除。但是,如果将值转换器配置为启用了模式的JSON Converter 将永远不会输出value.converter.schemas.enable=false
消息值,因此日志压缩永远不会删除逻辑删除消息。这是一个小问题,但需要注意。
如果你想用JSON编码你的密钥和值,那么你很可能不需要或不需要这些模式,因此可以转换null
它们的密钥和值JSON转换器。 / p>
对于那些真正使用模式的人,请考虑使用Confluent's Schema Registry和Avro转换器。编码消息不仅显着更小(由于Avro编码而不是JSON字符串编码),编码消息包含Avro架构的ID,因此允许您evolve your message schemas over time而无需协调升级生产者和消费者使用完全相同的模式。有各种优势!