前言
上篇文章梳理了Flink 集群的模式以及通过源码分析了JobManager的启动流程,这篇文章更加细粒度的分析JobManger启动流程初始的服务。
initializeServices剖析
initializeServices的代码如下:
protected void initializeServices(Configuration configuration, PluginManager pluginManager)
throws Exception {
LOG.info("Initializing cluster services.");
synchronized (lock) {
resourceId =
configuration
.getOptional(JobManagerOptions.JOB_MANAGER_RESOURCE_ID)
.map(
value ->
DeterminismEnvelope.deterministicValue(
new ResourceID(value)))
.orElseGet(
() ->
DeterminismEnvelope.nondeterministicValue(
ResourceID.generate()));
LOG.debug(
"Initialize cluster entrypoint {} with resource id {}.",
getClass().getSimpleName(),
resourceId);
//创建工作目录
workingDirectory =
ClusterEntrypointUtils.createJobManagerWorkingDirectory(
configuration, resourceId);
LOG.info("Using working directory: {}.", workingDirectory);
//创建rpcSystem
rpcSystem = RpcSystem.load(configuration);
//创建RpcService
commonRpcService =
RpcUtils.createRemoteRpcService(
rpcSystem,
configuration,
configuration.get(JobManagerOptions.ADDRESS),
getRPCPortRange(configuration),
configuration.get(JobManagerOptions.BIND_HOST),
configuration.getOptional(JobManagerOptions.RPC_BIND_PORT));
//根据配置实例化JMX,默认关闭。通过JMX收集Flink的监控信息
JMXService.startInstance(configuration.get(JMXServerOptions.JMX_SERVER_PORT));
// update the configuration used to create the high availability services
configuration.set(JobManagerOptions.ADDRESS, commonRpcService.getAddress());
configuration.set(JobManagerOptions.PORT, commonRpcService.getPort());
//创建了一个固定大小的线程池,也可以理解为执行器
ioExecutor =
Executors.newFixedThreadPool(
ClusterEntrypointUtils.getPoolSize(configuration),
new ExecutorThreadFactory("cluster-io"));
//创建一个Flink中的令牌管理器,主要用到需要认证的时候,进行一次认证,以后都不在认证
delegationTokenManager =
DefaultDelegationTokenManagerFactory.create(
configuration,
pluginManager,
commonRpcService.getScheduledExecutor(),
ioExecutor);
// Obtaining delegation tokens and propagating them to the local JVM receivers in a
// one-time fashion is required because BlobServer may connect to external file systems
delegationTokenManager.obtainDelegationTokens();
//根据配置创建高可用服务
haServices = createHaServices(configuration, ioExecutor, rpcSystem);
//创建blob server
blobServer =
BlobUtils.createBlobServer(
configuration,
Reference.borrowed(workingDirectory.unwrap().getBlobStorageDirectory()),
haServices.createBlobStore());
//启动blob server
blobServer.start();
configuration.set(BlobServerOptions.PORT, String.valueOf(blobServer.getPort()));
//创建心跳服务
heartbeatServices = createHeartbeatServices(configuration);
//故障增强器初始化
failureEnrichers = FailureEnricherUtils.getFailureEnrichers(configuration);
//监控指标相关服务
metricRegistry = createMetricRegistry(configuration, pluginManager, rpcSystem);
//指标监控查询服务
final RpcService metricQueryServiceRpcService =
MetricUtils.startRemoteMetricsRpcService(
configuration,
commonRpcService.getAddress(),
configuration.get(JobManagerOptions.BIND_HOST),
rpcSystem);
metricRegistry.startQueryService(metricQueryServiceRpcService, null);
final String hostname = RpcUtils.getHostname(commonRpcService);
//组织管理指标
processMetricGroup =
MetricUtils.instantiateProcessMetricGroup(
metricRegistry,
hostname,
ConfigurationUtils.getSystemResourceMetricsProbingInterval(
configuration));
//创建ExecutionGraph的存储
executionGraphInfoStore =
createSerializableExecutionGraphStore(
configuration, commonRpcService.getScheduledExecutor());
}
}
该方法是线程安全的,同步代码块内对服务进行初始化
核心服务
workingDirectory
workingDirectory 主要用于存储与 JobManager 相关的临时文件和数据
主要功能
存储临时文件:workingDirectory 用于存储 JobManager 在运行过程中生成的临时文件,例如日志文件、检查点数据、配置文件等。
数据持久化:在某些情况下,workingDirectory 也可以用于存储一些需要持久化的数据,例如 BlobServer 存储的文件。
使用场景
日志文件:JobManager 的日志文件可以存储在 workingDirectory 中,便于调试和问题排查。
检查点数据:在启用检查点的情况下,检查点数据可以暂时存储在 workingDirectory 中,然后再持久化到其他存储系统。
配置文件:一些动态生成的配置文件可以存储在 workingDirectory 中,供 JobManager 使用。
BlobServer 存储:BlobServer 会使用 workingDirectory 中的一个子目录来存储上传的二进制文件。
rpcSystem/rpcService
Flink Rpc核心组件,rpcSystem用于管理Actor的生命周期和通信,rpcService用于创建RpcServer以及管理其他组件的代理地址
主要功能
节点间通信:rpcSystem 提供了一种机制,使得 Flink 集群中的不同节点(如 JobManager 和 TaskManager)能够相互通信,执行远程方法调用。
消息传递:负责在节点之间传递消息,包括任务分配、状态更新、心跳检测等。
高可用性:支持高可用性配置,确保在某个节点故障时,通信不会中断。
使用场景
任务调度:JobManager 通过 rpcSystem 向 TaskManager 分配任务。
状态报告:TaskManager 通过 rpcSystem 向 JobManager 报告任务的执行状态。
心跳检测:JobManager 和 TaskManager 通过 rpcSystem 进行心跳检测,确保节点的健康状态。
故障恢复:在节点故障时,通过 rpcSystem 进行故障检测和恢复操作。JobManager 通过 rpcSystem 向 TaskManager 分配任务。
delegationTokenManager
delegationTokenManager 是 Flink 中用于管理委托令牌(Delegation Token)的组件。委托令牌是一种安全机制,用于在分布式系统中进行身份验证和授权。在 Flink 中,delegationTokenManager 负责生成、分发和管理这些令牌,以确保任务在不同节点之间安全地执行。
主要功能
生成委托令牌:根据配置和安全策略生成委托令牌。
分发委托令牌:将生成的委托令牌分发给需要的组件,如 TaskManager。
刷新委托令牌:定期刷新委托令牌,确保其有效性和安全性。
撤销委托令牌:在必要时撤销委托令牌,防止未授权访问。
过期处理:处理过期的委托令牌,确保系统安全。
使用场景
安全认证:在 Flink 集群中,使用委托令牌进行安全认证,确保只有授权的用户和组件可以访问资源。
任务执行:在任务执行过程中,TaskManager 使用委托令牌与外部系统(如 HDFS)进行安全通信。
数据访问:在访问敏感数据时,使用委托令牌进行身份验证和授权。
haServices
haServices 是 Flink 中用于实现高可用性(High Availability, HA)的服务组件。它负责管理 Flink 集群的高可用性特性,确保在主节点(如 JobManager)发生故障时,集群能够自动恢复并继续正常运行。
主要功能
主节点选举:通过 ZooKeeper 或其他高可用性服务实现主节点的选举。
状态存储:将 Flink 集群的状态信息存储在高可用性存储中,如 ZooKeeper 或 RocksDB。
故障检测:定期检测主节点的健康状态,如果主节点故障,则触发故障恢复流程。
故障恢复:在主节点故障时,自动选举新的主节点,并恢复集群的正常运行。
使用场景
主节点故障:当主 JobManager 发生故障时,haServices 会自动选举新的主节点,确保集群继续运行。
状态持久化:在主节点切换时,haServices 确保作业状态和检查点数据不会丢失。
集群管理:管理 Flink 集群的高可用性特性,确保集群的稳定性和可靠性。
blobServer
blobServer 是 Flink 中用于管理大对象(BLOB,Binary Large Object)的组件。它负责存储和分发 Flink 作业中使用的大型二进制数据,如 JAR 文件、配置文件和其他资源文件。通过 blobServer,Flink 可以确保这些资源在集群中的各个节点之间高效、可靠地分发。
主要功能
上传大对象:将大对象上传到 blobServer,并生成一个唯一的标识符(BlobKey)。
下载大对象:根据 BlobKey 下载大对象,确保所有节点都能访问这些资源。
删除大对象:在不再需要时,删除大对象,释放存储空间。
资源缓存:缓存频繁访问的大对象,提高访问效率。
使用场景
JAR 文件分发:在提交 Flink 作业时,将 JAR 文件上传到 blobServer,并在各个 TaskManager 上下载这些 JAR 文件。
配置文件分发:将配置文件上传到 blobServer,确保所有节点都能访问这些配置文件。
资源管理:管理作业中使用的其他大型二进制数据,如模型文件、数据集等。
heartbeatServices
heartbeatServices 是 Flink 中用于实现心跳检测和管理的组件。它负责监控 Flink 集群中各个节点的健康状态,确保节点之间的通信正常,并在节点故障时及时发现和处理。通过 heartbeatServices,Flink 可以实现高可用性和故障恢复。
主要功能
发送心跳:定期向目标节点发送心跳消息,确认节点的健康状态。
接收心跳:接收来自其他节点的心跳消息,更新节点的健康状态。
故障检测:在心跳超时时,检测节点是否故障,并触发相应的故障处理机制。
状态同步:同步节点之间的状态信息,确保集群的一致性。
使用场景
节点健康监测:定期检测 JobManager 和 TaskManager 的健康状态,确保集群的正常运行。
故障恢复:在节点故障时,及时发现并触发故障恢复机制,确保作业的连续性和一致性。
状态同步:同步各个节点的状态信息,确保集群的一致性和协调性。
failureEnrichers
跟踪JobMaster故障信息 组件FailureEnricher 允许用户自定义逻辑 以分类故障、暴露自定义指标或调用外部通知系统。这对于监控调试和优化Flink作业至关重要
metricRegistry
跟踪所有已注册的 Metrics 用来作为 MetricGroups MetricReporter 之间的连接。
主要功能
注册度量:将度量指标注册到 metricRegistry,使其可以被收集和报告。
收集度量:定期收集度量数据,确保数据的实时性和准确性。
报告度量:将度量数据报告给外部系统,支持实时监控和历史数据分析。
度量查询:提供查询接口,允许用户查询特定的度量数据。
使用场景
性能监控:监控 Flink 作业和任务的性能指标,如 CPU 使用率、内存使用情况、网络带宽等。
故障诊断:通过度量数据,帮助开发者诊断和解决性能问题。
优化分析:基于度量数据,进行性能优化和资源调度。
processMetricGroup
是一个用于组织和管理指标的类,包含添加度量和组的关键功能。
executionGraphInfoStore
ExecutionGraphInfoStore 是 Flink 中用于存储和管理 ExecutionGraph 信息的组件。ExecutionGraph 是 Flink 作业的内部表示,包含了作业的所有任务及其依赖关系。ExecutionGraphInfoStore 负责持久化这些信息,以便在需要时进行查询和恢复。通过 ExecutionGraphInfoStore,Flink 可以实现作业状态的持久化和恢复,支持高可用性和故障恢复。
主要功能
存储 ExecutionGraph 信息:将 ExecutionGraph 的信息持久化到存储中。
查询 ExecutionGraph 信息:提供查询接口,允许用户获取 ExecutionGraph 的相关信息。
恢复 ExecutionGraph:在作业失败时,从存储中恢复 ExecutionGraph,支持故障恢复和高可用性
使用场景
作业状态持久化:将 ExecutionGraph 的信息持久化到存储中,确保作业状态的持久化。
故障恢复:在作业失败时,从存储中恢复 ExecutionGraph,支持故障恢复和高可用性。
状态查询:提供查询接口,允许用户获取 ExecutionGraph 的相关信息,支持监控和调试。