Flink增量检查点-数据在共享文件夹中保存多长时间

时间:2020-04-07 08:04:12

标签: apache-flink flink-streaming

我们正在使用Flink 1.6.3并将检查点保留在CEPH中,一次只保留一个检查点,并使用增量和rocksdb。

我们运行Windows的时间为3天,这意味着我们希望3-4天后不会保留checkpoint共享文件夹中的任何数据,但是我们仍然看到有更多的数据
例如
如果今天是7/4,那么某些文件来自2/4

有时候,我们会看到检查点,我们认为(由于其索引号不同步)它属于一个被压碎的作业,并且没有使用检查点来还原该作业

我的问题是

  • 为什么我们会从延迟配置中看到较旧的数据
  • 我怎么知道这些文件属于有效检查点,而不是粉碎作业的检查点-因此我们可以删除这些文件

enter image description here

1 个答案:

答案 0 :(得分:1)

经过调查并在唐云的帮助下(apache-flink-user-mailing-list)
我创建了以下代码
metadataPath -检查点/保存点文件夹中的_metadata文件的路径
已在flink 1.6.3版上进行了测试

        DataInputStream in = new DataInputStream(new FileInputStream(metadataPath));
        final Savepoint savepoint = Checkpoints.loadCheckpointMetadata(in, CheckpointTool.class.getClassLoader());

        final Set<String> pathSharedFromMetadata = savepoint.getOperatorStates().stream()
                .flatMap(operatorState -> operatorState.getSubtaskStates().values().stream()
                        .flatMap(operatorSubtaskState -> operatorSubtaskState.getManagedKeyedState().stream()
                                .flatMap(keyedStateHandle -> Stream.concat(((IncrementalKeyedStateHandle) keyedStateHandle).getSharedState().values().stream(),
                                        ((IncrementalKeyedStateHandle) keyedStateHandle).getPrivateState().values().stream())
                                        .map(streamStateHandle -> {
                                            String name = null;
                                            if (streamStateHandle instanceof FileStateHandle) {
                                                name = ((FileStateHandle) streamStateHandle).getFilePath().getName();
                                            } else {
                                                final String handleName = ((ByteStreamStateHandle) streamStateHandle).getHandleName();
                                                name = new File(handleName).getName();
                                            }
                                            return name.trim();

                                        })
                                )
                        )
                )
                .collect(Collectors.toSet());
        System.out.println("pathSharedFromMetadata:" + pathSharedFromMetadata);