我正在尝试创建一个简单的应用程序,该应用程序向Cassandra写入我网站上每个网页的页面浏览量。我想从逻辑小时开始每5分钟写一次累积页面视图。
我的代码看起来像这样:
KTable<Windowed<String>, Long> hourlyPageViewsCounts = keyedPageViews
.groupByKey()
.count(TimeWindows.of(TimeUnit.MINUTES.toMillis(60)), "HourlyPageViewsAgg")
我还通过设置COMMIT_INTERVAL_MS_CONFIG
属性将我的提交间隔设置为5分钟。根据我的理解,应该每隔5分钟汇总一小时并输出中间积累状态。
我现在的问题是两个:
鉴于我有自己的Cassandra驱动程序,如何将聚合的5分钟中间结果写入Cassandra?试图使用foreach但这似乎不起作用。
我只需要在聚合5分钟后进行写入,而不是每次更新。可能吗?阅读here表明,如果不使用低级API,我可能会尝试避免这种情况,因为使用更高级别的API似乎可以完成一项简单的任务。
答案 0 :(得分:1)
提交和生成/编写输出是Kafka Streams API中的两个不同概念。在Kafka Streams API中,输出是连续生成的,并且提交用于“标记进度”(即,提交消费者偏移,包括刷新所有商店和缓冲的生产者记录)。
您可以查看此博文,了解更多详情:https://www.confluent.io/blog/watermarks-tables-event-time-dataflow-model/
1)要写入Casandra,建议将应用程序的结果写回主题(通过#to("topic-name")
)并使用Kafka Connect to get the data into Casandra。
比较:External system queries during Kafka Stream processing
2)如果你想拥有严格的5分钟间隔,那么使用低级API是唯一的方法(正如你已经指出的那样)。请注意,下一个版本(Kafka 1.0)将包含挂钟时间标点符号,这样可以让您更轻松地实现目标。