当我尝试使用窗口和折叠函数聚合元素时,有些
这些元素在聚合时会被遗漏。消费元素
来自Kafka setWrapping(True)
并汇总它们
作为奇数和偶数值。
输出是:
(value:0, value:1, value:2, value:3)
10-13之间的数字丢失,这种情况发生在随机集合中 数字。有人可以建议下面的代码错过了什么 我怎样才能确保处理所有元素?
{even=[0, 2, 4], odd=[1, 3]}
{even=[6, 8], odd=[5, 7, 9]}
{even=[14, 16, 18], odd=[15, 17]}
{even=[20, 22], odd=[19, 21, 23]}
{even=[24, 26, 28], odd=[25, 27]}
答案 0 :(得分:1)
所以我开始编写这个的第一部分,然后注意到你的自定义触发器使你使用TumblingEventTime窗口这种无关紧要的事实,但我想要包括我原来的想法,因为我不完全确定为什么你不使用它时会使用EventTime窗口。我意识到这一点之后的回答低于原始版本。
您是在单个并行还是多个并行运行?我问的原因是因为如果它是多个并行性(并且kafka主题也包含多个分区),则可能以非连续顺序接收和处理消息。这可能导致带有时间戳的消息导致水印前进,从而导致窗口处理消息。然后,下一条消息的事件时间在当前水印时间之前(a.k.a为“迟到”),这将导致消息被删除。
例如:如果你有20个元素,每个元素的事件时间是这样的:
message1:eventTime:1000 message1:eventTime:2000 等...
您的活动时间窗口是5001毫秒。
现在消息message1到message9按顺序通过。第一个窗口将被处理并包含消息1-5(message6将导致窗口被处理)。现在如果message11在message10之前进入,它将导致处理包含消息6-9的窗口。接下来,当message10出现时,水印已经超过了message10的事件时间,导致它被作为“迟到事件”而被删除。
正确答案
请尝试使用countWindow。
,而不是使用eventTime窗口和自定义触发器所以替换这个:
.window(TumblingEventTimeWindows.of(Time.milliseconds(3000))).
trigger(CustomizedCountTrigger.of(5L))//.trigger(CountTrigger.of(2))
有了这个:
.countWindow(5L)