文章目录

  • 零、本讲学习目标
  • 一、Spark HA集群概述
  • 二、Spark HA集群架构
  • 三、集群角色分配表
  • 四、Spark HA集群搭建步骤
    • (一)安装配置ZooKeeper
      • 1、在虚拟机master上安装配置ZooKeeper
      • 2、在虚拟机slave1上安装配置ZooKeeper
      • 3、在虚拟机slave2上安装配置ZooKeeper
    • (二)启动与关闭集群ZooKeeper服务
      • 1、在虚拟机master上启动ZK服务
      • 2、在虚拟机slave1上启动ZK服务
      • 3、在虚拟机slave2上启动ZK服务
      • 4、在三个虚拟机上查询ZK服务状态
      • 5、测试集群三个节点是否同步
      • 6、关闭三台虚拟机上的ZK服务
    • (三)在master节点上修改Spark环境配置文件 - spark-env.sh
    • (四)将master节点上的Spark环境配置文件分发到slave1和slave2
    • (五)在slave1和slave2上让Spark环境配置生效
  • 五、启动Spark HA集群
    • (一)启动ZooKeeper集群
      • 1、在master节点上启动ZK服务
      • 2、在slave1节点上启动ZK服务
      • 3、在slave2节点上启动ZK服务
    • (二)启动Spark集群
      • 1、在master节点启动Spark集群
      • 2、在slave1节点启动备用状态Master
      • 3、查看三个节点的进程
  • 六、测试Spark HA集群
    • (一)在Spark WebUI里查看两个Master状态
    • (二)测试Spark集群是否高可用

零、本讲学习目标

  1. 了解Spark HA集群工作原理
  2. 掌握搭建Spark HA集群基本步骤
  3. 能够测试Spark HA集群的高可用性

一、Spark HA集群概述

  • Spark Standalone和大部分Master/Slave模式一样,都存在Master单点故障问题,解决方式是基于ZooKeeper实现两个Master无缝切换,类似HDFS的NameNode HA(High Availability,高可用)或YARN的ResourceManager HA。
  • Spark可以在集群中启动多个Master,并使它们都向ZooKeeper注册,ZooKeeper利用自身的选举机制保证同一时间只有一个Master是活动状态(active)的,其他的都是备用状态(Standby)的。
  • 当活动状态的Master出现故障时,ZooKeeper会从其他备用状态的Master选出一台成为活动Master,整个恢复过程大约在1分钟之内。对于恢复期间正在运行的应用程序,由于应用程序在运行前已经向Master申请了资源,运行时Driver负责与Executor进行通信,管理整个应用程序,因此Master的故障对应用程序的运行不会产生影响,但是会影响新应用程序的提交。
  • 默认情况下,Standalone的Spark集群是Master-Slaves架构的集群模式,由一台master来调度资源,这就和大部分的Master-Slaves结构集群一样,存在着Master单点故障的问题。如何解决这个单点故障的问题呢?Spark提供了两种方案:基于文件系统的单点恢复(Single-Node Recovery with Local FileSystem)和基于ZooKeeper的Standby Masters(Standby Masters with ZooKeeper)。其中ZooKeeper是生产环境下的最佳选择。
  • ZooKeeper提供了一个Leader Election机制,利用这个机制你可以在集群中开启多个master并使它们都注册到ZooKeeper实例,ZooKeeper会管理使其中只有一个是Active的,其他的都是Standby的,Active状态的master可以提供服务,standby状态的则不可以。ZooKeeper保存了集群的状态信息,该信息包括所有的Worker,Driver 和Application。当Active的Master出现故障时,ZooKeeper会从其他standby的master中选举出一台,然后该新选举出来的master会恢复挂掉了的master的状态信息,之后该Master就可以正常提供调度服务。整个恢复过程只需要1到2分钟。需要注意的是,在这1到2分钟内,只会影响新程序的提交,那些在master崩溃时已经运行在集群中的程序并不会受影响。为了开启这个恢复模式,你可以用下面的属性在spark-env.sh中设置SPARK_DAEMON_JAVA_OPTS
System Property Meaning
Dspark.deploy.recoveryMode 设置zookeeper去启动备用master模式(默认为none)
Dspark.deploy.zookeeper.url zookeeper集群url(如master:2181, slave1:2181, slave2:2181)
Dspark.deploy.zookeeper.dir zookeeper保存恢复状态的目录(默认是/spark)

二、Spark HA集群架构

  • 以Spark Standalone模式的client提交方式为例,其HA的架构如下图所示。

三、集群角色分配表

  • 接着前面搭建好的Spark Standalone集群继续进行Spark HA的搭建,搭建前的角色分配如下表所示。
节点 角色
master Master
QuorumPeerMain
slave1 Master
Worker
QuorumPeerMain
slave2 Worker
QuorumPeerMain

四、Spark HA集群搭建步骤

(一)安装配置ZooKeeper

  • 如果要搭建高可用Hadoop集群或Spark集群,那么才需启动ZooKeeper集群
  • ZooKeeper下载网址:
    https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
  • 下载到hw_win7虚拟机上

1、在虚拟机master上安装配置ZooKeeper

  • 将zookeeper安装包上传到/opt目录
  • 执行命令tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/local,将zookeeper安装解压到指定目录
  • 将zookeeper解压目录更名为zookeeper-3.7.0,执行命令:mv /usr/local/apache-zookeeper-3.7.0-bin /usr/local/zookeeper-3.7.0
  • 进入zookeeper安装目录,创建ZkData子目录
  • 进入zookeeper配置目录conf,复制zoo_sample.cfg到zoo.cfg
  • 执行命令:vim zoo.cfg,修改zoo.cfg文件,配置数据目录和服务器选举id
dataDir=/usr/local/zookeeper-3.7.0/ZkData
# server's election id
server.1=192.168.1.103:2888:3888
server.2=192.168.1.104:2888:3888
server.3=192.168.1.105:2888:3888

说明:server后面的数字是选举id,在选举过程中会用到
注意:数字一定要能比较出大小。
2888:原子广播端口号,可以自定义
3888:选举端口号,可以自定义

  • 存盘退出,进入数据目录ZkData,创建myid文件,内容为1
  • 配置环境变量,执行命令vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_231
ZK_HOME=/usr/local/zookeeper-3.7.0
HADOOP_HOME=/usr/local/hadoop-2.7.1
SPARK_HOME=/usr/local/spark-2.4.4-bin-hadoop2.7
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$ZK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME
/sbin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
export JAVA_HOME ZK_HOME HADOOP_HOME SPARK_HOME PATH CLASSPATH
  • 存盘退出后,执行命令source /etc/profile,让配置生效
  • 关闭防火墙
systemctl stop firewalld.service  # 临时关闭防火墙
systemctl disable firewalld.service # 禁止开机启动防火墙
systemctl status firewalld # 查看防火墙状态

2、在虚拟机slave1上安装配置ZooKeeper

  • 将虚拟机master上的zookeeper安装目录复制到虚拟机slave1相同目录,执行命令:scp -r /usr/local/zookeeper-3.7.0 root@slave1:/usr/local
  • 将虚拟机master上的/etc/profile复制到虚拟机slave1相同位置,执行命令:scp /etc/profile root@slave1:/etc/profile
  • 切换到虚拟机slave1,执行命令source /etc/profile,让配置生效
  • 在虚拟机slave1上,进入zookeeper-3.7.0/ZkData目录,修改myid的内容为2

3、在虚拟机slave2上安装配置ZooKeeper

  • 将虚拟机master上的zookeeper安装目录复制到虚拟机slave2相同目录,执行命令:scp -r /usr/local/zookeeper-3.7.0 root@slave2:/usr/local

  • 将虚拟机master上的/etc/profile复制到虚拟机slave2相同位置,执行命令:scp /etc/profile root@slave2:/etc/profile

  • 切换到虚拟机slave2,执行命令source /etc/profile,让配置生效

  • 在虚拟机slave2上,进入zookeeper-3.7.0/ZkData目录,修改myid的内容为3

(二)启动与关闭集群ZooKeeper服务

1、在虚拟机master上启动ZK服务

  • 在master虚拟机上,执行命令:zkServer.sh start

2、在虚拟机slave1上启动ZK服务

  • 在slave1虚拟机上,执行命令:zkServer.sh start

3、在虚拟机slave2上启动ZK服务

  • 在slave2虚拟机上,执行命令:zkServer.sh start

4、在三个虚拟机上查询ZK服务状态

  • 在master虚拟机上,执行命令:zkServer.sh status
  • 在slave1虚拟机上,执行命令:zkServer.sh status
  • 在slave2虚拟机上,执行命令:zkServer.sh status
  • 可以看到:虚拟机slave1是老大(leader),虚拟机master和虚拟机slave2是小弟(follower)。

5、测试集群三个节点是否同步

  • 在虚拟机slave2上,执行命令:zkCli.sh,启动zk客户端,创建一个节点/zk01
  • 现在,去看集群另外两个节点master和slave1是否已经同步?

  • 大家可以看到,集群三个节点的数据是同步的
  • 在三个虚拟机上,执行quit命令,退出zk客户端

6、关闭三台虚拟机上的ZK服务

  • 关闭master虚拟机上的ZK服务
  • 关闭slave1虚拟机上的ZK服务
  • 关闭slave2虚拟机上的ZK服务

(三)在master节点上修改Spark环境配置文件 - spark-env.sh

  • 进入Spark配置目录,执行命令:vim spark-env.sh,记得删除其中的SPARK_MASTER_HOST属性配置
export JAVA_HOME=/usr/local/jdk1.8.0_231
export SPARK_MASTER_PORT=7077
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=master:2181,slave1:2181,slave2:2181
-Dspark.deploy.zookeeper.dir=/spark"
  • 存盘退出后,执行source spark-env.sh,让环境配置生效

(四)将master节点上的Spark环境配置文件分发到slave1和slave2

  • 执行命令:scp spark-env.sh root@slave1:$SPARK_HOME/conf
  • 执行命令:scp spark-env.sh root@slave2:$SPARK_HOME/conf

(五)在slave1和slave2上让Spark环境配置生效

  • 在slave1上执行命令:source $SPARK_HOME/conf/spark-env.sh
  • 在slave2上执行命令:source $SPARK_HOME/conf/spark-env.sh

五、启动Spark HA集群

(一)启动ZooKeeper集群

1、在master节点上启动ZK服务

  • 执行命令:zkServer.sh start

2、在slave1节点上启动ZK服务

  • 执行命令:zkServer.sh start

3、在slave2节点上启动ZK服务

  • 执行命令:zkServer.sh start
  • 操作小技巧:如果需要在多个节点上执行同样的命令,可以打开SecureCRT的聊天窗口,将命令发布到多个会话对应的节点上,尤其当节点数较多时,这样操作显然可以提高效率。

(二)启动Spark集群

1、在master节点启动Spark集群

  • 需要注意的是,在哪个节点上启动的Spark集群,活动状态的Master就存在于哪个节点上。
  • 执行命令:$SPARK_HOME/sbin/start-all.sh

2、在slave1节点启动备用状态Master

  • 执行命令:$SPARK_HOME/sbin/start-master.sh

3、查看三个节点的进程

  • 在master节点上执行jps命令
  • 在slave1节点上执行jps命令
  • 在slave2节点上执行jps命令

六、测试Spark HA集群

(一)在Spark WebUI里查看两个Master状态

  • 查看master节点上Master状态

  • 访问http://master:8080,但是访问不了

  • 修改master节点上Spark环境配置文件,设置SPARK_MASTER_WEBUI_PORT

  • 存盘退出,执行source spark-env.sh,让配置生效

  • 将Spark环境配置文件分发到slave1和slave2

  • 在slave1上执行source spark-env.sh,让配置生效

  • 在slave2上执行source spark-env.sh,让配置生效

  • 再次在master节点上启动Spark集群

  • 在slave1节点上启动备用状态Master

  • 访问http://master:8088,查看master节点上Master状态 - alive (活动状态)

  • 访问http://slave1:8088,查看slave1节点上Master状态 - standby (备用状态)

(二)测试Spark集群是否高可用

  • 使用kill -9命令杀掉master节点的Master进程,稍等几秒后多次刷新slave1节点的WebUI,发现Master的状态由STANDBY首先变为了RECOVERING(恢复,该状态持续时间非常短暂),最后变为了ALIVE,如下所示。
  • slave1节点Master处于RECOVERING状态
  • slave1节点Master处于ALIVE状态
  • 此时若需要连接Spark集群执行操作,则–master参数的连接地址需改为spark://slave1:7077

Spark基础学习笔记07:搭建Spark HA集群相关推荐

  1. Spark基础学习笔记:搭建spark on yarn 集群

    一.Spark On YARN架构 Spark On YARN模式遵循YARN的官方规范,YARN只负责资源的管理和调度,运行哪种应用程序由用户自己实现,因此可能在YARN上同时运行MapReduce ...

  2. Spark基础学习笔记02:Spark运行时架构

    文章目录 零.本讲学习目标 一.Spark运行时架构 二.YARN集群架构 (一)YARN集群主要组件 1.ResourceManager - 资源管理器 2.NodeManager - 节点管理器 ...

  3. Spark基础学习笔记22:Spark RDD案例分析

    文章目录 零.本讲学习目标 一.案例分析:Spark RDD实现单词计数 (一)案例概述 (二)实现步骤 1.新建Maven管理的Spark项目 2.添加Scala和Spark依赖 3.创建WordC ...

  4. 2022年Spark基础学习笔记目录

    一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...

  5. 2022年Spark基础学习笔记

    一.Spark学习笔记 在OpenStack私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建 ...

  6. Spark基础学习笔记16:创建RDD

    文章目录 零.本讲学习目标 一.RDD为何物 (一)RDD概念 (二)RDD示例 (三)RDD主要特征 二.做好准备工作 (一)准备文件 1.准备本地系统文件 2.准备HDFS系统文件 (二)启动Sp ...

  7. Spark基础学习笔记10:Scala集成开发环境

    文章目录 零.本讲学习目标 一.搭建Scala的Eclipse开发环境 (一)安装Scala插件 (二)创建Scala项目 二.搭建Scala的IntelliJ IDEA开发环境 (一)启动IDEA ...

  8. ElasticSearch学习笔记(8)· ES集群的搭建

    目录 十三.集群的实现 1.相关概念 集群(cluster) 节点(node) 分配和复制(shards & replicas) 2.快速搭建集群 3.安装head插件 十三.集群的实现 1. ...

  9. 直播 | 基于kubeadm搭建Kubernetes HA集群

    分享时间:6月18日 20:30 分享主题:基于kubeadm搭建Kubernetes HA集群 分享人介绍: 张炯,上汽集团下属赛可出行运维工程师.10年工作经验,曾任职于Ctrip.SNDA,作为 ...

最新文章

  1. NAS设置NFS共享便于KODI添加视频的方式
  2. [原]Python命令
  3. 专科生文科生学计算机有前途吗,我是一个双非大专生,感觉前途一片迷茫
  4. 01: MySql简介
  5. 首届中国信息通信大数据大会将于4月20-21日在京召开
  6. 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
  7. 测试枕头软件,智能枕头:一款神器监测您的睡眠
  8. chm文件打开中文乱码
  9. ncnn 载入insightface训练好的性别年龄识别模型
  10. [4G5G专题-62]:架构 - 开放的网络自动化平台ONAP(Open Network Automation Platform)
  11. Netty 警告 The pipeline contains no upstream handlers; discarding:
  12. layui中table表格内容过多自动换行
  13. win10更新后局域网电脑无法共享打印机
  14. 键鼠共享工具Barrier
  15. Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)
  16. Swift 代码调试核武-LLDB调试基础
  17. Java框架 SpringMVC介绍及入门案例
  18. goupby()分组后的排序
  19. mathtype服务器 消息通知区域,MathType打开窗口太多怎么办
  20. 2.8 Rn的子空间(第2章矩阵代数)

热门文章

  1. 补习系列(15)-springboot 分布式会话原理
  2. 大型情感剧集Selenium:8_selenium网页截图的四种方法
  3. 消息队列应用场景解析
  4. mysql empty table_【MySQL】 empty table and delete table.
  5. Going Deeper in Spiking Neural Networks: VGG and Residual Architectures
  6. 关于卸载Python第三方包的粗暴方法
  7. Linux查找历史命令
  8. LeetCode-20:有效的括号
  9. 如何将字符串数组的空格去除_java中如何将数组转换为List
  10. Maven将jar包install到本地仓库deploy到远程仓库命令