我的flink作业具有keyBy运算符,它以date〜clientId(date为yyyymmddhhMM,MM为分钟,5分钟后会改变)作为键。该运算符后面跟随5分钟的滚动窗口。卡夫卡平均输入300万/分钟的事件,高峰时间输入2000万/分钟的事件。检查点持续时间和两次检查之间的最小间隔为3分钟。
现在这是我的疑问:
1)是由keyBy创建的状态是永久保存还是在5分钟后退出。
2)如果我将该窗口更改为30分钟,需要进行哪些更改。
3)检查点时间如何受窗口大小影响。
4)在一个场景中的效果是什么,在该场景中,任何5分钟内的独立客户数达到5-10倍。这会造成数据倾斜。由于我的工作中有1-2个子任务总是需要1-2分钟左右,而其他800个子任务则需要10-15秒才能完成。
5)我每5-6个小时一次遇到一个异常,这将重新启动flink作业。 org.apache.flink.streaming.runtime.tasks.SystemProcessingTimeService $ TriggerTask上的TimerException {java.nio.channels.ClosedByInterruptException}。可能是什么原因。
几点:
keyBy不是运算符,并且没有状态。 keyBy只是声明如何对流进行重新分区。紧随keyBy的滚动窗口确实具有状态,一旦窗口完成,便将其清除。如果查看Web UI的checkpoint stats部分中的细目分类,则可以看到每个子任务具有多少状态。
这里是一个例子:
[在任何5分钟内不同客户端的数量达到5-10倍的情况下会产生什么效果?这会造成数据偏斜吗?与其他800个子任务在10-15秒内完成相比,我工作中的1-2个子任务通常要花费1-2分钟左右。]
也许您有一个或几个客户的活动比其他客户多?
了解为什么您要执行基于事件时间的键控,然后处理时间窗口而不是使用事件时间窗口,这很有趣。 (我假设您使用的是处理时间窗口,如果我写错了,请纠正我。)
您知道一次有多少个不同的时间范围处于活动状态吗?例如,12:00-12:05的窗口将收到许多时间戳为12:00-12:05的事件,以及一些11:55-12:00尚未在12:00到达的事件。如果有那么大的延迟,则可能是较早时间范围内的事件。如果不了解活动键空间的外观,就很难考虑键偏斜。