使用Flink窗口和折叠功能,元素缺失?

时间:2017-10-18 12:15:35

标签: java apache-flink flink-streaming flink-cep flinkml

当我尝试使用窗口和折叠函数聚合元素时,有些 这些元素在聚合时会被遗漏。消费元素 来自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]}

1 个答案:

答案 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)