初学flink的人绕不开的东西就是窗口,为什么这么说呢?首先要从流和批的概念介绍起,flink我认为其能火起来的一个必不可少的原因就是流批一体,而窗口正是界分流批的重要概念。初学的时候我们可能会学习滑动窗口和滚动窗口。但实际上我们可能通过顶层的table api或者sql api直接实现窗口的部分功能。
切入正题因为我们的需求是要针对每个月的数据进行分组聚合并展示,所以如果按照需求分析来说我们需要用到的是滑动窗口,也就是只针对本月的一个有限流。我们对数据的精准度要求比较高并且我们整个数据输入到flink的链路比较长中间肯定会存在延迟,针对这种情况我们需要设置的watermark就不好把控,容易造成数据丢失的现象。所以我们采用字符串匹配的方式,通过输入的时间字段与当前月时间字段进行匹配,用来做数据是否可以参与统计的标准。
方案交代完毕,就来说说问题。flink任务运行一直很稳定且每天进行数据核验的时候都是比较准确的,但是在本月的一号打开电脑核对数却发现比实际的少了很多。当时的第一印象就是会不会是跟上篇一样的原因—状态过期了!但是很快就否认了这个想法,因为一号才刚刚开始计数怎么可能过期。然后通过比对数据以及分析flink结果推入消息队列的时间发现晚上24点至早上8点的数据根本就没有参与计数!之后上网查资料发现我们使用的函数存在时区差问题flink低版本无法设置时区,而我们使用的是东八区。
下面直接上解决办法:
1.CAST(CURRENT_TIMESTAMP AS BIGINT) * 1000 + 8 * 60 * 60 * 1000直接加八小时
2.CAST(DATE_FORMAT(LOCALTIMESTAMP,'yyMM') AS VARCHAR) 使用LOCALTIMESTAMP获取当前系统时间
使用CURRENT_DATE、CURRENT_TIMESTAMP均会存在时区问题,LOCALTIMESTAMP可以放心使用。
以上观点为个人经验之谈,不正确的地方各位看官大神多多指正。