Flink可以使用zookeeper来进行ha,而一般我们都会使用zookeeper的高级api架构curator来对zk进行通讯。在curator中引入了状态的概念,包括connected,reconnected,suspeneded,lost与read_only,其中suspended是个有意思的状态,当因为网络抖动、机器繁忙、zk集群短暂无响应,都会导致curator将状态置为suspended.

而Flink对suspended采取了非常谨慎的处理,就是发现是suspended,则取消所有作业,进行restart,显得未免有些太敏感了,其实这个时候往往zk也是ok的,相应的jm也是leader都没有问题。

好,我们再顺一下:

在发生zk connection loss的情况下,curator会设置suspended状态,在此状态下,curator会释放leader,flink在发现notleader之后则会revokeLeadership,进而导致dispatcher会cancel掉所有的job,cancel的过程中flink会主动抛出异常。

虽然这样做没什么大的影响,因为其实如果connection很快恢复,作业也会很快被拉起,没有大碍,但看起来总是不好,zk连接随便的一个扰动,都可能导致job重启,所以就想把它改动。

方案一:

在flink的ZooKeeperUtils.java通过CuratorFrameworkFactory来构造CuratorFramework时,通过connectionStateErrorPolicy将ConnectionStateErrorPolicy从StandardConnectionStateErrorPolicy更新为SessionConnectionStateErrorPolicy,前者将suspended和lost都作为error,后者只是将lost作为error,而只有发生error的时候才会取消leadership,所以如此设置之后,在进入suspended状态时,不在发生leadership的取消和重新选举。

优点:从整体的状态转换上进行了控制,优雅。

缺点:目前flink所引用的curator的版本为2.12.0,不支持设置policy,需要更新curator版本号,是否会带来其他问题,不可知。

测试:成功。

更改curator的版本为4.2.0,提交作业,restart zk,job没有重启,checkpoint正常进行。

方案二:

在flink内部,在代码ZooKeeperLeaderElectionService.java中的notLeader方法中,在收到notleader的通知的时候,根据当前的状态是否是suspended进行相应的处理。

优点:不对flink的整体造成影响,更改在局部范围内可控。

缺点:由于curator对suspended的处理依旧,所以从curator的层面还是会发生取消leadership然后重新进行选举的情况,虽然这一切都不必要。

测试:失败

1.原先预计的是在notleader方法中,如果发现当前状态是suspended,就不去执行revokeLeadership方法,但notleader方法和suspended状态的获取分别是在两个回调方法中触发的,经过测试,无法保证两个回调的执行顺序,即有可能notleader方法已经触发,但是suspended状态还没有触发。

2.如果只是修改notleader方法,即使修改成功,还是会触发isleader方法,在isleader方法中,如果不修改,还是会触发原有作业的取消和重新提交,所以这里也要改,改成重新链接之后这里即使被通知isleader也不会去给dispatcher进行grantLeadership,但又不能直接这么操作,还需要判断是否自己已经是leader,但可惜的是,在发生suspended的时候,curator里面已经将leadership取消掉了,所以如果在这里加上判断是connected状态并且不是leader然后不去grantleadership,会看起来很奇怪。

总而言之,如果不动curator的逻辑,只是在flink里改,这里的逻辑就会被改的难以理解,并且还无法成功。

目前的方案应对的场景是zk connection的短时间抖动,如果发生zk connection的长时间不可用,则tm和jm都会失败,这个也是应有之义。

另,

在flink中对curator的suspended状态起作用的还有一个地方,在ZooKeeperCheckpointIDCounter.java中有对suspended的判断,如果之前是suspended或者Lost,则flink就不会去zk上存取checkpoint的信息了。这里感觉是个坑,也需要改对suspended的策略。

外一篇,

zookeeper可以设置session timeout时间,但是不是你随便设置就会起作用,会有一个判断的过程。

SessionTimeOut的协商如下:

  • 情况1: 配置文件配置了maxSessionTimeOut和minSessionTimeOut

最终SessionTimeOut,必须在minSessionTimeOut和maxSessionTimeOut区间里,如果跨越上下界,则以跨越的上届或下界为准。

  • 情况2:配置文件没有配置maxSessionTimeOut和minSessionTimeOut

maxSessionTimeout没配置则 maxSessionTimeOut设置为 20 * tickTime

minSessionTimeOut没配置则 minSessionTimeOut设置为 2 * tickTime

也就是默认情况下, SessionTimeOut的合法范围为 4秒~40秒,默认配置中tickTime为2秒。

Zookeeper connection loss leads to Flink job restart的更多相关文章

  1. WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn) java.net.ConnectException: Connection refused

    1.启动kafka的脚本程序报如下所示的错误: [hadoop@slaver1 script_hadoop]$ kafka-start.sh start kafkaServer... [-- ::,] ...

  2. zookeeper集群+kafka集群 部署

    zookeeper集群 +kafka 集群部署 1.Zookeeper 概述: Zookeeper 定义 zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目 Zooke ...

  3. Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构

    Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 目录 Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 一.Zookeeper 1. Zook ...

  4. 基于ZooKeeper的分布式锁和队列

    在分布式系统中,往往需要一些分布式同步原语来做一些协同工作,上一篇文章介绍了Zookeeper的基本原理,本文介绍下基于Zookeeper的Lock和Queue的实现,主要代码都来自Zookeeper ...

  5. Flink Internals

    https://cwiki.apache.org/confluence/display/FLINK/Flink+Internals   Memory Management (Batch API) In ...

  6. zookeeper kazoo Basic Usage

    http://kazoo.readthedocs.org/en/latest/basic_usage.html Basic Usage Connection Handling To begin usi ...

  7. zookeeper 学习笔记 (C语言版本)

    1.zookeeper简介 zookeeper是Hadoop的子项目,在大型分布式系统中,zookeeper封装好了一些复杂易出错的服务,提供简单易用的接口,给使用者提供高效稳定的服务.这些服务包括配 ...

  8. zookeeper curator处理会话过期session expired

    本文介绍在使用curator框架的时候如何handle session expire. 1.什么是zookeeper的会话过期? 一般来说,我们使用zookeeper是集群形式,如下图,client和 ...

  9. HyperLedger Fabric基于zookeeper和kafka集群配置解析

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)--Fabric多节点集群 ...

随机推荐

  1. 基于vue+springboot+docker网站搭建【一】 前言

      前言 开一个系列记录下一次从0开始搭建一个网站的过程.前后端项目都是在github找的开源项目,主要用于练习部署. 前端:vue.js 后端: spring-boot 搭建环境:centOS7.6 ...

  2. DevExpress的下拉框控件LookUpEdit的使用、添加item选项值、修改默认显示值

    场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  3. js 实现watch监听数据变化

    1.js /** * @desc 属性改变监听,属性被set时出发watch的方法,类似vue的watch * @author Jason * @study https://www.jianshu.c ...

  4. 基于KVM的虚拟机创建

    KVM基本介绍:   KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中,KVM目前 ...

  5. Nginx 反向代理功能-实现Nginx tcp负载均衡

    Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. pycharm与github的使用

    1.clone代码: 输入github的存储库地址,输入本地存储目录,点击clone即可: 2.上传代码: 输入存储库名字,点击share即可:github上就会有你分享的代码啦

  7. docker学习11-上传本地镜像到镜像仓库

    前言 在本地自己制作用过镜像后,上传到镜像仓库,这样方便在不同的机器上快速搭建同一套环境. 如果公开的话,别人也可以用你的镜像快速搭建环境,类似于 GitHub 本地代码上传到代码仓库,再从仓库拉取代 ...

  8. 把antd的组件源码搬到Ant Design Pro中使用

    把组件源码搬过来后,样式死活不生效,经过1天的努力,有说less-loader的,有说webpack配置,还有说babel配置的,最后,我自己找到了方法 就是在global.less中使用@impor ...

  9. classmethode,staticmethode、反射

    目录 classmethod: staticmethod: classmethod与staticmethod都是python解释器内置的装饰器 类中定义的函数分为两大类:绑定方法和非绑定方法 在类中正 ...

  10. three.js 添加环境光

    var ambient = new THREE.AmbientLight(0xffffff);//环境光 scene.add(ambient);