002Flink

Apache Flink® — Stateful Computations over Data Streams


Streams:


对于流计算,大家应该都知道,就是处理源源不断产生的数据,虽然有批次,但是是实时的,延迟性很低的,不是那种聚合了很长一段时间才处理的方式。


Stateful:


对于状态,那怎么理解呢?开始,我认为就是在操作过程,有这个操作步骤的,操作方法,操作数据的标记,但是你不能这样说那。这样讲会比较浅,虽然你也知道很多state,所以要讲的有理有据有场景。


State:一般指一个具体的task/operator的状态。

     Keyed State(keyBy):托管状态、原始状态 工作中用的较多

     Operator State(unKeyBy):托管状态、原始状态 工作中用的较少

     原始状态工作中基本用不到

Keyed State六种托管状态

     Flatmap正常情况下实现FlatMapFunction然后重写flatMap<>方法,为了更丰富的功能另一种方式是继承RichFlatMapFunction<IN,OUT> ,多了一个初始化方法open只会运行一次。用Rich目的就是用来注册状态

     ValueState保存的是对应的一个key的一个状态值

flink datastream 输出sink topic 出现 offset 跳号的 flink stateful_状态保存

     在flatMap中对上面的countAndSum进行业务逻辑操作
     SparkStreaming中updateStateByKey、mapWithState管理状态有限

     ListState保存的是对应的一个key出现的所有的元素

     MapState:Map数据结构,key相同会覆盖value的值。将map转换成list进行操作Lists.newArrayList(mapState.value());

     利用flatMap/map+state自定义出功能丰富的算子

State backend状态备份

MemoryStateBackend 默认的state 的类型

     默认情况下,状态信息存储在TaskManager的堆内存中,checkpoint时候将状态保存到JobManager的堆内存中

FsStateBackend(使用的这种)

     状态信息存储在TaskManager的堆内存中,checkpoint时候将状态保存到指定文件中(hdfs等文件系统中)

RocksDBStateBackend

     分布式数据库,状态信息存储在RocksDB数据库(key-value的数据存储服务),最终保存在本地文件中,checkpoint时候将状态保存到指定文件中(hdfs等文件系统中)。需要引入jar包

flink datastream 输出sink topic 出现 offset 跳号的 flink stateful_大数据_02


如何设置状态类型

代码中设置

配置文件flink-conf.yaml

flink datastream 输出sink topic 出现 offset 跳号的 flink stateful_状态保存_03