Flink提供不同的状态后端(state backends)来区分状态的存储方式和存储位置。flink状态可以存储在java堆内存内或者内存之外。通过状态后端的设置,flink允许应用保持大容量的状态。开发者可以在不改变应用逻辑的情况下设置状态后端。
默认情况下,flink的状态会保存在taskmanager的内存中,而checkpoint会保存在jobManager的内存中。
flink提供三种开箱即用的State Backend:
- MemoryStateBackend
- FsStateBackend
- RocksDBStateBackend
如果没有配置,则默认使用MemoryStateBackend。
FsStateBackend通过配置文件系统路径(type, address, path)来进行设置,FsStateBackend将动态数据保存在taskmanger的内存中,通过checkpoint机制,将状态快照写入配置好的文件系统或目录中。最小元数据保存jobManager的内存中,另外FsStateBackend通过配置一个fileStateThreshold阈值,小于该值时state存储到metadata中而非文件中。
FsStateBackend默认通过配置来使用异步快照(asynchronous snapshots)避免阻塞管道(blocking pipelines),当然也可以通过FsStateBackend的构造函数配置进行关闭。
但是当作业任务比较大的时候,默认使用JobManager保存会使任务失败,报错:state.backend.size is larger that......
意思就是状态后端的大小太大了,无法保存在JobManger中,这时我们可以更换为hdfs.
步骤如下:将flink-conf.yaml文件中加入以下两行:
state.backend: filesystem state.backend.fs.checkpointdir: hdfs://master:9000/flink-checkpoints
其中master为你hadoop namenode的ip地址或者主机名。之后在所有节点同步flink-conf.yaml,并且启动Flink即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)