standalone 模式的高可用

部署

flink 使用zookeeper协调多个运行的jobmanager,所以要启用flink HA 你需要把高可用模式设置成zookeeper,配置zookeeper相关参数,并且在masters配置文件中配置所有的jobmanager主机地址和web UI 端口

在一下例子中,我们配置node1,node2,node3三个jobmanager

  1. 编辑conf/masters

    node1:8081
    node2:8081
    node3:8081
  2. 编辑conf/flink-conf.yaml

    high-availability: zookeeper
    high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
    high-availability.zookeeper.path.root: /flink
    high-availability.cluster-id: /cluster_one high-availability.storageDir: hdfs:///flink/recovery
  3. 启动集群

    bin/start-cluster.sh

yarn 模式的高可用

yarn 模式中不会同时运行多个jobmanager(ApplicationMaster) instances,而是只运行一个,如果ApplicationMaster异常会依靠Yarn机制进行重启.

部署

  1. 编辑yarn-site.xml添加如下配置

    <property>
    <name>yarn.resourcemanager.am.max-attempts</name>
    <value>4</value>
    <description>
    The maximum number of application master execution attempts.
    </description>
    </property>

    设置application master 最大重启次数

  2. 编辑conf/flink-conf.yaml

    high-availability: zookeeper
    high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
    high-availability.storageDir: hdfs:///flink/recovery
    high-availability.zookeeper.path.root: /flink
    yarn.application-attempts: 10

    配置HA模式为zookeeper,并设置应用的最大重启次数

  3. 启动一个yarn session

    bin/yarn-session.sh -n 2

原理

采用curator库中的LeaderLatch实现leader选举。不了解的同学可以移步curator相关文档LeaderLatch

在zookeeper中生成的主要目录结构如下图:

涉及到的主要类:

  • 选举:

    首先我们看一下JobManager的构造函数:

    注意它的构造函数需要LeaderElectionService对象作为参数以及它本身实现了LeaderContender接口。那么LeaderElectionService是怎么创建的?其实就是根据high-availability: zookeeper此配置项,由HighAvailabilityServicesUtils工具类的createAvailableOrEmbeddedServices方法创建HighAvailabilityServices对象然后通过其getJobManagerLeaderElectionService方法创建:

    public static HighAvailabilityServices createAvailableOrEmbeddedServices(
    Configuration config,
    Executor executor) throws Exception {
    HighAvailabilityMode highAvailabilityMode = LeaderRetrievalUtils.getRecoveryMode(config); switch (highAvailabilityMode) {
    case NONE:
    return new EmbeddedHaServices(executor); case ZOOKEEPER:
    BlobStoreService blobStoreService = BlobUtils.createBlobStoreFromConfig(config); return new ZooKeeperHaServices(
    ZooKeeperUtils.startCuratorFramework(config),
    executor,
    config,
    blobStoreService); default:
    throw new Exception("High availability mode " + highAvailabilityMode + " is not supported.");
    }
    }

```java
public static ZooKeeperLeaderElectionService createLeaderElectionService(
final CuratorFramework client,
final Configuration configuration,
final String pathSuffix)
{
final String latchPath = configuration.getString(
HighAvailabilityOptions.HA_ZOOKEEPER_LATCH_PATH) + pathSuffix;
final String leaderPath = configuration.getString(
HighAvailabilityOptions.HA_ZOOKEEPER_LEADER_PATH) + pathSuffix; return new ZooKeeperLeaderElectionService(client, latchPath, leaderPath);
}
我们再了解一下`ZooKeeperLeaderElectionService`
![](https://img2018.cnblogs.com/blog/413838/201810/413838-20181008220134231-1838364581.png) 以及`LeaderContender`
![](https://img2018.cnblogs.com/blog/413838/201810/413838-20181008220233351-1437582454.png) `ZooKeeperLeaderElectionService`类主要管理`namespace`下的两个路径,即`latchPath`(/leaderlatch)和`leaderPath(/leader)`,`latchPath`用来进行leader选举,`leaderPath`存储选举出的leader的地址和UUID。 `LeaderContender`类用于当leader发生改变时,收到相应的通知以进行相关业务处理。比如:自己变成leader时,进行job恢复;当自己被撤销leader时,断开注册的TaskManager。 在`JobManager`的`preStart`方法中会调用`ZooKeeperLeaderElectionService`的`start`方法注册`LeaderLatch`(/leaderlatch)和`NodeCache`(/leader)的监听器。如果某个`LeaderLatch`被选为leader,则对应的`ZooKeeperLeaderElectionService`对象的`isLeader`方法会被回调,从而调用`LeaderContender->grantLeadership()`通知被选中的竞选者(此处为JobManager),然后`JobManager`会调用`LeaderElectionService->confirmLeaderSessionID()`把被选中的leader的相关信息写入到`/leader`目录下,并异步进行job恢复工作。

NodeCache(/leader)的监听器监听写入数据的变化,并具备纠错功能。

```java
public void isLeader() {
synchronized (lock) {
if (running) {
issuedLeaderSessionID = UUID.randomUUID();
confirmedLeaderSessionID = null; if (LOG.isDebugEnabled()) {
LOG.debug(
"Grant leadership to contender {} with session ID {}.",
leaderContender.getAddress(),
issuedLeaderSessionID);
} leaderContender.grantLeadership(issuedLeaderSessionID);
} else {
LOG.debug("Ignoring the grant leadership notification since the service has " +
"already been stopped.");
}
}
}

leader重新选举后需要恢复提交的Job以及恢复相应job的checkpoint。 这就涉及到`JobManager`构造函数图示中圈红的`SubmittedJobGraphStore`和`CheckpointRecoveryFactory`这两个类,我们后边专门进行详细讲解。 * 查询:
![](https://img2018.cnblogs.com/blog/413838/201810/413838-20181008220442621-548390073.png) `ZooKeeperLeaderRetrievalService`通过监听`/flink/{cluster_id}/leader/{default_jobid}/job_manager_lock`目录的变化,读取该目录下的数据然后通过`LeaderRetrievalListener`的`notifyLeaderAddress`方法通知实现该接口的对象。比如更新`FlinkMiniCluster`的`leaderGateway`

Flink HA的更多相关文章

  1. Flink HA 搭建坑

    目前网上能找到的做HA的教程基本都无法真正做到多机高可用,包括官方文档,经过很久的折腾,终于做到了多机高可用,希望其它人不再被坑. 集群模式安装 前提条件: 机器已经安装好Java环境 jobMana ...

  2. Flink源码学习笔记(3)了解Flink HA功能的实现

    使用Flink HA功能维护JobManager中组件的生命周期,可以有效的避免因为JobManager 进程失败导致任务无法恢复的情况. 接下来分享下 Flink HA功能的实现 大纲 基于Zook ...

  3. flink ha zk集群迁移实践

    flink为了保证线上作业的可用性,提供了ha机制,如果发现线上作业失败,则通过ha中存储的信息来实现作业的重新拉起. 我们在flink的线上环境使用了zk为flink的ha提供服务,但在初期,由于资 ...

  4. Flink JobManager HA模式部署(基于Standalone)

    参考文章:https://ci.apache.org/projects/flink/flink-docs-release-1.3/setup/jobmanager_high_availability. ...

  5. flink的集群的HA高可用

    对于一个企业级的应用,稳定性是首要要考虑的问题,然后才是性能,因此 HA 机制是必不可少的: 和 Hadoop 一代一样,从架构中我们可以很明显的发现 JobManager 有明显的单点问题(SPOF ...

  6. 搭建高可用的flink JobManager HA

    JobManager协调每个flink应用的部署,它负责执行定时任务和资源管理. 每一个Flink集群都有一个jobManager, 如果jobManager出现问题之后,将不能提交新的任务和运行新任 ...

  7. Flink on yarn以及实现jobManager 高可用(HA)

    on yarn https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/deployment/yarn_setup.html f ...

  8. Flink源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483692&idx=1&sn=18cddc1ee ...

  9. Flink的高可用集群环境

    Flink的高可用集群环境 Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能. 因现在主要Flink这一块做先关方面的学习, ...

随机推荐

  1. python第十四课--排序及自定义函数

    1.排序 特点: 1).升序:从小到大 2).降序:从大到小 课堂实现选择排序:参看老郭选择排序.py文件 2.函数:(方法/method) 自定义函数: 概念:它表示一段作用范围(作用域),当中封装 ...

  2. swift的类型系统及类型(内存)信息获取:接口、编译运行时、反射、内存布局

    swift是静态语言,没有在运行时保存类型的结构信息(isa.class). 一.self.Self.Type.typeof extension Collection where Self.Eleme ...

  3. 【转】Android系统中的.apk文件和dex文件

    1. *.apk文件 APK是Android Package的缩写,即Android安装包.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. 使用Android打包工具 ...

  4. Hive学习之路 (十八)Hive的Shell操作

    一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...

  5. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1 mysql报错 ...

  6. Srv数据格式

    1.简介 类似msg文件, srv文件是用来描述服务( service数据类型的, service通信的数据格式定义在*.srv中. 它声明了一个服务, 包括请求(request)和响应( reply ...

  7. django 表结构

    django 表结构 一:查看orm写的sq语句:如果对某个语句不清楚的话可以调用queryset的的query方法来查看sql. 1 obj=Hostinfo.objects.filter(id=v ...

  8. iOS 倒计时的一种实现

    1.view [self performSelectorInBackground:@selector(thread) withObject:nil]; - (void)thread { ;i>= ...

  9. jQuery animate() 改变颜色

    jQuery提供的animate()方法可以实现一些简单的动画效果,但是其核心库不提供颜色动画的效果,如果想实现颜色动画,需要下载相关插件. 但是,animate()的参数中有一个complete,通 ...

  10. Bootstrap02

    Bootstrap02_内容概述 一.排版样式  (下面示例*代表class) 1.段落突出 *=lead <p>山外有山,<span class="lead"& ...