Flink状态专题:keyed state和Operator state
1.状态类型
在Flink中根据数据集是否根据Key进行分区,将状态分为Keyde state和Operator State两种类型。
(1)Keyed State
表示和key相关的一种state,只能用于KeyedStream类型数据集对应的Functions和Operators之上。Keyed State是Operator State的特例,区别在于Keyed State事先按照key对数据集进行了分区,每个Key State仅对应一个Operator和Key的组合。Keyed State可以通过Key Groups进行管理,主要用于当算子并行度发生变化时,自动重新分布Keyed State数据。在系统运行过程种,一个Keyed算子实例可能运行一个或者多个Key Groups 的 keys。
(2)Operator State
2.Managed Keyed State
(1)Stateful Function定义
接下来通过完整的实例来说明如何在RichFlatmapFunction中使用ValueState,完成对介入数据最小值的获取。
StreamExecutionEnvironment env = StreamExecutionEnvironment .getExecutionEnvironment;
//创建元素数据集
DataStream<int,long> inputStream = env.fromElements((2,21L),(4,1L),(5,4L));
inputStream.keyBy(“1”).flatMap{
//定义和创建RichFlatMapFunction,第一个参数位输入数据类型,第二个参数位输出数据类型
new RichFlatMapFunction<Map(int,long),Map(int,Map(long,long))>(){
private ValueState leastValueState = null;
@Override
open(Configuration parameters){
ValueStateDescriptor leastValueStateDescriptor =new ValueStateDescriptor ("leastValueState ",class.of(long));
leastValueState = getRuntimeContext.getState(leastValueStateDescriptor );
} @Override
flatMap(Collector collector,Tuple2(int,long) t){
long leastValue =leastValueState .value();
if(t.f1>leastValue){
collector.collect(t,leastValue);
}else{
leastValueState.update(t.f1);
collector.collect(t,leastValue);
}
}
}
}
3.Managed Operator State
Operator State是一种non-keyed state,与并行的操作算子实际相关联,例如在Kafka Connector中,每个Kafka消费端算子实例都对应到Kafka的一个分区中,维护Topic分区和Offsets偏移量作为算子的Operator State。在Flink中可以实现CheckpointedFunction或者ListCheckpointed两个接口来定义操作Managed Operator State的函数。
(1)通过CheckpointedFunction接口操作Operator State
CheckpointedFunction接口定义:
public interface CheckpointedFunction{
//触发checkpoint调用
void snapshotState(FunctionSnapshotContext context)throws Exception;
//每次自定义函数初始化时,调用
void initializeState(FunctionInitializationContext context)throws Exception;
}
在每个算子中Managed Operator State都是以List形式存储,算子和算子之间的状态数据相互独立,List存储比较适合状态数据的重新分布,Flink目前支持对Managed OperatorState两种重分布的策略,分别是Even-split Redistribution和Union Redistribution。
可以通过实现FlatMapFunction和CheckpointedFunction完成对输入数据中每个key的数据元素数量和算子的元素数量的统计。
在initializeState()方法中分别简历keyedState和operator State两种状态,存储基于Key相关的状态值以及基于算子的状态值。
private class CheckpointCount(int numElements)extends FlatMapFunction<Map(int,long),Map(int,Map(long,long))>with CheckpointedFunction{
//定义算子实例本地变量,存储Operator数据数量
private long operatorCount = null;
//定义keyedState,存储和key相关的状态值
private ValueState keyedState =null;
//定义operatorState,存储算子的状态值
private ListState operatorState = null;
@Override
flatMap(Tuple(int,long)t,Collector collector){
long keyedCount okeyedState.value() +1;
//更新keyedState数量
keyedState.update(keyedCount);
//更新本地算子operatorCount值
operatorCount =operatorCount+1;
//输出结果,包括id,id对应的数量统计keyedCount,算子输入数据的数量统计operatorCount
collector.collect(t.f0,keyedCount,operatorCount);
}
//初始化状态数据
@Override
initializeState(FunctionInitializationContext context){
//定义并获取keyedState
ValueStateDescriptor KeyedDescriptor =new ValueStateDescriptor ("keyedState",createTypeInformation);
keyedState = context.getKeyedStateStore.getState(KeyedDescriptor );
//定义并获取operatorState
ValueStateDescriptor OperatorDescriptor =new ValueStateDescriptor ("OperatorState",createTypeInformation);
operatorState = context.getOperatorStateStore.getListState();
//定义在Restored过程中,从operatorState中回复数据的逻辑
if(context.isRestored){
operatorCount = operatorState.get()
}
//当发生snapshot时,将operatorCount添加到operatorState中
@Override
snapshotState(FunctionSnapshotContext context){
operatorState.clear();
operatorState.add(operatorCount);
}
}
}
可以从上述代码看到,在snapshotState()方法中清理掉上一次checkpoint中存储的operatorState的数据,然后再添加并更新本次算子中需要checkpoint的operatorCount状态变量。当重启时会调用initializeState方法,重新恢复keyedState和OperatorState,其中operatorCount数据可以从最新的operatorState中恢复。
(2)通过ListCheckpointed接口定义Operator State
ListCheckpointed接口和CheckpointedFunction接口相比再灵活性上相对较弱一点,只能支持List类型的状态,并且在数据恢复时仅支持even-redistribution策略。
需要实现以下两个方法来操作Operator State:
List<T> snapshotState(long checkpointId,long timestamp) throws Exception;
void restoreState(List<T> state) throws Exception;
其中snapshotState方法定义数据元素List存储到checkpoints的逻辑,restoreState方法则定义从checkpoints中恢复状态的逻辑。
class numberRecordsCount extends FlatMapFunction(Map(String,long),Map(String,long))with ListCheckpointed{
private long numberRecords =0L;
@Override
flatMap(Tuple2(String,long)t,Collector collector){
//接入一条记录则进行统计,并输出
numberRecords +=1;
collector.collect(t.f0,numberRecords);
}
@Override
snapshotState(long checkpointId){
Collections.singletonList(numberRecords);
}
@Override
restoreState(List<long> list){
numberRecords =0L;
for(count <list){
//从状态中恢复numberRecords数据
numberRecords +=count
}
}
}
Flink状态专题:keyed state和Operator state的更多相关文章
- 大数据计算引擎之Flink Flink状态管理和容错
这里将介绍Flink对有状态计算的支持,其中包括状态计算和无状态计算的区别,以及在Flink中支持的不同状态类型,分别有 Keyed State 和 Operator State .另外针对状态数据的 ...
- Flink状态管理与状态一致性(长文)
目录 一.前言 二.状态类型 2.1.Keyed State 2.2.Operator State 三.状态横向扩展 四.检查点机制 4.1.开启检查点 (checkpoint) 4.2.保存点机制 ...
- 第09讲:Flink 状态与容错
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- Flink学习(三)状态机制于容错机制,State与CheckPoint
摘自Apache官网 一.State的基本概念 什么叫State?搜了一把叫做状态机制.可以用作以下用途.为了保证 at least once, exactly once,Flink引入了State和 ...
- 使用Operator State方式
使用 operator state的方式有以下几种: 方式一: stateful function(RichFunction) 实现 CheckpointFunction 接口 必须实现两个方法:Vo ...
- 总结Flink状态管理和容错机制
本文来自8月11日在北京举行的 Flink Meetup会议,分享来自于施晓罡,目前在阿里大数据团队部从事Blink方面的研发,现在主要负责Blink状态管理和容错相关技术的研发. 本文主要内容如 ...
- Flink状态管理和容错机制介绍
本文主要内容如下: 有状态的流数据处理: Flink中的状态接口: 状态管理和容错机制实现: 阿里相关工作介绍: 一.有状态的流数据处理# 1.1.什么是有状态的计算# 计算任务的结果不仅仅依赖于输入 ...
- 关于 Flink 状态与容错机制
Flink 作为新一代基于事件流的.真正意义上的流批一体的大数据处理引擎,正在逐渐得到广大开发者们的青睐.就从我自身的视角看,最近也是在数据团队把一些原本由 Flume.SparkStreaming. ...
- 自动化运维工具SaltStack - 多环境(使用记录【state.sls 与 state.highstate】)
转自:https://segmentfault.com/a/1190000000513137 今天在进行 saltstack 多环境的时候,遇到一个问题,最终得到解决,好记性不如烂笔头,记录. 首先, ...
随机推荐
- ZooKeeper学习之路(二)—— Zookeeper单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...
- 【设计模式】结构型03外观模式(Facade Pattern)
[设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...
- 找不到’geckodriver’ 的环境path问题“ Message: 'geckodriver' executable needs to be in PATH. ”
运行测试脚本报找不到’geckodriver’ 的环境path 的错误 selenium3.x webdriver/firefox/webdriver.py的init中,executable_pat ...
- centos7 中安装 htop
首先启用 EPEL Repository: yum install -y epel-release 启用 EPEL Repository 后, 可以用 yum 直接安裝 Htop: yum insta ...
- Sublime Text 3 安装 BracketHighlighter
1 概述 由于最近在Sublime Text 3安装 BracketHighlighter遇到不少问题,其中踩了不少坑,因此总结下来,形成博客,希望能帮助更多的人 2 电脑环境 windows 10 ...
- UVa 1440:Inspection(带下界的最小流)***
https://vjudge.net/problem/UVA-1440 题意:给出一个图,要求每条边都必须至少走一次,问最少需要一笔画多少次. 思路:看了好久才勉强看懂模板.良心推荐:学习地址. 看完 ...
- MQ初窥门径【面试必看的Kafka和RocketMQ存储区别】
MQ初窥门径 全称(message queue)消息队列,一个用于接收消息.存储消息并转发消息的中间件 应用场景 用于解决的场景,总之是能接收消息并转发消息 用于异步处理,比如A服务做了什么事情,异步 ...
- Go - 循环
目录 概述 循环 array 循环 slice 循环 map break continue goto switch 推荐阅读 概述 前几篇文章分享了 array 数组.slice 切片.map 集合, ...
- Django前端HTML通过JS实现表格可编辑,动态添加行,回车完成新建文件夹
功能描述: 点击“新建文件夹”按钮,在table的末尾增加一行:单击页面的新增行,使单元格td变成可编辑状态:输入内容后,当单元格失去焦点时,保存输入的内容:回车后通过AJAX提交后台完成新建文件夹. ...
- Jenkins使用总结,2.0 新时代:从 CI 到 CD
Jenkins近阶段使用的总结篇,只写了个引子,却一直未动手写完,今天补上. 前几篇文章提到在内网jenkins直接构建部署升级线上环境,job都是暴露在外面,很容易被误操作,需要做简单的权限控制,以 ...