我有一个关于单个代理的主题,其中不断收到有关用户点击的数据。我希望能够以接近实时的方式(例如1秒)计算每位用户最近X分钟内的平均点击次数。
我尝试使用Kafka流进行此操作,但是问题是,滑动窗口无法近乎实时地进行计算,并且无法在最近X分钟内每秒更新所有值的平均值。跳跃窗口也许适合,但对于跳跃1秒和大小为5分钟的窗口,它将创建300个窗口,从性能方面来看,我认为它看起来太多了。
有没有第三方流媒体引擎(例如Spark)但使用“普通” Kafka API的方法? (Kafka流是可选的)。
非常感谢!
最佳答案
正如评论者所说-使用Kafka Streams或KSQL。 KSQL在Kafka Streams之上运行,因此数据建模和概念(例如窗口和聚合)是相同的。
在KSQL中:
ksql> CREATE TABLE USER_CLICKS_PER_MINUTE AS \
SELECT USER_ID, COUNT(*) AS CLICK_COUNT, \
COUNT(*)/5 AS CLICKS_PER_MINUTE \
FROM RATINGS WINDOW HOPPING (SIZE 5 MINUTES, ADVANCE BY 1 SECOND) \
GROUP BY USER_ID;
Message
---------------------------
Table created and running
---------------------------
查询有状态聚合:
ksql> SELECT TIMESTAMPTOSTRING(ROWTIME, 'yyyy-MM-dd HH:mm:ss'), USER_ID, \
CLICK_COUNT, CLICKS_PER_MINUTE \
FROM USER_CLICKS_PER_MINUTE \
WHERE USER_ID=18;
2018-05-09 11:44:33 | 18 | 7 | 1
2018-05-09 11:44:34 | 18 | 7 | 1
2018-05-09 11:44:35 | 18 | 7 | 1
2018-05-09 11:44:36 | 18 | 9 | 1
2018-05-09 11:44:37 | 18 | 9 | 1
2018-05-09 11:44:38 | 18 | 10 | 2
2018-05-09 11:44:39 | 18 | 10 | 2
2018-05-09 11:44:40 | 18 | 10 | 2
2018-05-09 11:44:41 | 18 | 12 | 2
2018-05-09 11:44:42 | 18 | 12 | 2
2018-05-09 11:44:43 | 18 | 12 | 2
2018-05-09 11:44:44 | 18 | 12 | 2
2018-05-09 11:44:45 | 18 | 12 | 2
2018-05-09 11:44:46 | 18 | 12 | 2
2018-05-09 11:44:47 | 18 | 12 | 2
2018-05-09 11:44:48 | 18 | 12 | 2
2018-05-09 11:44:49 | 18 | 12 | 2
2018-05-09 11:44:50 | 18 | 12 | 2
2018-05-09 11:44:51 | 18 | 13 | 2
2018-05-09 11:44:52 | 18 | 13 | 2
2018-05-09 11:44:53 | 18 | 13 | 2
2018-05-09 11:44:54 | 18 | 13 | 2
2018-05-09 11:44:55 | 18 | 13 | 2
2018-05-09 11:44:56 | 18 | 13 | 2
2018-05-09 11:44:57 | 18 | 13 | 2
2018-05-09 11:44:58 | 18 | 13 | 2
2018-05-09 11:44:59 | 18 | 13 | 2
2018-05-09 11:45:00 | 18 | 13 | 2
2018-05-09 11:45:01 | 18 | 13 | 2
请记住,随着新事件的到来,Kafka Streams和KSQL(基于Kafka Streams构建)将在给定的时间范围内重新发出聚合。根据您的要求,每1秒钟前进一次的实际跳跃窗口可能不是您想要的。实时更新的简单滚动窗口仍将为您提供有状态聚合的实时结果。
有关KSQL的更多信息,请参见:
https://www.confluent.io/product/ksql/
KSQL docs
KSQL syntax reference
KSQL Quickstart tutorial
KSQL video tutorials