[Flink State] State究竟保存在哪里?

作者&投稿:贰和 (若有异议请与网页底部的电邮联系)
~

从源码解析State的保存过程 ,上一篇从task和operator出发说明了保存state的过程,到最后是由算子调用snapshot方法,进行state的快照操作。那么state究竟保存在哪里?

<1> State Backend简介

关于 Raw Bytes Storage and Backends

总结: StateBackend主要是针对raw bytes storage(即checkpoint),keyed state和operator state来提供功能的,其中checkpoint数据的存储则是通过CheckpointStreamFactory,而state存储,针对keyedState是通过AbstractKeyedStateBackend,针对operatorState是通过OperatorStateBackend。

<2>

RocksDBStateBackend的构造函数可以传入一个AbstractStateBackend,否则默认采用FsStateBackend。

可以看到,从OperatorState的角度来讲,目前Flink只有一个实现,即DefaultOperatorStateBackend,它将List风格的State保存在内存中。
从KeyedState的角度来讲,目前有两种实现,HeapKeyedStateBackend将state保存在内存中,而RocksDbKeyedStateBackend将State保存在TM本地的RocksDB中。相对而言,前者在内存中,速度会快,效率高,但一方面会限制state的大小,另一方面也会造成JVM自己的内存问题;后者在本地文件中,就会涉及序列化和反序列化,效率不及前者,但可以保存的state的大小会很大。

从checkpoint和savepoint的角度来看,Memory工厂方法都保存在内存中,显然不能在生产环境使用,而Fs工厂方法和RocksDb工厂方法,则统一都放在文件系统中,比如HDFS。

从上图中3,4两行可以看到,具体用来存储state的有三种HeapKeyedStateBackend,RocksDBKeyedStateBackend和DefaultOperatorStateBackend。

DefaultOperatorStateBackend
(1)

operator的ListSate的实现类PartitionableListState, OperatorState都保存在内存中,本质上还是一个ArrayList。

(2)snapshot方法

该snapshotStrategy是AbstractSnapshotStrategy<OperatorStateHandle>,而AbstractSnapshotStrategy有三种实现类:

DefaultOperatorStateBackendSnapshotStrategy中的snapshot方法:
该snapshot方法中,主要是对 registeredOperatorStates 和 registeredBroadcastStates 的snapshot。

第一步:

针对所有注册的state进行deepCopy,为了防止在checkpoint的时候数据结构又被修改,deepCopy其实是通过序列化和反序列化的过程;

第二步:
异步写入State和MetaInfo,先创建CheckpointStateOutputStream,通过调用factory的createCheckpointStateOutputStream方法,这个factory是哪种类型的呢?这个是由定义的状态后端所决定的。之后会返回相应的OperatorstateHandle用作restore的过程。

第三步:
在StreamTask触发checkpoint的时候会将一个Task中所有的operator触发一次snapshot,触发部分就是上面1,2两个步骤,其中第二步是会返回一个RunnableFuture,在触发之后会提交一个AsyncSnapshotCallable异步任务,会阻塞一直等到checkpoint的Future,其实就是去调用这个方法AbstractAsyncIOCallable, 直到完成之后OperatorState会返回一个OperatorStateHandle,这个地方和后文的keyedState返回的handle不一样。




尧都区15727448360: 汇编指令STA -
蹉向璇美: ●STA既然有把内存单元读入寄存器的指令,那当然也要有把寄存器内容写回内存的指令.STA指令就是把A寄存器的内容写入指定的内存单元,具体要写入哪个内存单元依据寻址方式的不同而不同.例:A寄存器现在的值为$000F,执行STA指令后,这个值被写入内存单元$2100.

尧都区15727448360: c# Main函数上面个有个[STAThread]是什么意思 -
蹉向璇美: [STAThread] 是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA.用在其他方法上不产生影响.在aspx页面上可以使用AspCompat = "true" 来达到同样的效果.这个属性...

尧都区15727448360: C# 设置为单线程单元(STA)模式 -
蹉向璇美: 单元是进程内部具有相同线程访问要求的对象的逻辑容器.同一单元中的所有对象都可以接收从该单元中的任何线程发出的调用..NET Framework 不使用单元,托管对象自己负责以线程安全的方式使用所有共享资源.由于 COM 类使用单元,...

尧都区15727448360: 无线网卡STA模式是什么意思? -
蹉向璇美: Sta模式: Station, 类似于无线终端,sta本身并不接受无线的接入,它可以连接到AP,一般无线网卡即工作在该模式.

尧都区15727448360: WiFi模块设置STA指令了但是怎么连接路由器? -
蹉向璇美: 一般来说,连接了工作在AP(路由器)模式下的wifi模块,都是工作于STA模式的!至于你说的wifi模块工作在sta模式下需要连接路由器,这个要看你的具体应用了!

尧都区15727448360: HXSPI01低功耗串口wifi模块怎么使用AT指令设置STA模式联网? -
蹉向璇美: HXSPI01低功耗串口wifi模块怎么使用AT指令设置STA模式联网,首先我们要将HXSPI01wifi模块配置命令模式,然后通过单片机或者串口工具发送下面的指令.AT+WPRT=0 //设置HXSPI01wifi模块为STA模式 AT+SSID=“itslave” //设置wifi模块...

尧都区15727448360: 无线信号有但连不上 网关也进不去 重启后正常了 已加散热什么故障 -
蹉向璇美: 你提供的信息太少,只能给你几个建议方法不知是不是你想要的答案:方法:1,连接不上无线网络,有两种可能,一是wifi客户端连接数限制,有些AP最大只能连接一定STA,超过最大连接数,则其他STA则无法连上.2,wifi可以连上,但是地址获取不到.可能AP在给STA分配地址时出错,导致STA无法拿到地址而连接异常.3,wifi干扰太严重,导致STA连接AP时总是无法关联成功.这种可能性比较小.但是不排除是这个原因导致的.就这几种情况,你可以在查查.

尧都区15727448360: 输入一段ab字符串,验证是否符合(a|b)*ab,用C++编程方式验证 -
蹉向璇美: 哥来了~首先你把这个正则表达式转化为状态图四个状态STA开始, S1中间态1, END结束, ERR不匹配f(STA, 'a') = S1f(STA, others) = ERRf(S1, 'a') = S1f(S1, 'b') = ENDf(S1, others) = ERRf(END, 'a') = S1f(END, 'b') = ENDf(END, others) = ERR下...

尧都区15727448360: 我的台式电脑用LAFALINK无线网卡接受别人的信号上网,XP系统所以没有STA+AP模式, -
蹉向璇美: 这种情况可以用创建无线热点来实现手机等设备的上网,方法如下:1. 开始,运行,输入cmd回车,打开命令窗口;2. 创建一个wifi.在打开的命令行窗口中输入代码“netshwlan set hostednetwork mode=allow ssid=Test key=0123456789”,如...

尧都区15727448360: 英语游戏中的sta是什么意思 -
蹉向璇美: Spanning Tree Algorithm (STA) 生成树算法(STP),以太网中一个防止网桥循环的算法 STA (STATE) 接入无线媒介的部分 一般为网络适配器或者网络接口卡

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网