Kafka窗口流使宽限期和抑制密钥感知

时间:2019-07-17 19:28:29

标签: apache-kafka apache-kafka-streams

我目前有一个简单的数据流,例如:

|-----|--------|-------|
| Key | TS(ms) | Value |
|-----|--------|-------|
|  A  |   1000 |   0   |
|  A  |   1000 |   0   |
|  A  |  61000 |   0   |
|  A  |  61000 |   0   |
|  A  | 121000 |   0   |
|  A  | 121000 |   0   |
|  A  | 181000 |  10   |
|  A  | 181000 |  10   |
|  A  | 241000 |  10   |
|  A  | 241000 |  10   |
|  B  |   1000 |   0   |
|  B  |   1000 |   0   |
|  B  |  61000 |   0   |
|  B  |  61000 |   0   |
|  B  | 121000 |   0   |
|  B  | 121000 |   0   |
|  B  | 181000 |  10   |
|  B  | 181000 |  10   |
|  B  |   1000 |  10   |
|  B  | 241000 |  10   |
|  B  | 241000 |  10   |
|-----|--------|-------|

这也是我在主题中发布数据的顺序,该值实际上不是整数,而是avro值,但键是字符串。

我的代码是这样的:

KStream<Windowed<String>, Long> aggregatedStream = inputStream
   .groupByKey()
   .windowedBy(TimeWindows.of(Duration.ofMinutes(1)).grace(Duration.ZERO))
   .count()
   .toStream();

aggregatedStream.print(Printed.toSysOut());

print的输出是:

[KTABLE-TOSTREAM-0000000003]: [A@0/60000], 1
[KTABLE-TOSTREAM-0000000003]: [A@0/60000], 2
[KTABLE-TOSTREAM-0000000003]: [A@60000/120000], 1
[KTABLE-TOSTREAM-0000000003]: [A@60000/120000], 2
[KTABLE-TOSTREAM-0000000003]: [A@120000/180000], 1
[KTABLE-TOSTREAM-0000000003]: [A@120000/180000], 2
[KTABLE-TOSTREAM-0000000003]: [A@180000/240000], 1
[KTABLE-TOSTREAM-0000000003]: [A@180000/240000], 2
[KTABLE-TOSTREAM-0000000003]: [A@240000/300000], 1
[KTABLE-TOSTREAM-0000000003]: [A@240000/300000], 2
[KTABLE-TOSTREAM-0000000003]: [B@240000/300000], 1
[KTABLE-TOSTREAM-0000000003]: [B@240000/300000], 2

宽限期似乎与流的密钥无关地全局适用,我希望(如果可能)取而代之的是接​​收密钥A的所有10个窗口计数和密钥B的10个窗口计数。 以某种方式,宽限期仅基于流的键关闭窗口。 有可能吗?

1 个答案:

答案 0 :(得分:0)

gracesuppress似乎为每个分区使用了全局时间戳,因此每个键不可能有不同的时间戳。

相反,可以禁用宽限期并使用自定义转换器而不是常规的suppress来通过按键进行抑制。