聊聊flink的FsCheckpointStorage
序
本文主要研究一下flink的FsCheckpointStorage
CheckpointStorage
flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStorage.java
/**
* CheckpointStorage implements the durable storage of checkpoint data and metadata streams.
* An individual checkpoint or savepoint is stored to a {@link CheckpointStorageLocation},
* created by this class.
*/
public interface CheckpointStorage {
boolean supportsHighlyAvailableStorage();
boolean hasDefaultSavepointLocation();
CompletedCheckpointStorageLocation resolveCheckpoint(String externalPointer) throws IOException;
CheckpointStorageLocation initializeLocationForCheckpoint(long checkpointId) throws IOException;
CheckpointStorageLocation initializeLocationForSavepoint(
long checkpointId,
@Nullable String externalLocationPointer) throws IOException;
CheckpointStreamFactory resolveCheckpointStorageLocation(
long checkpointId,
CheckpointStorageLocationReference reference) throws IOException;
CheckpointStateOutputStream createTaskOwnedStateStream() throws IOException;
}
- CheckpointStorage介面主要定義了持久化checkpoint data及metadata streams的基本方法;supportsHighlyAvailableStorage方法返回該backend是否支援highly available storage;hasDefaultSavepointLocation方法是否有預設的savepoint location;resolveCheckpoint方法用於解析checkpoint location返回CompletedCheckpointStorageLocation;initializeLocationForCheckpoint方法根據checkpointId來初始化storage location;initializeLocationForSavepoint方法用於根據checkpointId來初始化savepoint的storage location;resolveCheckpointStorageLocation方法解析CheckpointStorageLocationReference返回CheckpointStreamFactory;createTaskOwnedStateStream方法用於開啟一個stream來持久化checkpoint state
AbstractFsCheckpointStorage
flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/filesystem/AbstractFsCheckpointStorage.java
/**
* An implementation of durable checkpoint storage to file systems.
*/
public abstract class AbstractFsCheckpointStorage implements CheckpointStorage {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
/** The prefix of the directory containing the data exclusive to a checkpoint. */
public static final String CHECKPOINT_DIR_PREFIX = "chk-";
/** The name of the directory for shared checkpoint state. */
public static final String CHECKPOINT_SHARED_STATE_DIR = "shared";
/** The name of the directory for state not owned/released by the master, but by the TaskManagers. */
public static final String CHECKPOINT_TASK_OWNED_STATE_DIR = "taskowned";
/** The name of the metadata files in checkpoints / savepoints. */
public static final String METADATA_FILE_NAME = "_metadata";
/** The magic number that is put in front of any reference. */
private static final byte[] REFERENCE_MAGIC_NUMBER = new byte[] { 0x05, 0x5F, 0x3F, 0x18 };
// ------------------------------------------------------------------------
// Fields and properties
// ------------------------------------------------------------------------
/** The jobId, written into the generated savepoint directories. */
private final JobID jobId;
/** The default location for savepoints. Null, if none is configured. */
@Nullable
private final Path defaultSavepointDirectory;
@Override
public boolean hasDefaultSavepointLocation() {
return defaultSavepointDirectory != null;
}
@Override
public CompletedCheckpointStorageLocation resolveCheckpoint(String checkpointPointer) throws IOException {
return resolveCheckpointPointer(checkpointPointer);
}
/**
* Creates a file system based storage location for a savepoint.
*
* <p>This methods implements the logic that decides which location to use (given optional
* parameters for a configured location and a location passed for this specific savepoint)
* and how to name and initialize the savepoint directory.
*
* @param externalLocationPointer The target location pointer for the savepoint.
* Must be a valid URI. Null, if not supplied.
* @param checkpointId The checkpoint ID of the savepoint.
*
* @return The checkpoint storage location for the savepoint.
*
* @throws IOException Thrown if the target directory could not be created.
*/
@Override
public CheckpointStorageLocation initializeLocationForSavepoint(
@SuppressWarnings("unused") long checkpointId,
@Nullable String externalLocationPointer) throws IOException {
// determine where to write the savepoint to
final Path savepointBasePath;
if (externalLocationPointer != null) {
savepointBasePath = new Path(externalLocationPointer);
}
else if (defaultSavepointDirectory != null) {
savepointBasePath = defaultSavepointDirectory;
}
else {
throw new IllegalArgumentException("No savepoint location given and no default location configured.");
}
// generate the savepoint directory
final FileSystem fs = savepointBasePath.getFileSystem();
final String prefix = "savepoint-" + jobId.toString().substring(0, 6) + '-';
Exception latestException = null;
for (int attempt = 0; attempt < 10; attempt++) {
final Path path = new Path(savepointBasePath, FileUtils.getRandomFilename(prefix));
try {
if (fs.mkdirs(path)) {
// we make the path qualified, to make it independent of default schemes and authorities
final Path qp = path.makeQualified(fs);
return createSavepointLocation(fs, qp);
}
} catch (Exception e) {
latestException = e;
}
}
throw new IOException("Failed to create savepoint directory at " + savepointBasePath, latestException);
}
protected abstract CheckpointStorageLocation createSavepointLocation(FileSystem fs, Path location) throws IOException;
//......
}
- AbstractFsCheckpointStorage主要是實現了CheckpointStorage介面的hasDefaultSavepointLocation、resolveCheckpoint、initializeLocationForSavepoint方法
- resolveCheckpoint方法主要做兩件事情,一個是解析checkpoint/savepoint path,一個是解析checkpoint/savepoint的metadata path,獲取他們的FileStatus,然後建立FsCompletedCheckpointStorageLocation
- initializeLocationForSavepoint方法主要是給savepoint建立一個CheckpointStorageLocation,它可以根據externalLocationPointer來建立,該值為null的話則使用defaultSavepointDirectory,該方法裡頭呼叫了createSavepointLocation抽象方法,由子類去實現
FsCheckpointStorage
flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/filesystem/FsCheckpointStorage.java
/**
* An implementation of durable checkpoint storage to file systems.
*/
public class FsCheckpointStorage extends AbstractFsCheckpointStorage {
private final FileSystem fileSystem;
private final Path checkpointsDirectory;
private final Path sharedStateDirectory;
private final Path taskOwnedStateDirectory;
private final int fileSizeThreshold;
public FsCheckpointStorage(
Path checkpointBaseDirectory,
@Nullable Path defaultSavepointDirectory,
JobID jobId,
int fileSizeThreshold) throws IOException {
this(checkpointBaseDirectory.getFileSystem(),
checkpointBaseDirectory,
defaultSavepointDirectory,
jobId,
fileSizeThreshold);
}
public FsCheckpointStorage(
FileSystem fs,
Path checkpointBaseDirectory,
@Nullable Path defaultSavepointDirectory,
JobID jobId,
int fileSizeThreshold) throws IOException {
super(jobId, defaultSavepointDirectory);
checkArgument(fileSizeThreshold >= 0);
this.fileSystem = checkNotNull(fs);
this.checkpointsDirectory = getCheckpointDirectoryForJob(checkpointBaseDirectory, jobId);
this.sharedStateDirectory = new Path(checkpointsDirectory, CHECKPOINT_SHARED_STATE_DIR);
this.taskOwnedStateDirectory = new Path(checkpointsDirectory, CHECKPOINT_TASK_OWNED_STATE_DIR);
this.fileSizeThreshold = fileSizeThreshold;
// initialize the dedicated directories
fileSystem.mkdirs(checkpointsDirectory);
fileSystem.mkdirs(sharedStateDirectory);
fileSystem.mkdirs(taskOwnedStateDirectory);
}
// ------------------------------------------------------------------------
public Path getCheckpointsDirectory() {
return checkpointsDirectory;
}
// ------------------------------------------------------------------------
// CheckpointStorage implementation
// ------------------------------------------------------------------------
@Override
public boolean supportsHighlyAvailableStorage() {
return true;
}
@Override
public CheckpointStorageLocation initializeLocationForCheckpoint(long checkpointId) throws IOException {
checkArgument(checkpointId >= 0);
// prepare all the paths needed for the checkpoints
final Path checkpointDir = createCheckpointDirectory(checkpointsDirectory, checkpointId);
// create the checkpoint exclusive directory
fileSystem.mkdirs(checkpointDir);
return new FsCheckpointStorageLocation(
fileSystem,
checkpointDir,
sharedStateDirectory,
taskOwnedStateDirectory,
CheckpointStorageLocationReference.getDefault(),
fileSizeThreshold);
}
@Override
public CheckpointStreamFactory resolveCheckpointStorageLocation(
long checkpointId,
CheckpointStorageLocationReference reference) throws IOException {
if (reference.isDefaultReference()) {
// default reference, construct the default location for that particular checkpoint
final Path checkpointDir = createCheckpointDirectory(checkpointsDirectory, checkpointId);
return new FsCheckpointStorageLocation(
fileSystem,
checkpointDir,
sharedStateDirectory,
taskOwnedStateDirectory,
reference,
fileSizeThreshold);
}
else {
// location encoded in the reference
final Path path = decodePathFromReference(reference);
return new FsCheckpointStorageLocation(
path.getFileSystem(),
path,
path,
path,
reference,
fileSizeThreshold);
}
}
@Override
public CheckpointStateOutputStream createTaskOwnedStateStream() throws IOException {
return new FsCheckpointStateOutputStream(
taskOwnedStateDirectory,
fileSystem,
FsCheckpointStreamFactory.DEFAULT_WRITE_BUFFER_SIZE,
fileSizeThreshold);
}
@Override
protected CheckpointStorageLocation createSavepointLocation(FileSystem fs, Path location) throws IOException {
final CheckpointStorageLocationReference reference = encodePathAsReference(location);
return new FsCheckpointStorageLocation(fs, location, location, location, reference, fileSizeThreshold);
}
}
- FsCheckpointStorage繼承了AbstractFsCheckpointStorage,實現了它定義的createSavepointLocation方法,這裡返回的是FsCheckpointStorageLocation
- FsCheckpointStorage還實現了CheckpointStorage介面定義的AbstractFsCheckpointStorage未實現的幾個方法:supportsHighlyAvailableStorage、initializeLocationForCheckpoint、resolveCheckpointStorageLocation、createTaskOwnedStateStream
- supportsHighlyAvailableStorage這裡直接返回true;initializeLocationForCheckpoint這裡建立的是FsCheckpointStorageLocation;resolveCheckpointStorageLocation這裡建立的是FsCheckpointStorageLocation;而createTaskOwnedStateStream建立的是FsCheckpointStateOutputStream
小結
- CheckpointStorage介面主要定義了持久化checkpoint data及metadata streams的基本方法;AbstractFsCheckpointStorage主要是實現了CheckpointStorage介面的hasDefaultSavepointLocation、resolveCheckpoint、initializeLocationForSavepoint方法,同時定義了一個抽象方法createSavepointLocation
- FsCheckpointStorage繼承了AbstractFsCheckpointStorage,實現了它定義的createSavepointLocation方法,同時還實現了CheckpointStorage介面定義的AbstractFsCheckpointStorage未實現的幾個方法:supportsHighlyAvailableStorage、initializeLocationForCheckpoint、resolveCheckpointStorageLocation、createTaskOwnedStateStream
- FsCheckpointStorage的supportsHighlyAvailableStorage方法直接返回true;initializeLocationForCheckpoint方法建立的是FsCheckpointStorageLocation;resolveCheckpointStorageLocation方法建立的是FsCheckpointStorageLocation;而createTaskOwnedStateStream方法建立的是FsCheckpointStateOutputStream
doc
相關文章
- 聊聊flink的ParallelIteratorInputFormatParallelORM
- 聊聊flink的SourceFunctionFunction
- 聊聊flink的NetworkBufferPool
- 聊聊flink的RestClusterClientConfigurationRESTclient
- 聊聊flink的ConnectionManager
- 聊聊flink的RichParallelSourceFunctionParallelFunction
- 聊聊flink的TableFactory
- 聊聊flink的RestartStrategiesREST
- 聊聊flink jdbc的ParameterValuesProviderJDBCIDE
- 聊聊flink的Parallel ExecutionParallel
- 聊聊flink Table的Joins
- 聊聊flink KeyedStream的KeySelector
- 聊聊flink水位線
- 聊聊flink Table的OrderBy及LimitMIT
- 聊聊flink如何相容StormTopologyORM
- 聊聊flink Table的where及filter操作Filter
- 聊聊flink JobManager的heap大小設定
- [Flink] Flink 版本特性的演進
- Flink的架構架構
- 【Flink】基於 Flink 的流式資料實時去重
- [Flink/FlinkCDC] 實踐總結:Flink 1.12.6 升級 Flink 1.15.4
- Flink - datagen 的介紹
- Flink的分割槽策略
- flink 流的合併
- Flink的Table以及SQLSQL
- 聊聊SpringBootTest的webEnvironmentSpring BootWeb
- 聊聊spring的UnexpectedRollbackExceptionSpringException
- 聊聊arthas的ArthasBootstrapboot
- 聊聊arthas的HttpTermServerHTTPServer
- 聊聊PowerJob的AppInfoControllerAPPController
- 聊聊PowerJob的ServerControllerServerController
- 聊聊PowerJob的InstanceStatusCheckService
- 聊聊PowerJob的CleanService
- 聊聊canal的BooleanMutexBooleanMutex
- 聊聊canal的CanalAdapterWorkerAPT
- 聊聊canal的CanalAdapterServiceAPT
- 聊聊elasticsearch的ElectMasterServiceElasticsearch
- 聊聊elasticsearch的MasterFaultDetectionElasticsearch