抽象

LeaderElectionService

这个接口用于从一组竞选者中选出一个leader,其start方法需要传递一个LeaderContender竞选者作为参数,如果有多个竞选者,则每一个竞选者都需要拥有自己的竞选服务类。

LeaderContender

需要竞选leader的候选者们需要实现本接口,即flink中所有需要进行leader选举的组件均会实现本接口。

LeaderRetrievalService

这个接口用于当leader改变的时候收到通知,并回调注册的LeaderRetrievalListener。某些组件对其他组件的leader变更敏感(比如ResourceManager的leader变更则TaskExecutor就需要重新连接到该新的RM上),这些组件就可以创建LeaderRetrievalService服务,实现其敏感组件leader变更后的业务逻辑。

LeaderRetrievalListener

当leader改时获取到新的leader地址和id,进而实现自定义的业务功能。比如:TaskExecutorresourceManagerLeaderRetriever就启动了一个ResourceManagerLeaderListener当新的ResourceManager被选举为leader时进行重新连接到新的leader。

实现

采用curator库中的LeaderLatch实现leader选举。主要涉及LeaderLatchLeaderLatchListener这两个类.LeaderLatchListener接口的两个回调方法:

  • isLeader: LeaderLatch的失去leader时会被调用
  • notLeader: LeaderLatch的获得leader时会被调用

但是这两个方法都是在LeaderLatch状态转变中被调用,都有可能在这两个方法调用前,leader又改变了回去了,这种情况下唯一可以保证的就是,你可以预期另一个对应的方法也会很快被调用。所以实现中LeaderLatchListener的方法被回调时必须再次调用LeaderLatch.hasLeadership()进行确认。

想了解更多的同学可以参考curator相关文档LeaderLatch

ZooKeeperLeaderElectionService

ZooKeeperLeaderElectionService实现了LeaderLatchListener接口当其启动的LeaderContender被选举为leader时isLeader方法会被回调,然后调用LeaderContendergrantLeadership,实现类可以在该方法中实现自己的业务逻辑(比如job的recovery)完成后再调用LeaderElectionServiceconfirmLeaderSessionID把新的leader的地址和uuid写入到相应的zk node节点,然后注册监听了该zk node节点的相关LeaderRetrievalService就会收到leader变化的通知从而进行相应的业务处理。

下图为用zookeeper实现leader选举的时序图。

相关组件

  • Dispatcher 负责任务的提交,任务持久化,创建JobManagerRunner执行任务以及当master失败时进行任务恢复
  • ResourceManager 负责资源的分配和回收
  • WebMonitorEndpoint 负责服务前端RESTful调用
  • JobManagerRunner 负责job级别的leader选举

Flink架构分析之HA的更多相关文章

  1. Flink架构分析之Standalone模式启动流程

    概述 FLIP6 对Flink架构进行了改进,引入了Dispatcher组件集成了所有任务共享的一些组件:SubmittedJobGraphStore,LibraryCacheManager等,为了保 ...

  2. Flink架构分析之资源分配

    Task Slot     Flink中每个真正执行任务的TaskManager都是一个JVM进程,其在多线程环境中执行一个或者多个子任务.为了控制一个JVM同时能运行的任务数量,flink引入了ta ...

  3. Flink架构分析之RPC详解

    主要抽象 Flink RPC 框架主要抽象了RpcService,RpcEndpoint,RpcGateway,RpcServer这几个接口,具体实现可以采用多种方式,比如:akka,netty Rp ...

  4. flink架构介绍

    前言 flink作为基于流的大数据计算引擎,可以说在大数据领域的红人,下面对flink-1.7的架构进行逻辑上的分析并和spark做了一些关键点的对比. 架构 如图1,flink架构分为3个部分,cl ...

  5. Flink架构,源码及debug

    序 工作中用Flink做批量和流式处理有段时间了,感觉只看Flink文档是对Flink ProgramRuntime的细节描述不是很多, 程序员还是看代码最简单和有效.所以想写点东西,记录一下,如果能 ...

  6. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  7. 主流图数据库Neo4J、ArangoDB、OrientDB综合对比:架构分析

    主流图数据库Neo4J.ArangoDB.OrientDB综合对比:架构分析 YOTOY 关注 0.4 2017.06.15 15:11* 字数 3733 阅读 16430评论 2喜欢 18 1: 本 ...

  8. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

  9. Flickr 网站架构分析

    Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...

随机推荐

  1. struts2中的文件上传和下载

    天下大事,必做于细.天下难事,必作于易. 以前见过某些人,基础的知识还不扎实就去学习更难的事,这样必定在学习新的知识会非常迷惑结果 再回来又一次学习一下没有搞懂的知识,这必定会导致学习效率的下降!我写 ...

  2. 基于jquery分页插件

    今天终于完成了基于jquery的分页插件的代码编写,也通过了功能测试,实现了分页功能:由于刚开始写jquery的插件,所以梳理逻辑的时间也很长,整个过程整整一周时间,今天终于搞完了,先将整个分页插件的 ...

  3. 【转】Android 旋转动画,停止和持续旋转

    旋转180度后停止 RotateAnimation rotate; rotate =new RotateAnimation(0f,180f,Animation.RELATIVE_TO_SELF, 0. ...

  4. centos中安装、升级git

    yum install git 若是从老版本升级,则按下面方法.(centos中) 先更新系统sudo yum update     安装依赖的包yum install curl-devel expa ...

  5. Python3的动态加载模块简单实例

    import os import sys import time import myconfig b = ['123'] a = os.path.abspath(myconfig.__file__) ...

  6. [转]C#调用C++类(以COM组件的形式)

    如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组 ...

  7. 51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)

    1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线 ...

  8. 轻量级IOC容器:Ninject

    Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...

  9. SM30 客户端 有“不可修改”的状态

    SM30维护自定义数据表时,遇到提示信息,有“不可修改”的状态,无法修改数据. 查询详细信息,有一条:客户端特定对象不能在此客户端中进行更改. 检查了一下自定表设置,发现自定义表之前创建时,Deliv ...

  10. html移动应用 input 标签 清除按钮功能如何实现(不触发键盘)

    有个需求是:输入框有文本的时候就显示清除按钮,没有文本则隐藏清除按钮,点击清除按钮不能影响键盘弹出的状态. 网上有css实现自动显示和隐藏清除按钮的方案,但是考虑到兼容性,我们还是使用js来实现. c ...