Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 如何使用kafka控制台生成器向选定分区生成消息?_Apache Kafka - Fatal编程技术网

Apache kafka 如何使用kafka控制台生成器向选定分区生成消息?

Apache kafka 如何使用kafka控制台生成器向选定分区生成消息?,apache-kafka,Apache Kafka,根据卡夫卡文献: 生产者负责选择将哪个消息分配给主题中的哪个分区 如何使用kafka console producer.sh将消息发送到所选分区 我想在消息发送时指定某种类型的“分区id”。这里是您的起点: Properties实例中的partitioner.class设置。在Kafka中,默认实现是Kafka.producer.DefaultPartitioner 该设置的目标是: 用于在子主题之间对消息进行分区的分区器类。默认分区器基于密钥的散列 这意味着,如果要更改默认分区器的行为,则需要

根据卡夫卡文献:

生产者负责选择将哪个消息分配给主题中的哪个分区

如何使用
kafka console producer.sh
将消息发送到所选分区


我想在消息发送时指定某种类型的“分区id”。

这里是您的起点:
Properties
实例中的
partitioner.class
设置。在Kafka中,默认实现是
Kafka.producer.DefaultPartitioner

该设置的目标是:

用于在子主题之间对消息进行分区的分区器类。默认分区器基于密钥的散列

这意味着,如果要更改默认分区器的行为,则需要创建自己的
kafka.producer.partitioner
接口实现

我建议您在创建自己的策略时要非常小心,并对其进行大量测试,监视您的主题及其分区

更新:这个答案在2014年是正确的,但更多最新版本的卡夫卡可以通过控制台生成器生成键/值对。见

kafka-console-producer.sh不支持直接向特定分区生成消息

但是,更新脚本以传递分区Id的额外参数,然后在自定义分区器中处理它应该非常简单,如@Chiron在kafka.tools.ConsoleProducer类的修改版本中所述

请查看以下位置的源代码:


到目前为止,
ConsoleProducer
似乎支持向主题写入键控消息。Kafka将使用密钥的散列将消息分发到分区中,至少默认情况下是这样

当前,默认分隔符是
\t
,因此输入
键[\t]消息将在分区之间分配它:

key1    a-message
可以通过提供
键来更改分隔符。分隔符
配置,例如:

kafka-console-producer --broker-list localhost:9092,localhost:9093 \
  --topic mytopic --property key.separator=,
发送如下消息:

key2,another-message

我已经用默认选项卡和自定义分隔符成功地测试了这一点。消息被分发到两个单独的分区。

根据当前状态(Kafka>=0.10.0.1),Kafka-console-producer.sh脚本和底层的ConsoleProducer java类支持使用密钥发送数据,但默认情况下禁用这种支持,并且必须从CLI启用

也就是说,您需要设置属性
parse.key
。此外,如果您想使用不同于制表符的字符,请使用Cedric答案中指定的
key.separator

最后,命令行将是:

kafka-console.producer.sh --broker-list kafka:9092,kafka2:9092 \
    --topic $TOPIC --property parse.key=true --property key.separator=|

这似乎不再是真的了,请看我的评论。这对我也很有效。值也可以包含分隔符。它只是将第一个分隔符位置和拆分记录分成两个TokStand来根据分区来检索控制台用户中的消息。考虑使用类似于卡夫卡控制台的用户接受Primest.KEY属性。您还可以自定义字符串以分隔输出中的键和值:key.separator--property print.key=true--property key.separator=“-”但是我们如何在存储的消息中也包含密钥(最坏的情况是我可以复制它)
C:\arunsingh\demo\kafka_2.13-2.4.0\bin\windows>kafka-console-producer.bat --broker-list 127.0.0.1:9094 --topic arun_topic --property parse.key=true --property key.separator=, --producer-property acks=all
>myKey1, Message with key
>myKey2, Message with key 2
>