Flink_05_状态(个人总结)

    声明: 1. 本文为我的个人复习总结, 并那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
              2. 由于是个人总结, 所以用最精简的话语来写文章
              3. 若有错误不当之处, 请指出

状态:

状态就是一块内存, 一个变量, 如果要访问历史窗口(或批次)的数据时就需要用到状态, 把历史窗口(或批次)的数据处理结果值保存到状态里;

并且带有自动做检查点存储的功能

无状态算子: map

有状态算子: sum, reduce 后面数据需要用到前面数据的聚合中间结果

无状态的计算一般是基于一个独立事件输出结果, 如温度超过90度时发出警告

有状态的计算一般是基于多个事件输出结果, 如一分钟内收到两个差值超过20度的温度发出警告

没keyBy前的算子状态:

没keyBy前的算子状态 对于Task内部(SubTask之间)是共享的, 4个sumTask, 那么每个sumTask就是SubTask, 它们属于同一个Task

定义一个没keyBy前的算子状态, 得实现ListCheckedPoint接口

  1. **列表状态(**List State)

    状态数据用一个List存储, 程序恢复时, 将List拆分成一个个 单个元素 分发给各个TaskManager

  2. 联合列表状态(Union List State)

    状态数据用一个List存储, 但程序恢复时, 将List分别发给各个TaskManager, 让他们自己去里面挑, 这个不好

  3. 广播状态(BroadcastState)

    广播状态的创建要借助MapState

    广播流: A流有1个分区, B流有4个分区, B流要用到A流的数据, 所以需要将A流1个分区的数据广播到B流的4个分区, 用的状态类型是MapState

keyBy后的键控状态:

keyBy后的键控状态对于同key事件是共享的

  1. ValueState<T> 保存单个的值

    • get 操作: .value( )
    • set 操作: .update(T value)
  2. ListState<T> 保存一个List集合

    • Iterable<T> ListState.get( )
    • .update(List<T> values)
    • .add(T value)
    • ListState.addAll(List<T> values)
  3. MapState<K, V> 保存K-V对

    • .get(UK key)
    • .put(UK key, UV value)
    • .contains(UK key)
    • .remove(UK key)
  4. ReducingState<T> 同时得传入reduce聚合操作逻辑, 每添加数据时便会调用它, 只保存聚合后的结果

  5. AggregatingState<I, O> 自定义聚合操作逻辑, 类似于ReducingState但比其更复杂些, 得实现更多方法

.clear( )是清空操作

API-声明一个状态:

@Override
public void open (Configuration parameters) throws Exception {
    lastTempState = getRuntimeContext( ).getState(new ValueStateDescriptor<Double>("last-temp", Double.class, Double.MIN_VALUE));
}

从checkpoint恢复时并行度改变, 状态如何重新分配?

算子状态:

  1. ListState: 将原先所有State中的元素均匀划分给新的Task
  2. Union List State: 将原先所有State中的元素全部发给新的Task, 每个Task都拥有全量数据
  3. BroadState State: 将原先所有State中的元素全部发给新的Task, 每个Task都拥有全量数据

键控状态:

Key被Redistribute到哪个Task, 对应的Keyed State就被Redistribute到哪个Task

基于Key Group来做分配:

  1. numOfKeyGroups=maxParallelism

  2. 将key分为group (KeyGroup = hash(key)%numOfKeyGroups)

  3. 将group分配给task实例

RocksDB: 基于LSM(内存+磁盘)结构的存储系统

状态后端(StateBackend):

负责管理状态, 以及做检查点存储

  1. MemoryStateBackend 状态在内存, 检查点存在内存

  2. FsStateBackend 状态在内存, 检查点存在远程FileSystem

  3. RocksDBStateBackend 状态在内存, 检查点存在本地RocksDB

    <groupId>org.apache.flink</groupId>
        <artifactId>flink-statebackend-rocksdb_2.12</artifactId>
    <version>1.10.1</version>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值