Kafka流 - 第一个例子WordCount在第一圈没有正确计算

时间:2017-03-08 14:42:20

标签: apache-kafka apache-kafka-streams apache-kafka-connect bigdata

我正在学习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

依旧......

1 个答案:

答案 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)。

我可以想象发生了以下情况:

  • 您早些时候尝试过Kafka并将测试数据输入到输入主题。
  • 然后你休息了大约24小时才恢复实验。
  • 现在,应用程序在重新启动时,从一开始就一直重新读取输入主题,从而获取较旧的测试输入数据,从而导致“虚增”计数。
  

如果我使用消费者控制台查看输入主题转储,则它已正确加载并且没有脏数据。

您可以在添加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)。