文章目录

  • 前言
  • 什么叫无状态计算
  • 什么叫有状态计算
  • 自己设计的状态管理
  • Flink中的有状态计算
  • Flink状态分类
    • Managed State & Raw State
    • Managed State 分为两种,Keyed State 和 Operator State
      • Keyed State(键控状态)
      • Operator State(算子状态)

前言

从官网中,我们可以得知,Flink是一个可针对于有限流与无限流数据做有状态计算的处理引擎。


什么叫无状态计算

计算过程不需要考虑历史数据历史结果,相同的输入得到相同的输出,每一次计算都是独立的

ex:flink中的map算子 、FlatMap算子等等

什么叫有状态计算

有状态计算就是指,我们对一个数据计算过程中,可以拿到上一次计算的结果,在上一次计算结果中进行累积或逻辑处理。

比如,计算一个小时内用户成交总金额,那么Flink在计算一个小时内的用户支付信息的时候,就需要对支付信息进行一个不断的累积,然后输出最后的计算结果。

Ex:现在一个小时内用户成交信息有五条,其中每条中金额如下

1 2 1 3 4

那么一个小时内的总金额则为1+2+1+3+4

那么,如果想要不断的数据进行累积,我们要做的便是对数据进行状态管理,因为既然要累积,那自然要找个地方存储计算结果,以便于下一个元素来到时可以取出上一次计算结果进行累加处理

这样一来,便涉及到了中间状态(上一次结果)的管理维护了!

自己设计的状态管理

(1)内存管理,使用原生java工具包 Map、List等

flink集群部署下存在问题

(2)借助第三方组件 Redis

频繁需要与Redis交互(频繁网络IO)

Flink中的有状态计算

Flink中已经对需要进行有状态计算的API,做了封装,底层已经维护好了状态!

示例

一起回到梦开始的地方=========Flink-World-Count

package com.leilei;import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;/*** @author lei* @version 1.0* @date 2021/3/7 15:51* @desc 单词计数 DataStream 匿名内部类*/
public class WordCountDataStream1 {public static void main(String[] args) throws Exception {// 1.准备环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 设置运行模式env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);// 2.准备数据源DataStreamSource<String> elementsSource = env.fromElements("java,scala,php,c++","java,scala,php", "java,scala", "java");// 3.数据处理转换KeyedStream<Tuple2<String, Integer>, String> streamResult = elementsSource.flatMap(new FlatMapFunction<String, String>() {@Overridepublic void flatMap(String element, Collector<String> out) throws Exception {String[] wordArr = element.split(",");for (String word : wordArr) {out.collect(word);}}}).map(new MapFunction<String, Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> map(String word) throws Exception {return Tuple2.of(word, 1);}}).keyBy(new KeySelector<Tuple2<String, Integer>, String>() {@Overridepublic String getKey(Tuple2<String, Integer> value) throws Exception {return value.f0;}});SingleOutputStreamOperator<Tuple2<String, Integer>> sum = streamResult.sum(1);// 4.数据输出sum.print();// 5.执行程序env.execute("flink-hello-world");}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OH8dixra-1623161719085)(C:\Users\leile\AppData\Roaming\Typora\typora-user-images\image-20210607210126177.png)]

Flink自动为我们对数据做了状态累计, java这个词出现了4次、scala出现了三次…

为什么 Flink 知道之前已经处理过一次 java 或者scala了呢?实际上这里是state 发挥作用了,在这里,数据被称为 keyed state 存储了计算结果,当有了相同数据时,在对应结果中继续进行数据累计

Flink状态分类

Managed State & Raw State

从状态的托管类型(是否由Flink来管理)来区分,Flink分为ManagedState 和Raw State

ManagedState :

Managed State (托管状态):由 Flink Runtime 管理,自动存储,自动恢复,在内存管理上有优化,Managed State 支持已知的数据结构,如 Value、List、Map 等等,在大多数场景下均可使用

RawState:

RawState(原始状态):需要用户自己管理,需要自己序列化,Flink 不知道 State 中存入的数据是什么结构,只有用户自己知道,需要最终序列化为可存储的数据结构,数据结构只支持字节数组 ,所有状态都要转换为二进制字节数组;一般作用在当 Managed State 不够用时,比如需要自定义 Operator 时,才会使用 Raw State


在实际生产环境中,我们一般都是由Flink来为我们做状态管理,我们只需要测住关注自己的计算逻辑(即大多数情况下使用的是托管状态ManagedState)

Managed State 分为两种,Keyed State 和 Operator State

Keyed State(键控状态)

Keyed State基于KeyedStream(数据流使用keyBy()算子)基础上才可使用。

Keyed State由数据流中定义的每个具体的键(key) 来维护和访问,每个key维护一个状态实例,flink会将具有相同键的数据分区到同一个算子任务中,这个任务会维护和处理这个key对应的状态(会自动将状态的访问范围限定为当前数据的key,一个key只能访问它自己的状态,不同key之间也不能互相访问) 当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的key

键控状态Keyed State 数据结构:由于每个键属于 keyed operator 的一个并行实例,可将其简单地视为 <parallel-operator-instance, key>

键控状态Keyed State 数据结构:

① 值状态(ValueState),将状态表示为单个值;(直接.value获取,Set操作是.update)

  • get操作: ValueState.value()
  • set操作: ValueState.update(T value)

② 列表状态(ListState),将状态表示为一组数据的列表(存多个状态);(.get,.update,.add)

  • ListState.add(T value)
  • ListState.addAll(List values)
  • ListState.get()返回Iterable
  • ListState.update(List values)

③ 映射状态(MapState<K, V>),将状态表示为一组Key-Value对;(.get,.put ,类似HashMap)

  • MapState.get(UK key)
  • MapState.put(UK key, UV value)
  • MapState.contains(UK key)
  • MapState.remove(UK key)

④ 聚合状态(ReducingState & AggregatingState<I, O>),将状态表示为一个用于聚合操作的列表;(.add不像之前添加到列表,它是直接聚合到之前的结果中)

Operator State(算子状态)

作用范围限定为算子任务,同一任务状态共享(每一个并行的子任务共享一个状态),由同一并行任务所处理的所有数据都可以访问到相同的状态,算子状态不能由相同或不同算子的另一个任务访问(相同算子的不同任务之间也不能访问

算子状态提供三种数据结构:

① 列表状态(List state),将状态表示为一组数据的列表;(会根据并行度的调整把之前的状态重新分组重新分配

② 联合列表状态(Union list state),也将状态表示为数据的列表,它常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复(把之前的每一个状态广播到对应的每个算子中)。

③ 广播状态(Broadcast state),如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态(把同一个状态广播给所有算子子任务);

Flink-State相关推荐

  1. 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等

    1.15.Flink state(状态)管理与恢复 1.15.1.什么是state 1.15.2.状态(State) 1.15.3.Keyed State 1.15.4.Operator State ...

  2. Flink State 有可能代替数据库吗?

    有状态的计算作为容错以及数据一致性的保证,是当今实时计算必不可少的特性之一,流行的实时计算引擎包括 Google Dataflow.Flink.Spark (Structure) Streaming. ...

  3. Flink state缓存测试

    Flink state 在实际生产中的应用 一.FlinkState的概念 1.state分类 2.state backend 类型 二.实际应用如下 1.应用场景介绍 2.FsStateBacken ...

  4. Flink State和容错机制

    为什么80%的码农都做不了架构师?>>>    1. Flink Barriers Flink分布式快照的核心元素是流barriers. 这些barriers被注入数据流并与记录一起 ...

  5. flink state ttl

    flink ttl类型 本文用的flink1.7,一般来说ttl用在keyedStream中,官网只介绍了keyed flink ttl用法 import org.apache.flink.api.c ...

  6. Flink State 误用之痛,你中招了吗?

    简介:本文主要讨论一个问题:ValueState 中存 Map 与 MapState 有什么区别?如果不懂这两者的区别,而且使用 ValueState 中存大对象,生产环境很可能会出现以下问题:CPU ...

  7. Flink State 最佳实践

    本文主要分享与交流 Flink 状态使用过程中的一些经验与心得,当然标题取了"最佳实践"之名,希望文章内容能给读者带去一些干货.本文内容首先是回顾 state 相关概念,并认识和区 ...

  8. Flink State

    键控状态数据结构 1.值状态( Value State ) new ValueStateDescriptor("last-temp", Types.of[T]) • 将状态表示为单 ...

  9. 3种Flink State Backed| 你该用哪个?

    简介 01 .不同 State backend 吞吐量对比 02 .不同 State backend 延迟对比 03. State backend 的选择 04. MemoryStateBackend ...

  10. Flink State 深度讲解

    在基础篇中的 1.2 节中介绍了 Flink 是一款有状态的流处理框架.那么大家可能有点疑问,这个状态是什么意思?拿 Flink 最简单的 Word Count 程序来说,它需要不断的对 word 出 ...

最新文章

  1. hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available
  2. 《Essential C++》读书笔记 之 泛型编程风格
  3. 使用root用户安装Hybris遇到的错误
  4. SQL Server复制需要有实际的服务器名称才能连接到服务器 错误解决方案
  5. 115_Power Pivot之HR薪酬计算:公积金、社保、个税、实发工资相关
  6. 问题:连接查询和子查询的区别和连接及优劣?
  7. Ubuntu14.04中踩过的坑
  8. python import出错_python – ImportError:无法导入名称’app’
  9. 【车间调度】基于matlab GUI遗传算法求解车间调度问题【含Matlab源码 049期】
  10. Windows开始菜单快捷方式位置(磁贴)
  11. Qt编写Modbus从机程序
  12. SQL Server 2008 r2数据库可疑状态解决
  13. 浅析分支定界法在SLAM技术中的应用
  14. java理论笔试题_Java基础笔试题及答案
  15. linux下kegg注释软件,KEGG pathway注释过程
  16. Spark 的一些名词术语
  17. cnn模型(cnn神经网络模型)
  18. 三方应用如何在SystemUI快捷设置中添加快捷开关
  19. Camera2 三预览
  20. ES自定义评分机制:function_score查询详解

热门文章

  1. django管理后台修改管理系统名称和应用名称的方法
  2. 频谱泄露栅栏效应及其解决方法
  3. Day30——分组得分最高的所有下标
  4. 【Linux】_exit()、exit(0)、exit(1)与return区别详解
  5. omv系统mysql_树莓派NAS——OMV安装篇(一)
  6. 按键助手 1.0 中文免费绿色版
  7. 独家专访LAION创始人:高中生与科学家同酬,Discord上一呼百应
  8. 领酌酒业告诉你:喝酱香酒的八大好处
  9. 全国前三季度农产品生产价格同比上涨19.1%
  10. aws DynamoDB 读/写容量模式