天天看点

Flink的容错机制第三篇 状态管理及容错

上篇我们大体讲了Flink容错机制的处理方法,和产生checkpoint的机制;这次主要讲一些补充

一,Flink的checkpoint形式

checkpoint有两种特殊形式:

Savepoint:是一种特殊的checkpoint,只不过不像checkpoint定期的从系统中去触发的,它是用户通过命令触发,

存储格式和checkpoint也是不相同的,会将数据按照一个标准的格式存储,不管配置什么样,Flink都会从这个checkpoint恢复,是用来做版本升级一个非常好的工具;

 External Checkpoint:对已有checkpoint的一种扩展,就是说做完一次内部的一次Checkpoint后,还会在用户给定的一个目录中,多存储一份checkpoint的数据;

二,Flink的状态划分

Flink中包含两种基础的状态:Keyed State和Operator State。(Blink现在支持MapState)

Keyed State

顾名思义,就是基于KeyedStream上的状态。这个状态是跟特定的key绑定的,对KeyedStream流上的每一个key,可能都对应一个state。所以keyedState支持多种数据结构并支持动态拓展

Operator State

与Keyed State不同,Operator State跟一个特定operator的一个并发实例绑定,整个operator只对应一个state。相比较而言,在一个operator上,可能会有很多个key,从而对应多个keyed state。Operator State可以在任意流中使用但支持有限的数据结构(list)

三,Flink状态持久化方式

Flink有三种状态持久化的方式

用户可以根据自己的需求选择,如果数据量较小,可以存放到MemoryStateBackend和FsStateBackend中,如果数据量较大,可以放到RockDB中。RockDB和FsStateBackend都支持将数据写在文件中,而文件路径传给master。

MemoryStateBackend:state数据存储在内存中,并被保存在一个由多层java map嵌套而成的数据结构中,默认情况下,数据大小不可以超过5MB

FsStateBackend:策略是当状态的大小小于1MB(可配置,最大1MB)时,会把状态数据直接存储在meta data file中,避免出现很小的状态文件。

FsStateBackend另外一个成员变量就是basePath,即checkpoint的路径。它会记录状态的文件路径,然后传给master节点,一般用于记录容量比较大的状态。

它会在本地文件系统中维护状态,KeyedStateBackend等会直接写入本地rocksdb中。同时它需要配置一个远端的filesystem uri(一般是HDFS),在做checkpoint的时候,会把本地的数据直接复制到filesystem中。fail over的时候从filesystem中恢复到本地。

RocksDB:每个state存储在单独一个columnfamily中,存储状态的文件路径,只用于增量checkpoint。

更新的时候会直接以key + namespace作为key,然后把具体的值更新到rocksdb中。

做checkpoint的时候,会首先在本地对rockdb做checkpoint(rocksdb自带的checkpoint功能),这一步是同步的。然后将checkpoint异步复制到远程文件系统中。最后返回RocksDBStateHandle。

RocksDB克服了HeapKeyedStateBackend受内存限制的缺点,同时又能够持久化到远端文件系统中,比较适合在生产中使用。

Flink的容错机制第三篇 状态管理及容错

本文章只用于理解,最后补充一下Flink实战的学习资源:

1. 官网 https://ci.apache.org/projects/flink/flink-docs-stable/

所有技术栈和接口都在官网文档中有介绍

2. 数据仓库 https://www.ververica.com/flink-forward-san-francisco-2018

各种有关于Flink前沿论坛的资料和视频

3.阿里云flink系列 https://yq.aliyun.com/articles/225623#

实战内容多一些,链接只是一个例子,教你如何在实战中配置使用

4. 过往记忆 https://www.iteblog.com/archives/category/flink/

很多大数据技术的中文文档

5. Flink论坛 https://cwiki.apache.org/confluence/display/FLINK/Apache+Flink+Home

可以看到很多课题和问题,以及解决方法

6. github https://github.com/apache/flink

源码才是王道

继续阅读