Bootstrap

深度了解flink(八) JobManager(2)initializeServices剖析

前言

上篇文章梳理了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 的相关信息,支持监控和调试。

;