基于ZooKeeper实现HA高可用性以及自动主备切换

默认情况下,standalone cluster manager对于worker节点的失败是具有容错性的(迄今为止,Spark自身而言对于丢失部分计算工作是有容错性的,它会将丢失的计算工作迁移到其他worker节点上执行)。然而,调度器是依托于master进程来做出调度决策的,这就会造成单点故障:如果master挂掉了,就没法提交新的应用程序了。为了解决这个问题,spark提供了两种高可用性方案,分别是基于zookeeper的HA方案以及基于文件系统的HA方案。
基于zookeeper的HA方案

概述

使用zookeeper来提供leader选举以及一些状态存储,你可以在集群中启动多个master进程,让它们连接到zookeeper实例。其中一个master进程会被选举为leader,其他的master会被指定为standby模式。如果当前的leader master进程挂掉了,其他的standby master会被选举,从而恢复旧master的状态。并且恢复作业调度。整个恢复过程(从leader master挂掉开始计算)大概会花费1~2分钟。要注意的是,这只会推迟调度新的应用程序,master挂掉之前就运行的应用程序是不被影响的。

配置

如果要启用这个恢复模式,需要在spark-env.sh文件中,设置SPARK_DAEMON_JAVA_OPTS选项:
spark.deploy.recoveryMode 设置为ZOOKEEPER来启用standby master恢复模式(默认为NONE)spark.deploy.zookeeper.url zookeeper集群url(举例来说,192.168.0.103:2181,192.168.0.104:2181)spark.deploy.zookeeper.dir zookeeper中用来存储恢复状态的目录(默认是/spark)
备注:如果在集群中启动了多个master节点,但是没有正确配置master去使用zookeeper,master在挂掉进行恢复时是会失败的,
因为没法发现其他master,并且都会认为自己是leader。这会导致集群的状态不是健康的,因为所有master都会自顾自地去调度。

细节

在启动一个zookeeper集群之后,启用高可用性是很直接的。简单地在多个节点上启动多个master进程,并且给它们相同的zookeeper
配置(zookeeper url和目录)。master就可以被动态加入master集群,并可以在任何时间被移除掉。

为了调度新的应用程序或者向集群中添加worker节点,它们需要知道当前leader master的ip地址。这可以通过传递一个master列表来完成。举例来说,我们可以将我们的SparkContext连接的地址指向spark://host1:port1,host2:port2。这就会导致你的
SparkContext尝试去注册所有的master,如果host1挂掉了,那么配置还是正确的,因为会找到新的leader master,也就是host2。

对于注册一个master和普通的操作,这是一个重要的区别。当一个应用程序启动的时候,或者worker需要被找到并且注册到当前的leader master的时候。一旦它成功注册了,就被保存在zookeeper中了。如果故障发生了,new leader master会去联系所有的之前注册过的应用程序和worker,并且通知它们master的改变。这样的话,它们甚至在启动的时候都不需要知道new master的存在。

正是由于这个属性,new master可以在任何时间被创建,并且我们唯一需要担心的一件事情就是新的应用程序和worker可以找到并且注册到master。一旦注册上去之后,我们就不用担心它了。

实验

1、将192.168.2.15机器上的spark集群先停止
./sbin/stop-all.sh
2、修改机器上的spark-env.sh文件,在其中加入上述三个属性
export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=192.168.2.15:2181,192.168.2.16:2181 -Dspark.deploy.zookeeper.dir=/spark”
3、启动集群
在192.168.2.15上直接用启动集群:./sbin/start-all.sh

4、在192.168.2.16上部署spark安装包,并启动一个master进程

安装scala 2.11.4

1、将课程提供的scala-2.11.4.tgz使用WinSCP拷贝到/usr/local/src目录下。
2、对scala-2.11.4.tgz进行解压缩:tar -zxvf scala-2.11.4.tgz
3、对scala目录进行重命名:mv scala-2.11.4 scala
4、配置scala相关的环境变量
vi ~/.bashrc
export SCALA_HOME=/usr/local/scala
export PATH=$SCALA_HOME/bin
source ~/.bashrc
5、查看scala是否安装成功:scala -version

安装spark客户端

1、将spark-1.5.1-bin-hadoop2.4.tgz使用WinSCP上传到/usr/local/src目录下。
2、解压缩spark包:tar -zxvf spark-1.5.1-bin-hadoop2.4.tgz。
3、重命名spark目录:mv spark-1.5.1-bin-hadoop2.4 spark
4、修改spark环境变量
vi ~/.bashrc
export SPARK_HOME=/usr/local/spark
export PATH=SPARKHOME/binexportCLASSPATH=.:SPARKHOME/binexportCLASSPATH=.:CLASSPATH:JAVAHOME/lib:JAVAHOME/lib:JAVA_HOME/jre/lib
source ~/.bashrc

修改spark-env.sh文件

1、cd /usr/local/spark/conf
2、cp spark-env.sh.template spark-env.sh
3、vi spark-env.sh
export JAVA_HOME=/usr/java/latest
export SCALA_HOME=/usr/local/scala
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_IP=192.168.2.16
export SPARK_DAEMON_MEMORY=100m
export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=192.168.2.15:2181,192.168.2.16:2181 -Dspark.deploy.zookeeper.dir=/spark”

在192.168.2.16上单独启动一个standby master进程:./sbin/start-master.sh

4、提交应用程序
将master地址修改为192.168.2.15:7077,192.168.2.16:7078

5、杀掉原先的leader master,等到standby master接管集群
再次提交应用程序

6、再次手动启动原来的leader master(死掉)

问题

1、集群中包含两个节点,在192.168.2.15上配置了master和worker,
在192.168.2.16上配置了worker
但是在15集群上 ./sbin/start-all.sh
在16 集群上不启动 worker!! 原因在 在conf中的slaves.template 没有重命名,重命名为slaves 即可
slaves中:
A Spark Worker will be started on each of the machines listed below.
Spark1
Spark2
2、在15 上直接启动 ./sbin/start-all.sh
在16 上 ./sbin/start-master.sh
3、此时在文本上查看 192.168.2.15:8088
192.168.2.16:8088
查看,一个为standby 一个为alive !
将aliver 的jps kill-9 杀死掉
大概一分钟,之后 standby将变为aliver状态,此时基于zookeeper的主备机切换完成!

~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样访问Springboot项目中static中的资源

第一步 成功启动 第二步 输入 协议://ip:端口/资源的名字 eg http://localhost:8080/06-demo-point.html

数据库基础的知识点

 数据库系统基础: 一、数据库:存储数据的仓库 二、数据库能够做什么: 1.存储大量的数据,方便检索和访问。 2.保持数据的信息一致、完整 3.共享和安全 4.通过组合分析,产生新的有用信息。 三、应用程序和数据库的关系…

asp.net core源码飘香:Logging组件

简介: 作为基础组件,日志组件被其他组件和中间件所使用,它提供了一个统一的编程模型,即不需要知道日志最终记录到哪里去,只需要调用它即可。 使用方法很简单,通过依赖注入ILogFactory(CreateL…

互联网账户系统如何设计

转载自 互联网账户系统如何设计 在很多互联网公司业务发展的早期,业务模式比较单一的情况下,涉及用户账户资金交易相关的逻辑也比较简单,但是随着公司业务模式的不断创新及类型的多元化发展,会渐渐发现现有系统账户逻辑越来越雍…

html、sqlserver、java基础总结

1.锚链接&#xff1a;<a name"maker1" id"marker2">乙位置</a><a href"#marker1、#marker2">甲位置</a> 2.块级元素和行内元素&#xff1a;块级元素&#xff1a;<li></li> <p></p> <td>…

数组(ArrayList)底层怎样扩容

ArrayList维护了数组transient Object[] elementData; 初始化 数组需要扩容时

HBase出现java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration问题

问题&#xff1a;Hbase在集群上运行报错&#xff1a;NoClassDefFoundError:org/apache/hadoop/hbase/HBaseConfiguration 需求&#xff1a;HBase使用Java创建表&#xff0c;打包成jar&#xff0c;提交到集群上行运行&#xff01; 在IDEA中使用Maven添加Hbase 代码&#xff1…

Visual Basic 15语言新特性

对于C#的两个重要特性元组和Ref返回值&#xff0c;Visual Basic 15提供了对等的实现。这两个特性都是“不完全的”&#xff0c;但已经可以提供足够的变通方案&#xff0c;让VB应用程序可以消费使用了这些特性的C#库。 元组 在VB中&#xff0c;从单个函数调用直接返回多个值是…

Struts2面试问题

转载自 Struts2面试问题 1.什么是Struts2&#xff1f; Apache Struts2是一个用Java构建Web应用程序的开源框架。Struts2基于OpenSymphony WebWork框架。它从Struts1中得到了很大的改进&#xff0c;使其更加灵活&#xff0c;易于使用和扩展。Struts2的核心组件是Action&…

java、sqlserver复习

一、java简答题&#xff1a; 1.java中我们学过的数据库类型转换有几种&#xff1f;分别是什么&#xff1f;转换规则是什么&#xff1f; 答&#xff1a;两种&#xff0c;自动类型转换和强制类型转换。 源类型大于目标类型时&#xff0c;需要自动转换。 源类型小于目标类型时&…

新版csdn

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来&#xff0c;用它写博客&#xff0c;将会带来全新的体验哦&#xff1a; Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰…

玩转微信登录

前端对此接口进行请求 package com.chuang.bootplus.controller.wx;import com.alibaba.fastjson.JSONObject; import com.chuang.bootplus.entity.UserInfo; import com.chuang.bootplus.service.UserInfoService; import com.chuang.bootplus.utils.HttpClientUtil; import …

谷歌工程师文化中的几个核心原则

转载自 谷歌工程师文化中的几个核心原则 每周&#xff0c;一组谷歌员工都会在厕所的墙壁上粘贴一页来分享本周的测试小建议。有时这页纸会讨论依赖注入&#xff0c;并提供一个简单的示例展示如何用不同语言使用它&#xff1b;有时它可能会分享如何安装一个用于测量团队代码库…

初探CSRF在ASP.NET Core中的处理方式

前言 前几天&#xff0c;有个朋友问我关于AntiForgeryToken问题&#xff0c;由于对这一块的理解也并不深入&#xff0c;所以就去研究了一番&#xff0c;梳理了一下。 在梳理之前&#xff0c;还需要简单了解一下背景知识。 AntiForgeryToken 可以说是处理/预防CSRF的一种处理…

双重循环

一、什么是二重循环&#xff1f; 一个循环体内包含另一个完整的循环结构。 比如说&#xff1a; 1.while(循环条件1){ //循环操作1 while(循环条件2){ //循环操作2 } } 2.do{ //循环操作1 do{ //循环操作2 }while(循环条件2); }while(循环条件1); 3.for(循环条件1){ //循环操作1…

二维数组常用的赋值方式

静态初始化并赋值 int[][] data new int[][] { { 1, 2 }, { 2, 3 }, { 2, 3, 4 }, { 1, 2, 3, 4 } };print(data);int edges[][]{{0,1},{1,2},{1,3},{2,4},{3,4},{2,5}};动态赋值 //动态赋值int[][] data2 new int[3][2];for (int i 0; i < data2.length; i) {for (int j…

HBase体系架构说明

HBase体系架构说明&#xff01; client&#xff1a;两种—-Hbase shell 命令行接口 JavaAPI client访问Region不能直接访问&#xff0c;首先client需要先连接到zookeeper&#xff0c;zookeeper管理HMaster&#xff0c;说明&#xff0c;hdfs集群&#xff0c;在没有zookeepe…

面试中的这些坑,你踩过几个?

转载自 面试中的这些坑&#xff0c;你踩过几个&#xff1f; 01、请你做一个自我介绍 误区&#xff1a; 一般人回答这个问题过于平常&#xff0c;只说姓名、年龄、爱好、工作经验&#xff0c;这些在简历上都有。 要点&#xff1a; 简历上有的可以一两句话带过&#xff0c;…

asp.net core 编译mvc,routing,security源代码进行本地调试

因为各种原因&#xff0c;需要查看asp.net core mvc的源代码来理解运行机制等等&#xff0c;虽说源代码查看已经能很好的理解了。但是能够直接调试还是最直观的。所有就有了本次尝试。因调试设置源代码调试太辍笔&#xff0c;所以不用这个方法&#xff0c;转而使用编译源代码的…

并查集判断是否有环存在

题目描述 思路分析 代码实现 package com.atguigu.disjointSet;public class djset {public static int VERTICES6;public static void initialise(int parent[]){int i;for (i 0; i < VERTICES; i) {parent[i]-1;}}public static int find_root(int x,int parent[]){int …