生成Kafka消息到选定的分区

时间:2014-10-24 17:46:43

标签: apache-zookeeper apache-kafka

根据Kafka文件:

  

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

因此我的主要问题是:

如何使用kafka-console-producer.sh(或Kafka Java客户端)向所选分区发送消息?

我想在消息发送时指定某种“分区ID”。可能这样的'分区ID'存储在某个地方 在Zookeeper中。你知道哪一个值(在Zookeeper中)识别Kafka分区吗?

5 个答案:

答案 0 :(得分:16)

到目前为止,ConsoleProducer似乎支持将密钥消息写入主题。 Kafka将使用密钥的散列将消息分发到分区中,至少使用默认行为。

目前,默认分隔符为\t,因此输入key[\t]message会将其分配到分区中:

key1    a-message

可以通过提供key.separator配置来更改分隔符,例如:

kafka-console-producer --broker-list localhost:9092,localhost:9093 \
  --topic mytopic --property key.separator=,

发送这样的信息:

key2,another-message

我已经使用默认选项卡和自定义分隔符对此进行了测试。消息被分发到两个单独的分区。

答案 1 :(得分:11)

根据当前状态(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=|

答案 2 :(得分:5)

这是你的出发点:
partitioner.class个实例中的Properties设置。在Kafka中,默认实现是kafka.producer.DefaultPartitioner

该设置的目标是:

  

用于在子主题之间对消息进行分区的分区器类。默认分区程序基于密钥的哈希值。

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

我建议在创建自己的策略时要非常小心,真的要经常测试并监控你的主题及其分区。

答案 3 :(得分:1)

  

更新:这个答案在2014年是正确的,但更多当前版本的Kafka 可以通过控制台生产者生成键/值对。请参阅below answers

kafka-console-producer.sh不支持开箱即用于向特定分区生成消息。

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

查看源代码:

https://apache.googlesource.com/kafka/+/refs/heads/trunk/bin/kafka-console-producer.sh https://apache.googlesource.com/kafka/+/refs/heads/trunk/core/src/main/scala/kafka/tools/ConsoleProducer.scala

答案 4 :(得分:1)

$(".more").click(function(){
    //To clean the classes
    $(".more").not(this).removeClass('fermer');     
    $(".more").not(this).next().removeClass('apparait');

    $(this).toggleClass('fermer');
    $(this).next(".infos").toggleClass('apparait');
});