为什么定时器的时间设置为,窗口的end值+1ms就可以呢?
因为定时器是下游,水位线是取的多个上游的最小的,水位线是跟在数据后面的,所以当定时器的时间到达时,上游一定计算完成了,并且数据已经在水位线之前到下游了,所以可以触发计算,就是当前窗口所有的数据,比如窗口是[8:00~9:00)
为什么要用定时器呢?
不用也可以计算,但是是来一条计算一条,假如有10万条,效率低,用定时器计算,可以在数据到齐时,一起计算,效率高。
不用window,但是一定要keyBy
不用window的原因:不是取有限的数据,而是取所有end是9:00的数据
一定要keyBy的原因:因为上游计算完成的有可能有[8:05~9:0的数据,所以需要根据end分组
为什么读取文件,没到5分钟就触发计算了?

因为用的是事件时间
定义的flag变量,计算完需要置null吗?
不需要。每个key都有自己的ValueState
定时器触发的时候,上游一定都计算完了吗?
一定计算完了。
因为上游是先keyBy,再window,计算的是A商品在[8:00~9:00)时间段内的数据,B商品在[8:00~9:00)时间段内的数据,当A的水位线到达9:00的时候,触发了计算,但是B的水位线才到8:30,这时候定时器会取上游最小的8:30,所以不会触发,当B的水位线推进到9:00的时候,现在最小的就是9:00,所以定时器会触发计算,这样,A和B都被计算了,没有丢失数据。
flink的定时器如果重复注册相同的会触发多次吗?
“答案是不会,应为Flink内部使用的HeapPriorityQueueSet来存储定时器,一个注册请求到来时,其add方法会检查是否已经存在,如果存在则不会加入。”
文章为作者独立观点,不代表股票量化交易软件接口观点