场景: 按天聚合结果 ,第二天零点将状态清空 防止前一天状态到第二天累加
keyedStream process function 核心代码
this.state = this.creditResultValueState.value();
String mobile = mysqlRecordBean.getJSONObject("after").getString("mobile").trim();
this.bloomFilter = (BloomFilter) this.bloomState.value();
if (this.bloomFilter == null) {
this.bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), 100000);
}
if (this.state == null) {
this.state = new JSONObject();
this.state.put("counts", 1L);
} else {
if (!this.bloomFilter.mightContain(mobile)) {
System.out.println("<<<<--this mobile is running --->>>>>>>>>");
this.bloomFilter.put(mobile);
this.state.put("counts", 1 + this.state.getLong("counts"));
}
}
this.state.put("day", TimeUtil.currentDay());
this.creditResultValueState.update(this.state);
this.bloomState.update(this.bloomFilter);
out.collect(this.state);
long timer = NumberRegisterADS.tomorrowZeroTimestampMs(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(), 8);
//注册处理时间
ctx.timerService().registerEventTimeTimer(timer);
-
遇到的问题:
- k8s pod 时区问题 : 12小时制
- 定时器不是在每天零点触发
-
解决办法:
- 时间问题:
通过上面步骤构建一个基础flink 镜像,然后基于该基础镜像 制作flink 作业镜像 - 定时器问题解决方案:
- 时间问题:
this.state = this.creditResultValueState.value();
String mobile = mysqlRecordBean.getJSONObject("after").getString("mobile").trim();
this.bloomFilter = (BloomFilter) this.bloomState.value();
if (this.bloomFilter == null) {
this.bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), 100000);
}
if (this.state == null) {
this.state = new JSONObject();
this.state.put("counts", 1L);
} else {
if (!this.bloomFilter.mightContain(mobile)) {
System.out.println("<<<<--this mobile is running --->>>>>>>>>");
this.bloomFilter.put(mobile);
this.state.put("counts", 1 + this.state.getLong("counts"));
}
}
this.state.put("day", TimeUtil.currentDay());
this.creditResultValueState.update(this.state);
this.bloomState.update(this.bloomFilter);
out.collect(this.state);
long timer = NumberRegisterADS.tomorrowZeroTimestampMs(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(), 8);
//注册处理时间
ctx.timerService().registerProcessingTimeTimer(timer);
将 registerEventProcessingTimeTimer 改为 registerProcessingTimeTimer
结论 :
测试观察 定时器在每天零点注册 且 清空状态后端数据