使用Flink HA功能维护JobManager中组件的生命周期,可以有效的避免因为JobManager 进程失败导致任务无法恢复的情况。
接下来分享下 Flink HA功能的实现
大纲
- 基于Zookeeper+Hadoop HA功能的实现
- HA功能的接口概述
- 基于Zookeeper实现的HA接口
- 手工课: 添加个新的组件并使用HA功能维护生命周期
1.基于Zookeeper+Hadoop HA功能的实现
Zookeeper:
Zookeeper的结构:
-
/leaderlatch
: leaderlatch 目录下的节点用于竞选leader (相关类ZooKeeperLeaderElectionService
,LeaderContender
) -
/leader
: 通过监听leader下的节点获取到leader 信息的实时变化 (相关类ZooKeeperLeaderRetrievalService
,LeaderRetrievalListener
) -
/checkpoints
: checkpoints 目录下记录任务可用的checkpoint,最终可以获得hadoop的HA目录下的checkpoint metadata 的路径信息 (相关类ZooKeeperCompletedCheckpointStore
) -
/checkpoint-counter
:checkpoint的计数器 (相关类ZooKeeperCheckpointIDCounter
) -
/running_job_registry
: 运行中的任务及状态 (相关类ZooKeeperRunningJobsRegistry
)Flink使用 Zookeeper不光负责竞选leader和实时通知其他组件最新的leader信息,还会存放JobManager和任务的信息,保证新的JobManager起来后,这些信息不会丢失。
举例:
ResourceManager在这个节点/leaderlatch/resource_manager_lock
竞选到leader之后会在/leader/resource_manager_lock
节点更新leader的信息,监听/leader/resource_manager_lock
节点变化的其他组件会立即使用新的地址和SessionId连接ResourceManager
Hadoop :
- FLink会创建基于Hadoop的BlobServer (相关类
FileSystemBlobStore)
- 在HA路径下会保存Hadoop的checkpoint的元数据文件 (相关类
FileSystemStateStorageHelper
)
2.HA功能的接口概述
-
HighAvailabilityServices
: 可以获取所有组件的LeaderRetrievalService
和LeaderElectionService
接口及记录JobManager中需要持久化的状态,例如完成的保存点,JobGraph,BlobStore,任务调度的状态 -
LeaderElectionService
: 负责选举leader的Service接口。具体方法:
//开启选举服务,一般是在RPC的Endpoint初始化好之后,开始调用选举 void start(LeaderContender contender) throws Exception; //停止选举服务,组件的生命周期结束,停止选举 void stop() throws Exception; //组件选上leader之后的确认操作,并回写信息,比如在基于zk的HA上会向leader目录下的节点回写leader的信息 void confirmLeaderSessionID(UUID leaderSessionID); //判断这个sessiondId是否是leader boolean hasLeadership(@Nonnull UUID leaderSessionId);
-
LeaderContender
: 参与选举的接口。在Flink中需要实现HA的组件,如: ResourceManager,Dispatcher,WebMonitorEndpoint,每个Job的JobManager都会实现这个接口。 通过LeaderElectionService#start(LeaderContender)
方法开始竞选leader -
LeaderRetrievalService
: 实时接收Leader的变更信息的服务。Leader信息变更会调用LeaderRetrievalListener
的notifyLeaderAddress
方法通知新Leader的变更信息(address,sessionid) -
LeaderRetrievalListener
: 如果需要实时监听leader的信息,需要实现这个接口。通过对应组件实现的LeaderRetrievalService#start(LeaderRetrievalListener listener)
方法实时监听leader的信息
//通知有Leader的信息的变更
void notifyLeaderAddress(@Nullable String leaderAddress, @Nullable UUID leaderSessionID);
//处理监听Leader服务报错
void handleError(Exception exception);
3.基于Zookeeper实现的HA接口
ZooKeeperHaServices
ZooKeeperHaServices
(实现自步骤2的HighAvailabilityServices
),通过 ZooKeeperHaServices
可以获取每个组件的ZooKeeperLeaderElectionService
和ZooKeeperLeaderRetrievalService
@Override
public LeaderRetrievalService getAutoRescaleLeaderRetriever() {
return ZooKeeperUtils.createLeaderRetrievalService(client, configuration, RESCALE_SERVICE_LEADER_PATH);
}
@Override
public LeaderRetrievalService getResourceManagerLeaderRetriever() {
return ZooKeeperUtils.createLeaderRetrievalService(client, configuration, RESOURCE_MANAGER_LEADER_PATH);
}
@Override
public LeaderRetrievalService getDispatcherLeaderRetriever() {
return ZooKeeperUtils.createLeaderRetrievalService(client, configuration, DISPATCHER_LEADER_PATH);
}
@Override
public LeaderRetrievalService getJobManagerLeaderRetriever(JobID jobID) {
return ZooKeeperUtils.createLeaderRetrievalService(client, configuration, getPathForJobManager(jobID));
}
@Override
public LeaderRetrievalService getJobManagerLeaderRetriever(JobID jobID, String defaultJobManagerAddress) {
return getJobManagerLeaderRetriever(jobID);
}
@Override
public LeaderRetrievalService getWebMonitorLeaderRetriever() {