有什么方法可以在kafka-console-producer中产生一个带有空值的消息(即,将其标记为供压缩程序使用逻辑删除的消息)?
我尝试产生“ mykey”和“ mykey |”。前者产生错误,而后者使值成为空字符串。像这样运行生产者:
$KAFKA_HOME/bin/kafka-console-producer --broker-list localhost:9092 --topic mytopic --property "parse.key=true" --property "key.separator=|"
答案 0 :(得分:3)
看看kafkacat(kafka的网络猫)。引用文档:
通过提供-Z解释为NULL的空消息值,为键“ abc”生成一个墓碑(压缩主题的“删除”):
echo "abc:" | kafkacat -b mybroker -t mytopic -Z -K:
答案 1 :(得分:0)
不幸的是,无法使用console-producer来做到这一点
这是ConsoleProducer类的代码片段(它如何读取数据)。 Kafka 0.11.0(不要认为它在不同版本之间进行了重大更改)。
override def readMessage() = {
lineNumber += 1
print(">")
(reader.readLine(), parseKey) match {
case (null, _) => null
case (line, true) =>
line.indexOf(keySeparator) match {
case -1 =>
if (ignoreError) new ProducerRecord(topic, line.getBytes(StandardCharsets.UTF_8))
else throw new KafkaException(s"No key found on line $lineNumber: $line")
case n =>
val value = (if (n + keySeparator.size > line.size) "" else line.substring(n + keySeparator.size)).getBytes(StandardCharsets.UTF_8)
new ProducerRecord(topic, line.substring(0, n).getBytes(StandardCharsets.UTF_8), value)
}
case (line, false) =>
new ProducerRecord(topic, line.getBytes(StandardCharsets.UTF_8))
}
}
如您所见,该值始终是一个不可为空的字节数组