首先说为什么写这个文章,是我最近发现好多网友都在问相关问题,所以我就收集了几天的资料,然后用代码做了验证,分享给大家,后边我也会分享200亿+的日志如果实时去重复。

一名网友问:"Flink如何实时给某个字段去重复"

Flink之State代码实战--理论篇-LMLPHP

另一个网友问“Flink如何实时计算topN写入es”

Flink之State代码实战--理论篇-LMLPHP

《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源创计划”,欢迎正在阅读的你也加入,一起分享。

03-09 21:41