首先说为什么写这个文章,是我最近发现好多网友都在问相关问题,所以我就收集了几天的资料,然后用代码做了验证,分享给大家,后边我也会分享200亿+的日志如果实时去重复。
一名网友问:"Flink如何实时给某个字段去重复"
另一个网友问“Flink如何实时计算topN写入es”
《Working with State》
在Flink中,它使用了State状态机制以及Checkpoint策略提供了强大的容错机制,不过我们需要注意区分它们,State状态是指一个Flink Job中的task中的每一个operator的状态,而Checkpoint是指在某个特定的时刻下,对整个job一个全局的快照,当我们遇到故障或者重启的时候可以从备份中进行恢复。
今天主要介绍Operator State以及KeyedState,最后介绍一下如何用KeyedProcessFunction做设备实时去重复,取topN等等。
在Flink 1.5之后,又推出了BroadCast State,它通常使用在两个流进行连接处理,其中一个流的数据是一些不常改变的数据,比如一些配置规则等等,另一个流需要连接这个Broadcast DataStream进行操作等场景,Broadcast DataStream网上有练习的例子名字叫《Apache Flink 中广播状态的实用指南》对应链接:https://mp.weixin.qq.com/s/rx10pVlx4LQF7JuCey1xag。
下面我来说一下Operator State如何去使用他:
计算结果:
下面说一下KeyedState:
主要是验证state是否按设定的20秒自动重置结果如下:
我们想要做全局设备去重复,按key实时取topN等业务需要用到KeyedProcessFunction,他是ProcessFunction扩展,在其onTimer(…)方法中提供了对定时器key的访问。
先看官方怎么介绍的:
过程函数(ProcessFunction)
是一种低层次的流处理操作,它能访问到(无环的)流应用的基本构成单元:
事件(events) (流元素)
状态(state) (容错, 一致性,只在keyed stream中)
定时器(timers) (事件时间和处理时间, 只在keyed stream中)
过程函数(ProcessFunction)
可以被认为一种提供了对有键状态(keyed state)和定时器(timers)访问的 FlatMapFunction
。每在输入流中收到一个事件,过程函数就会被触发来对事件进行处理。对于容错的状态(state), 过程函数(ProcessFunction)
可以通过 RuntimeContext
访问Flink的 有键状态(keyed state), 就像其它状态函数能够访问有键状态(keyed state)一样.定时器则允许程序对处理时间和事件时间(event time)的改变做出反应。每次对 processElement(...)
的调用都能拿到一个上下文
(Context)
对象,这个对象能访问到所处理元素事件时间的时间戳,还有 定时服务器(TimerService) 。定时服务器(TimerService)
可以为尚未发生的处理时间或事件时间实例注册回调函数。当一个定时器到达特定的时间实例时,onTimer(...)
方法就会被调用。在这个函数的调用期间,所有的状态(states)都会再次对应定时器被创建时key所属的states,同时被触发的回调函数也能操作这些状态。
注意 如果你希望访问有键状态(keyed state)和定时器(timers),你必须在一个键型流(keyed stream)上,使用过程函数(ProcessFunction)
先看代码
运行结果:
欢迎交流FlinkQQ群:235604205
本文分享自微信公众号 - 小晨说数据(flink-spark)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。