flink zookeeper HA 实现分析

本文深入分析了Flink如何借助Zookeeper实现高可用(HA),包括ResourceManager、Dispatcher、JobManager、WebServer组件的HA,以及checkpoint元数据的持久化。重点介绍了ZooKeeperHaServices在创建LeaderRetrievalService和LeaderElectionService中的作用,以及它们如何处理leader选举和状态跟踪。通过NodeCache和LeaderLatch实现Zookeeper的节点监听和选举,确保集群在leader变更时的平滑过渡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zookeeper HA相关配置

 

## 使用zk做HA
high-availability: zookeeper
## zk地址
high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
## flink在zk下的工作路径
high-availability.zookeeper.path.root: /flink
## 任务所在的HA路径
high-availability.cluster-id: /default
## 保存元数据到文件系统
high-availability.storageDir: hdfs:///flink/recovery

## --任务运行在YARN上的配置--
## applicationMaster重试的次数,默认为1,当application master失败的时候,该任务不会重启。
## 设置一个比较大的值的话,yarn会尝试重启applicationMaster。
yarn.application-attempts: 10
## flink是否应该重新分配失败的taskmanager容器。默认是true。
yarn.reallocate-failed:true
## applicationMaster可以接受的容器最大失败次数,达到这个参数,就会认为yarn job失败。
## 默认这个次数和初始化请求的taskmanager数量相等(-n 参数指定的)。
yarn.maximum-failed-containers:1


flink使用Zookeeper做HA

flink的ResourceManager、Dispatcher、JobManager、WebServer组件都需要高可用保证,同时flink高可用还需要持久化checkpoint的元数据信息,保留最近一次已经完成的checkpoint等工作,其中最重要的就是组件的leader选举、leader状态跟踪。本次抽取出Flink使用zk实现leader选举、leader状态跟踪代码,学习下flink是如何使用curator的。类之间的关系如下:

 

ZooKeeperHaServices是HighAvailabilityServices基于zookeeper的实现,通过使用ZooKeeperUtils类来创建组件的LeaderRetrievalService以及LeaderElectionService。

LeaderRetrievalService用来跟踪leader的变化,当发现leader地址变化时,要通知依赖它的组件去依赖新的leader。比如getResourceManagerLeaderRetriever方法,flink会监听zk的/leader/resource_manager_lock节点内容变化,内容是rm的leader地址和leaderUUID,而taskmanger调用该服务的start方法传递了一个LeaderRetrievalListener。如果节点内容发生变化,意味着rm的leader地址发生变化,那么的LeaderRetrievalListener的notifyLeaderAddress就会通知taskmanger去新的ResourceManager地址进行注册。zk实现该功能使用的是curator的NodeCache并重写了nodeChanged方法。

LeaderElectionService用来进行leader选举工作,当节点成为leader后会调用LeaderContender的grantLeadership方法。以ResourceManagerLeaderElection为例,flink会在zk的/leaderlatch/resource_manager_lock路径下创建临时节点,创建成功的rm节点成为leader触发rm的grantLeadership,最终将当前地址和UUID写入/leader/resource_manager_lock中,这样就触发了LeaderRetrievalService服务。zk实现leader选举使用的是curator的LeaderLatch并重写了isLeader和notLeader方法。同时使用NodeCache监听/leader/resource_manager_lock内容变化,确保新leader地址和UUID成功写入节点。

LeaderRetrievalListener对LeaderRetrievalService的leader地址变化做出响应,通过notifyLeaderAddress传递新leader地址。

LeaderContender对LeaderElectionService的节点角色发生变化做出响应,通过grantLeadership和revokeLeadership进行leader的授权和撤销工作。

一个集群目录下的zk结构如下图所示:

 

zk文件系统目录

flink相关源码

简单的走一下流程,看看集群启动时是如何创建ZooKeeperHaServices的。

集群启动入口ClusterEntrypoint

  • 根据集群的部署模式session or perjob由对应的子类调用ClusterEntrypoint的startCluster方法启动集群,接着会先调用initializeServices方法,启动集群相关的组件信息。这里只看启动haServices部分。

 

public void startCluster() throws ClusterEntrypointException {

  SecurityContext securityContext = installSecurityContext(configuration);
  securityContext.runSecured((Callable<Void>) () -> {
        runCluster(configuration);
         return null;
  });
}

protected void initializeServices(Configuration configuration) {

    ioExecutor = Executors.newFixedThreadPool(
        Hardware.getNumberCPUCores(),
        new ExecutorThreadFactory("cluster-io"));
        
    haServices = createHaServices(configuration, ioExecutor);
    
    blobServer = new BlobServer(configuration, haServices.createBlobStore
### Flink 本地模式、Standalone 模式以及 Standalone HA 搭建指南 #### 一、Flink 本地模式搭建 **简介**: Flink 的本地模式允许你在单台机器上运行 Flink 程序,适用于开发和测试环境。它不需要集群配置,直接在 JVM 中启动。 **步骤**: 1. **安装 Java 和 Maven**:确保已安装 JDK,并设置好 `JAVA_HOME` 环境变量。 2. **下载并解压 Flink**:从 [官方下载页面](https://flink.apache.org/downloads.html) 下载最新版本的二进制包,并将其解压缩到指定目录。 3. **修改配置文件 (可选)**:如果你需要调整默认配置,可以编辑 `${FLINK_HOME}/conf/flink-conf.yaml` 文件。 4. **启动本地会话**: - 进入 Flink 目录,在命令行中输入 `./bin/start-cluster.sh` 启动本地集群。 5. **验证安装成功**:访问 Web UI (`http://localhost:8081`) 查看集群状态,默认端口为 8081。 #### 二、Flink Standalone 模式搭建 **简介**: Flink 提供了独立部署的方式,即无需依赖 YARN 或 Kubernetes 等资源管理框架即可单独构建分布式计算平台。此方式适合小型生产场景下的快速部署。 **步骤**: 1. **准备多台服务器节点**, 配置免密 SSH 登录以便于后续操作自动化; 2. **分发软件包及配置同步**: 将之前下载好的 flink 安装包复制到所有目标主机相应位置;同时保持各个节点间的时间一致性(通过 NTP 实现),并将公共部分如 `masters`, `slaves` 列表信息写入每台 server 上相同的路径下; 3. **编辑主配置文件**`${FLINK_HOME}/conf/flink-conf.yaml` - 设置 jobmanager.rpc.address 属性为你选定作为 master 节点 IP 地址; - 根据实际硬件条件适当调整 taskManager.numberOfTaskSlots 参数值等其他必要项. 4. **初始化 ZooKeeper**(如果需要高可用特性的话),并在 zk 中创建根 namespace `/flink`; 5. **分别依次启动各组件** - Master Node 执行 ./bin/jobmanager.sh start cluster ; - Slave Nodes 分别执行 ./bin/taskmanager.sh start ; 6. 测试整个架构是否正常工作. #### 三、Flink Standalone High Availability(HA) 模式搭建 为了保证系统的稳定性和容错能力,Flink 支持基于第三方存储系统(ZooKeeper/Consul/Etcd...)实现 JobManager failover 及 metadata persistence 功能, 其中 zookeeper 方案最为常用. ##### 基本原理: 当启用HA功能后,Flink会将JobGraph保存至Zookeeper中形成快照;一旦当前活跃JM发生故障,则新的JM可以从zk拉取数据恢复作业继续执行而不会丢失进度。 ##### 主要更改点包括但不限于以下几个方面 : - 更新 ${FLINK_HOME}/conf/flink-conf.yaml 添加下面几条记录开启ha支持并指明类型(zk): ```yaml high-availability: zookeeper high-availability.zookeeper.quorum=localhost:2181 #替换为真实地址串 ``` - 如果采用外部托管形式则还需额外指定 leader-election-service & checkpoint-storage path 对应key-value对儿; 最后参照standalone流程完成其余环节直至服务上线前的各项检查确认无误方可投入使用. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值