Apache kafka Kafka connect(独立)将数据写入多个分区

Apache kafka Kafka connect(独立)将数据写入多个分区,apache-kafka,apache-kafka-connect,Apache Kafka,Apache Kafka Connect,我正在尝试使用Kafka connect以独立模式写入数据。我将数据写入的主题是有多个分区。但是,数据只写入其中一个分区。当我启动多个消费者控制台时,数据只打印到其中一个。另一个使用者控制台只有在第一个控制台关闭后才能获取任何数据。我无法确定需要在配置文件中做什么更改才能使其写入多个分区 这里是standalone.properties bootstrap.servers=localhost:9092 key.converter=org.apache.kafka.connect.json.Jso

我正在尝试使用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
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
现在,我使用以下命令运行连接器:

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

它只会将数据打印到一个用户控制台。但是,如果我使用producer控制台而不是Kafka connect来编写消息,那么我可以看到多个消费者(以循环方式)上的消息,这是应该的方式。但是使用Kafka connect,它只会将所有数据写入单个分区,而同一组中的其他使用者必须处于空闲状态。需要更改哪些内容才能使其写入循环系统中的所有分区?

此答案适用于Apache Kafka 0.10.2.1,但不一定适用于未来版本

您可能知道,文件源连接器生成带有
null
键和
null
主题分区号的消息。这意味着由Kafka Connect的生产者使用其分区器分配主题分区,对于具有空键的消息,将尝试将消息循环到可用分区

然而,您遇到了JSON转换器的一个怪癖,它通过
键.converter
值.converter
属性在
独立.properties
文件中配置:

name=local-file-source
connector.class=FileStreamSource
tasks.max=1
file=test4.txt
topic=consumer_group
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
当JSON转换器被配置为启用模式时,JSON表示包含一个围绕值的信封,以便键或值同时包含模式和负载:

您的
standalone.properties
文件将密钥的转换器配置为启用模式,因此,即使连接器生成带有
null
密钥和
null
模式的消息,JSON转换器(启用模式)始终将它们封装在信封中。因此,每条信息的关键是:

{
    "schema": null,
    "payload": null
}
生产者的默认分区程序总是将这些相同的键散列到同一分区

要更改行为,请编辑您的
standalone.properties
文件,并将
key.converter.schemas.enable
属性更改为
false

key.converter.schemas.enable=false
您可以选择将
value.converter.schemas.enable
属性更改为
false
,以更改写入值的方式,使其不将值包装在信封中并包含架构:

value.converter.schemas.enable=false
这也影响到转换器如何处理空值,当带有特定键的源实体被删除时,一些连接器会生成空值。例如,当从源数据库中删除行时,某些更改数据捕获连接器会执行此操作。这非常适用于,因为每条消息都表示键控实体的最后一个已知状态,并且因为空值对应于一个墓碑记录,告诉Kafka在该墓碑之前具有相同密钥的所有消息都可以从日志中删除。但是,如果将值转换器配置为启用模式的JSON转换器,将永远不会输出
null
消息值,因此日志压缩永远不会删除墓碑消息。这是个小问题,但需要注意

如果您想用JSON对键和值进行编码,那么您可能不需要或不想要模式,因此可以打开
模式。为键和值JSON转换器启用


<>对于那些真正使用模式的人,考虑使用和AVRO转换器。不仅编码的消息要小得多(由于采用了Avro编码而不是JSON字符串编码),编码的消息还包含了Avro模式的ID,因此无需协调生产商和消费者升级以使用完全相同的模式。有各种各样的优势

此答案适用于Apache Kafka 0.10.2.1,但不一定适用于未来版本

您可能知道,文件源连接器生成带有
null
键和
null
主题分区号的消息。这意味着由Kafka Connect的生产者使用其分区器分配主题分区,对于具有空键的消息,将尝试将消息循环到可用分区

然而,您遇到了JSON转换器的一个怪癖,它通过
键.converter
值.converter
属性在
独立.properties
文件中配置:

name=local-file-source
connector.class=FileStreamSource
tasks.max=1
file=test4.txt
topic=consumer_group
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
当JSON转换器被配置为启用模式时,JSON表示包含一个围绕值的信封,以便键或值同时包含模式和负载:

您的
standalone.properties
文件将密钥的转换器配置为启用模式,因此,即使连接器生成带有
null
密钥和
null
模式的消息,JSON转换器(启用模式)始终将它们封装在信封中。因此,每条信息的关键是:

{
    "schema": null,
    "payload": null
}
生产者的默认分区程序总是将这些相同的键散列到同一分区

要更改行为,请编辑您的
standalone.properties
文件,并将
key.converter.schemas.enable
属性更改为
false

key.converter.schemas.enable=false
您可以选择将
value.converter.schemas.enable
属性更改为
false
,以更改写入值的方式,使其不将值包装在信封中并包含架构:

value.converter.schemas.enable=false
Th