簡體   English   中英

如何使用 kafka-console-producer 向選定的分區生成消息?

[英]How to produce messages to selected partition using kafka-console-producer?

根據 Kafka 文檔:

生產者負責選擇將哪條消息分配給主題中的哪個分區。

如何使用kafka-console-producer.sh將消息發送到選定的分區?

我想在消息發送時指定某種“分區 ID”。

不可能以特定分區為目標,但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

我已經使用默認選項卡和自定義分隔符成功測試了這一點。 消息被分發到兩個單獨的分區。

根據目前的情況(Kafka>=0.10.0.1),kafka-console-producer.sh 腳本和底層的 ConsoleProducer java 類支持使用 key 發送數據,而不是分區 ID,但默認禁用這種支持並且必須從 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=|

這是您的起點:
您的Properties實例中的partitioner.class設置。 在 Kafka 中,默認實現是kafka.producer.DefaultPartitioner

該設置的目標是:

用於在子主題之間划分消息的分區器類。 默認分區器基於鍵的散列。

這意味着如果你想改變默認 partitioner 的行為,比如針對特定的分區,那么你需要創建自己的kafka.producer.Partitioner接口的實現。

我建議在創建自己的策略時要非常小心,並且確實要對其進行大量測試並監控您的主題及其分區。

當它構建為 JAR 時,您可以在 CLI CLASSPATH變量中設置 JAR 的路徑,然后kafka-console-producer將能夠檢測和使用它。

更新:這個答案在 2014 年是正確的,但是最新版本的 Kafka可以通過控制台生產者生成鍵/值對。 查看其他答案

kafka-console-producer.sh 不支持開箱即用地向特定分區生成消息。

但是,更新腳本以傳遞額外的分區 ID 參數,然后在自定義分區程序中處理它應該非常簡單,如@Chiron 在 kafka.tools.ConsoleProducer 類的修改版本中的帖子中所述。

看看源代碼:

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

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
>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM