我有一个关于单个代理的主题,其中不断收到有关用户点击的数据。我希望能够以接近实时的方式(例如1秒)计算每位用户最近X分钟内的平均点击次数。

我尝试使用Kafka流进行此操作,但是问题是,滑动窗口无法近乎实时地进行计算,并且无法在最近X分钟内每秒更新所有值的平均值。跳跃窗口也许适合,但对于跳跃1秒和大小为5分钟的窗口,它将创建300个窗口,从性能方面来看,我认为它看起来太多了。

有没有第三方流媒体引擎(例如Spark)但使用“普通” Kafka API的方法? (Kafka流是可选的)。

非常感谢!

最佳答案

正如评论者所说-使用Kafka StreamsKSQL。 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

10-07 13:49