[英]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
將能夠檢測和使用它。
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.