我正在学习Kafka Streams,我对Java 8中第一个WordCount示例有疑问,取自文档。
使用最新版本的kafka流,Kafka Connect和WordCount lambda表达式示例。
我按照以下步骤操作: 我在Kafka中创建了一个输入主题,还有一个输出主题。启动应用程序流,然后通过插入.txt文件中的一些单词上传输入主题
在第一个计数中,在输出主题中,我看到正确分组的单词,但计数错误。如果我尝试重新插入相同的单词,则先前错误计数的连续计数都是正确的。
如果我使用消费者控制台查看输入主题转储,它已正确加载并且没有脏数据。
第一次错误怎么回事?
示例[第一数据]: (在卡夫卡输入主题) 嗨 迈克迈克 测试
(App流媒体正在运行)
(输出主题)hi 12迈克4测试3(随意计数)
[SUCCESSIVE DATA - 在输入主题中发布相同的字词]
(输出主题)hi 14 mike 6 test 4
[NEW ATTEMPT]
(输出主题)hi 16 mike 8 test 5
依旧......
答案 0 :(得分:3)
Apache Kafka中的WordCount演示有the following lines:
// setting offset reset to earliest so that we can re-run the demo code with the same pre-loaded data
// Note: To re-run the demo, you need to use the offset reset tool:
// https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Application+Reset+Tool
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
这意味着,当您重新启动应用程序时,它将从一开始就读取其输入主题(“最早”) iff Kafka中存储的WordCount应用程序没有现有的消费者偏移量。应用程序的消费者抵消在一定数量的应用程序不活动后在卡夫卡过期,默认为24小时(参见offsets.retention.minutes
broker configuration)。
我可以想象发生了以下情况:
如果我使用消费者控制台查看输入主题转储,则它已正确加载并且没有脏数据。
您可以在添加CLI选项--from-beginning
的同时再次使用控制台使用者查看输入主题来验证我的假设(请参阅https://kafka.apache.org/documentation/#quickstart_consume)。
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic yourInputTopic --from-beginning
这将显示主题“yourInputTopic”中的所有可用数据 - 减去在此期间可能从Kafka主题中清除的所有数据(默认代理配置将清除超过7天的数据,cf 。log.retention.hours
)。