From 57e5042f21d9c1572d1467d9f97685bcda4e6b0f Mon Sep 17 00:00:00 2001 From: zeekling Date: Sun, 17 Sep 2023 19:49:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0RocksDB=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic/checkpoint.md | 47 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/basic/checkpoint.md b/basic/checkpoint.md index 55f3ccf..0a19187 100644 --- a/basic/checkpoint.md +++ b/basic/checkpoint.md @@ -151,8 +151,6 @@ StateBackend实现类图,在1.17版本中,部分状态后端已经过期, ![pic](https://pan.zeekling.cn//flink/basic/state/StateBackend_0003.png) - - ## HashMapStateBackend 在TaskManager的内存当中保存作业的状态后端信息,如果一个TaskManager并行执行多个任务时,所有的聚合信息都要保存到当前的TaskManager内存里面。数据主要以Java对象的方式保存在堆内存当中。Key/value 形式的状态和窗口算子会持有一个 hash table,其中存储着状态值、触发器。 @@ -253,6 +251,51 @@ restoreOperation实现类图如下所示,主要包含如下的实现类。 +### RocksDBIncrementalRestoreOperation + +主要实现从增量快照中恢复RocksDB数据。核心函数为restore()。主要区分为: + +- restoreWithRescaling:从多个增量的状态后端恢复,需要进行扩缩容。在这个过程中会创建一个临时的RocksDB实例用于关key-groups。临时RocksDB当中的数据在都会复制到实际使用的RocksDB的实例当中。 +- restoreWithoutRescaling:从单个远程的增量状态后端恢复,无需进行扩缩容。 + +````java +if (isRescaling) { + restoreWithRescaling(restoreStateHandles); +} else { + restoreWithoutRescaling(theFirstStateHandle); +} +```` + + + +#### restoreWithRescaling 实现原理 + +1. 选择最优的KeyedStateHandle。 +2. 初始化RocksDB实例。 +3. 将key-groups从临时RocksDB转换到Base RocksDB数据库。 + + + +#### restoreWithoutRescaling 实现原理 + + + + + +### RocksDBFullRestoreOperation + + + +### RocksDBHeapTimersFullRestoreOperation + + + +### RocksDBNoneRestoreOperation + + + + + ## ChangelogStateBackend