Flink HA配置

JobManager 高可用(HA)

jobManager协调每个flink任务部署。它负责调度和资源管理。

默认情况下,每个flink集群只有一个JobManager,这将导致一个单点故障(SPOF):如果JobManager挂了,则不能提交新的任务,并且运行中的程序也会失败。

使用JobManager HA,集群可以从JobManager故障中恢复,从而避免SPOF 。 用户在standalone或 YARN集群 模式下,配置高可用性

 

  • Standalone集群的高可用
  1. 配置
  • Yarn集群高可用
  1. 配置
  • zookeeper的安全配置
  • zookeeper选举

 

Standalone集群的高可用

Standalone模式(独立模式)下JobManager的高可用性的基本思想是,任何时候都有一个一个 Master JobManager ,并且多个Standby JobManagers 。 Standby JobManagers可以在Master JobManager 挂掉的情况下接管集群成为Master JobManager。 这样保证了没有单点故障,一旦某一个Standby JobManager接管集群,程序就可以继续运行。 Standby JobManager和Master JobManager实例之间没有明确区别。 每个JobManager可以成为Master或Standby节点。

举例,使用三个JobManager节点的情况下,进行以下设置:

配置

要启用JobManager高可用性,必须将高可用性模式设置为zookeeper, 配置一个ZooKeeper quorum,并配置一个masters文件 存储所有JobManager hostname 及其Web UI端口号。


Flink利用ZooKeeper 实现运行中的JobManager节点之间的分布式协调。 ZooKeeper是独立于Flink的服务,它通过领导选举制和轻量级状态一致性存储来提供高度可靠的分布式协调。有关ZooKeeper的更多信息,请查看 ZooKeeper入门指南。 Flink包含安装简单ZooKeeper 的引导脚本。

 

Masters File(masters)

为了启动集群的高可用(HA),需要配置conf/masters中的masters文件 :

  • masters file: masters file 文件中包含所有启动JobManager节点的hosts,以及对应Web UI的端口号
jobManagerAddress1:webUIPort1
[...]
jobManagerAddressX:webUIPortX

 

默认情况下,JobManager会选择 随机端口号 作为内部进程通信。我们可以通过修改参数recovery.jobmanager.port的值来修改。这个参数的配置接受为单个端口号(比如50010),也可以设置一段范围比如 50000~50025,或者端口号组合(比如50010,50011,50020~50025,50050~50075)。

 

配置文件(flink-conf.yaml)

为了启动集群的高可用(HA),需要对文件conf/flink-conf.yaml做一下配置:

  • 高可用模式 (必须): 要启用高可用,需要配置文件 conf/flink-conf.yaml 中的 high-availability mode 设置为 zookeeper。
high-availability: zookeeper

 

  • ZooKeeper 仲裁 (必须的): 一个ZooKeeper quorum 是一组可以复制的ZooKeeper服务器,提供分布式协调服务。
high-availability.zookeeper.quorum: address1:2181[,...],addressX:2181

每组 addressX:port 表示一个ZooKeeper服务, Flink必须可通过对应的地址和端口通信。

 

  • ZooKeeper root (推荐的): ZooKeeper节点根目录,其下放置所有集群节点的namespace。
high-availability.zookeeper.path.root: /flink

 

 

 

  • ZooKeeper 集群id (推荐的): ZooKeeper节点集群id,其中放置了集群所需的所有协调数据。
high-availability.cluster-id: /default_ns # important: customize per cluster


重要: 。 当你在yarn集群中运行的时候,不建议手工修改这个值。默认情况下,Yarn集群和Yarn会话会根据Yarn应用程序ID自动生成命名空间。 可以手动配置覆盖了Yarn中默认配置。 或可以使用-z CLI选项指定集群id,这样可以反过来覆盖手动配置。如果你运行了多个单独的Flink HA 集群,你必须为每个集群配置单独的集群id。

 

 

  • 存储目录 (required): JobManager的元数据保存在文件系统存储目录 storageDir 中,只有一个指向此状态的指针存储在ZooKeeper中。

 

 

high-availability.zookeeper.storageDir: hdfs:///flink/recovery

storageDir存储了所有恢复一个JobManager挂掉所需的元数据。

 

配置主机和ZooKeeper quorum后,可以照常使用提供的集群启动脚本。 他们将启动一个HA集群。 请记住,当您调用脚本时 ZooKeeper quorum 必须已经启动,并确保为您启动的每个HA群集配置单独的ZooKeeper根路径

例子: Standalone 集群有2个JobManagers

  • 配置文件 conf/flink-conf.yaml 中的 high-availability mod 和 ZooKeeper quorum:
    high-availability: zookeeper
    high-availability.zookeeper.quorum: localhost:2181
    high-availability.zookeeper.path.root: /flink
    high-availability.cluster-id: /cluster_one # important: customize per cluster
    high-availability.zookeeper.storageDir: hdfs:///flink/recovery
  • 配置conf/masters文件中的Configure masters:
    localhost:8081
    localhost:8082
  • 配置conf/zoo.cfg文件中的 ZooKeeper server (目前只能在每台机器上运行一个ZooKeeper服务器):
    server.0=localhost:2888:3888
  • 启动 ZooKeeper quorum:
    $ bin/start-zookeeper-quorum.sh
    Starting zookeeper daemon on host localhost.
  • 启动一个高可用(HA) 集群:
    $ bin/start-cluster.sh
    Starting HA cluster with 2 masters and 1 peers in ZooKeeper quorum.
    Starting jobmanager daemon on host localhost.
    Starting jobmanager daemon on host localhost.
    Starting taskmanager daemon on host localhost.
  • 停止ZooKeeper quorum 和集群:
    $ bin/stop-cluster.sh
    Stopping taskmanager daemon (pid: 7647) on localhost.
    Stopping jobmanager daemon (pid: 7495) on host localhost.
    Stopping jobmanager daemon (pid: 7349) on host localhost.
    $ bin/stop-zookeeper-quorum.sh
    Stopping zookeeper daemon (pid: 7101) on host localhost.

 

Yarn 集群高可用

当运行高可用性的YARN集群时,我们不运行多个JobManager(ApplicationMaster)节点,而是只有一个,当YARN挂了会导致这个JobManager重新启动。 具体的行为取决于不同的YARN版本。

 

配置

Maximum Application Master Attempts (yarn-site.xml)

必须在YARN的配置文件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>

当前YARN版本的默认值为2(表示允许JobManager失败一次)。

 

Application Attempts (flink-conf.yaml)

除了HA配置(see above), 您必须配置文件conf/flink-conf.yaml中的最大尝试次数:
 

yarn.application-attempts: 10

这意味着应用程序可以在YARN应用程序失败之前重新启动9次(9次重试+1次初始化)。额外的重启可以由yarn参数来控制,针对节点硬件故障重启,或者NodeManager同步。这些重启并没有被计算在yarn.application-attempts的次数中,可以查看此博客Jian Fang blog post。注意的是“yarn.resourcemanager.am.max-attempts”是应用程序重新启动的上限。 因此,在Flink中设置的应用程序尝试次数不能超过YARN启动的YARN集群设置。

 

容器关闭行为

  • YARN 2.3.0 <version <2.4.0 。 如果应用程序管理器出现故障,则所有容器都将重新启动。
  • YARN 2.4.0 <version <2.6.0。 TaskManager容器在应用程序管理器故障时依然保持存活。 这具有的优点是启动时间更快,并且用户不必等待再次获取容器资源。
  • YARN 2.6.0 <= version:将尝试失败有效期间设置为Flinks的Akka超时值。 尝试失败有效性间隔表示,在系统在一个时间间隔内,应用程序尝试的次数超过最大次数之后,应用程序才被杀死。 这样可以避免耗时长的工作会耗尽其尝试次数。
Note: Hadoop YARN 2.4.0有一个主要漏洞(2.5.0中被修复),应用程序管理器/任务管理器容器(container)重启后,
容器无法重启. 查看更多细节FLINK-4142[https://issues.apache.org/jira/browse/FLINK-4142]. 
我们建议至少在YARN上使用Hadoop 2.5.0进行高可用性设置.

 

例子: 高可用 YARN Session

  • 配置文件 conf/flink-conf.yaml 中的 high-availability mod 和 ZooKeeper quorum:
high-availability: zookeeper
high-availability.zookeeper.quorum: localhost:2181
high-availability.zookeeper.storageDir: hdfs:///flink/recovery
high-availability.zookeeper.path.root: /flink
yarn.application-attempts: 10

 

  • 配置conf/zoo.cfg文件中的 ZooKeeper server (目前只能在每台机器上运行一个ZooKeeper服务器):
server.0=localhost:2888:3888
  • 启动 ZooKeeper quorum:
$ bin/start-zookeeper-quorum.sh
Starting zookeeper daemon on host localhost.
  • 启动 HA-cluster集群:
$ bin/yarn-session.sh -n 2

 

Zookeepe的安全配置

如果ZooKeeper使用Kerberos运行在安全模式下,可以根据需要覆盖flink-conf.yaml中的以下配置:

 

 

zookeeper.sasl.service-name: zookeeper     # 默认是 "zookeeper". 如果ZooKeeper quorum被设置为不同的服务名字. 可以修改该参数
zookeeper.sasl.login-context-name: Client  # 默认是 "Client". 这个参数需要和"security.kerberos.login.contexts"中的一个参数 

有关Kerberos安全性的Flink配置的更多信息,请参阅这里. 也可以在这里进一步了解Flink如何内部设置基于Kerberos的安全性。

 

 

 

Bootstrap ZooKeeper

如果您没有安装正在运行的ZooKeeper,可以使用Flink附带的帮助脚本。

在conf/zoo.cfg中有一个ZooKeeper配置模板。 可以使用通过把hosts配置到server.X参数中来运行ZooKeeper,其中X是每个服务器的唯一ID:

 

 

 

 

server.X=addressX:peerPort:leaderPort
[...]
server.Y=addressY:peerPort:leaderPort

脚本bin/start-zookeeper-quorum.sh将在每个配置的主机上启动一个ZooKeeper服务器。 启动的进程通过Flink包装器启动ZooKeeper服务器,Flink包装器从conf/zoo.cfg读取配置,并确保设置一些所需的参数。 在生产环境中,建议自己管理ZooKeeper安装。

 

 

 

 

 

 

 

 

 

获取更多大数据资料,视频以及技术交流请加群:

 

<think>我们正在配置Flink集群的高可用性(HA)并使用本地持久卷(PV)。FlinkHA通常需要配置ZooKeeper和持久化存储来保存JobManager的元数据,以便在故障时恢复。本地PV意味着我们将使用Kubernetes节点上的本地存储,而不是网络存储(如NFS)。根据引用[4],我们注意到一个Flink-Session-HA的部署示例,其中提到了通过持久化recovery和checkpoints实现故障恢复。我们将参考这个结构,但使用本地PV。步骤概述:1.准备本地存储:在每个将运行JobManager的节点上创建目录,并确保有适当的权限。2.创建PersistentVolume(PV)和PersistentVolumeClaim(PVC)以供Flink使用。3.配置FlinkHA设置,包括ZooKeeper和状态后端。4.部署Flink集群(包括JobManager和TaskManager),并将PVC挂载到JobManager的Pod中。详细步骤:步骤1:准备本地存储假设我们有两个节点(node1和node2)将运行JobManager(通常HA需要至少两个JobManager)。在每个节点上创建目录,例如:node1:/mnt/flink/hanode2:/mnt/flink/ha步骤2:创建PV和PVC我们需要为每个节点创建一个PV,并创建对应的PVC。注意,因为本地PV是节点绑定的,所以我们需要为每个节点创建单独的PV。示例PV定义(jobmanager-pv-node1.yaml):```yamlapiVersion:v1kind:PersistentVolumemetadata:name:flink-jobmanager-pv-node1namespace:flink-sessionspec:capacity:storage:10GivolumeMode:FilesystemaccessModes:-ReadWriteOncepersistentVolumeReclaimPolicy:RetainstorageClassName:local-storagelocal:path:/mnt/flink/hanodeAffinity:required:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/hostnameoperator:Invalues:-node1#替换为实际节点名称```同样创建另一个PV(flink-jobmanager-pv-node2.yaml)指向node2。然后创建PVC。由于HA需要两个JobManager,我们将创建两个PVC,分别绑定到两个PV。示例PVC定义(jobmanager-pvc-node1.yaml):```yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:flink-jobmanager-pvc-node1namespace:flink-sessionspec:storageClassName:local-storageaccessModes:-ReadWriteOnceresources:requests:storage:10GivolumeName:flink-jobmanager-pv-node1```同样创建另一个PVC(flink-jobmanager-pvc-node2.yaml)绑定到node2的PV。步骤3:配置FlinkHA我们需要在Flink配置文件中设置HA相关参数。主要配置包括:-high-availability:zookeeper-high-availability.zookeeper.quorum:[ZooKeeper服务地址]-high-availability.storageDir:[持久化存储路径,即PV挂载的路径]此外,我们还需要配置ZooKeeper服务。可以单独部署ZooKeeper集群,也可以使用已有的。步骤4:部署Flink集群我们将部署两个JobManager(以实现HA)和多个TaskManager。创建JobManager的StatefulSet(因为每个JobManager需要绑定特定的PVC):注意:由于每个JobManager需要不同的配置(比如不同的HAID),我们可能需要分别创建两个Deployment,或者使用StatefulSet并利用不同的环境变量。示例JobManagerDeployment(node1):```yamlapiVersion:apps/v1kind:Deploymentmetadata:name:flink-jobmanager-node1namespace:flink-sessionspec:replicas:1selector:matchLabels:app:flinkcomponent:jobmanagerha-node:node1template:metadata:labels:app:flinkcomponent:jobmanagerha-node:node1spec:serviceAccountName:flink-service-accountcontainers:-name:jobmanagerimage:apache/flink:1.14.2-scala_2.11args:["jobmanager"]env:-name:HA_IDvalue:"1"-name:POD_IPvalueFrom:fieldRef:fieldPath:status.podIPports:-containerPort:6123name:rpc-containerPort:6124name:blob-containerPort:6125name:query-containerPort:8081name:uilivenessProbe:tcpSocket:port:6123initialDelaySeconds:30periodSeconds:60volumeMounts:-name:flink-ha-volumemountPath:/opt/flink/haresources:requests:cpu:200mmemory:512Mivolumes:-name:flink-ha-volumepersistentVolumeClaim:claimName:flink-jobmanager-pvc-node1affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/hostnameoperator:Invalues:-node1```同样,创建另一个JobManagerDeployment(node2),修改HA_ID为2,PVC为node2的PVC,并绑定到node2。然后,创建TaskManagerDeployment(无状态,可以多个副本):```yamlapiVersion:apps/v1kind:Deploymentmetadata:name:flink-taskmanagernamespace:flink-sessionspec:replicas:2selector:matchLabels:app:flinkcomponent:taskmanagertemplate:metadata:labels:app:flinkcomponent:taskmanagerspec:serviceAccountName:flink-service-accountcontainers:-name:taskmanagerimage:apache/flink:1.14.2-scala_2.11args:["taskmanager"]env:-name:JOB_MANAGER_RPC_ADDRESSvalue:flink-jobmanager#使用Service名称ports:-containerPort:6121name:data-containerPort:6122name:rpc-containerPort:6125name:querylivenessProbe:tcpSocket:port:6121initialDelaySeconds:30periodSeconds:60resources:requests:cpu:200mmemory:1024Mi```注意:我们需要一个Service来暴露JobManager。由于有两个JobManager,我们可以创建一个Service指向两个JobManager,但FlinkHA要求客户端连接其中一个JobManager,而内部通过ZooKeeper协调。因此,我们可以创建一个HeadlessService,让每个JobManager有独立的DNS记录,然后配置ZooKeeper集群地址。创建Service:```yamlapiVersion:v1kind:Servicemetadata:name:flink-jobmanagernamespace:flink-sessionspec:clusterIP:None#HeadlessServiceselector:app:flinkcomponent:jobmanagerports:-name:rpcport:6123-name:blobport:6124-name:queryport:6125-name:uiport:8081```这样,每个JobManager的Pod都会有独立的DNS:flink-jobmanager-node1.flink-session.svc.cluster.local等。在Flink配置中,我们需要设置:high-availability.zookeeper.quorum:[zookeeper-service]:2181high-availability.storageDir:file:///opt/flink/ha我们可以通过ConfigMap来管理Flink配置文件(flink-conf.yaml)。创建ConfigMap示例:```yamlapiVersion:v1kind:ConfigMapmetadata:name:flink-confignamespace:flink-sessiondata:flink-conf.yaml:|jobmanager.rpc.address:flink-jobmanagerjobmanager.rpc.port:6123blob.server.port:6124query.server.port:6125taskmanager.numberOfTaskSlots:2parallelism.default:2high-availability:zookeeperhigh-availability.storageDir:file:///opt/flink/hahigh-availability.zookeeper.quorum:zookeeper:2181#假设ZooKeeper服务名为zookeeper,在同一个namespacehigh-availability.zookeeper.path.root:/flinkhigh-availability.cluster-id:/flink-session-clusterstate.savepoints.dir:file:///opt/flink/savepointsstate.checkpoints.dir:file:///opt/flink/checkpointslog4j-console.properties:|#日志配置略```然后在JobManager和TaskManager的Pod中挂载这个ConfigMap。注意:由于我们使用了本地PV,当Pod被调度到其他节点时,将无法访问该节点的PV。因此,我们通过affinity确保JobManager始终调度到具有对应PV的节点。另外,ZooKeeper集群的部署可以参考其他文档,这里假设已经部署好。最后,初始化集群:kubectlapply-f[上述所有yaml文件]这样,我们就配置了一个使用本地PV的FlinkHA集群。注意事项:-本地PV是节点绑定的,所以JobManager只能运行在指定的节点上。如果节点故障,需要手动干预。-建议使用更可靠的存储(如分布式文件系统)来存储HA元数据,但本地PV可以提供更好的性能。相关问题:1.如何验证Flink集群的高可用性?2.除了本地PV,还有哪些存储选项可用于FlinkHA?3.如何配置Flink的检查点(checkpoint)和保存点(savepoint)存储?4.在K
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值