实验环境:

zookeeper-3.4.6

Spark:1.6.0

简单介绍:

本篇博客将从下面几点组织文章:

一:Spark 构建高可用HA架构

二:动手实战构建高可用HA

三:提交程序測试HA

一:Spark 构建高可用HA架构



Spark本身是Master和Slave,而这这里的

Master是指Spark资源调度和分配。

负责整个集群的资源调度和分配。

Worker是管理单个节点的资源。

这里面的资源主要指:内存和CPU。

1. Master-Slave模型非常easy出现单节点故障的问题。

所以为了应用这个问题,解决的方法是通过Zookeeper来解决,在实际开发的时候一般都是三台,一个active,两个standby,当一个active挂掉后。Zookeeper会依据自己的选举机制,从standby的Master选举出来一个作为leader。

这个leader从standby模式变成active模式的话,做的最重要的事:是从Zookeeper中获取整个集群的状态信息,恢复整个集群的Worker,Driver,Application,这样才干接管整个集群的工作。而仅仅有它成功完毕之后,leader的Master才干够恢复成active的Master,才干够对外继续提供服务(作业的提交和资源的申请请求。

),当active的master挂掉以后,standby的master变成active的master之前我们是不能够向集群提交新的程序。可是在Zookeeper切换期间,在这个时间集群的执行时正常的,比如,一个程序依旧能够正常执行。

由于程序在执行之前已经向Master申请资源了,Driver与我们全部worker分配的executors进行通信。这个过程一般不须要master參与。除非executor有故障。Master是粗粒度分配。粗粒度的优点当Master出故障以后,能够让Worker和executor交互完毕计算。

2. Zookeper包括的内容有哪些:全部的Worker,Driver(代表了正在执行的程序)。Application(应用程序)

二:动手实战构建高可用HA

3. 准备好Zookeeper安装包,下载zookeeper-3.4.6.tar.gz地址例如以下:

http://apache.fayea.com/zookeeper/zookeeper-3.4.6/
  1. 将Zookeeper软件包移动到/usr/local/spark。

  2. 解压zookeeper.
[root@Master spark]# tar -zxvf zookeeper-3.4.6.tar.gz
  1. 在bashrc中加入zookeeper环境变量
export ZOOKEEPER_HOME=/usr/local/spark/zookeeper-3.4.6
export PATH=/usr/local/eclipse/eclipse:/usr/local/idea/idea-IC-141.1532.4/bin:${MAVEN_HOME}/bin:${FLUME_HOME}/bin:${SPARK_HOME}/bin:${SPARK_HOME}/sbin/sbin::${SCALA_HOME}/bin:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${HIVE_HOME}/bin:${ZOOKEEPER_HOME}/bin:$PATH
7. 到zookeeper的conf文件夹下。将zoo_sample.cfg拷贝一份,由于在执行的时候zoo_sample.cfg会被删除。拷贝改名zoo.cfg,对zoo.cfg进行配置。

[root@Master conf]# cp zoo_sample.cfg zoo.cfg
8.  配置文件
[root@Master conf]# vim zoo.cfg
dataDir=/tmp/zookeeper
dataDir=/usr/local/spark/zookeeper-3.4.6/data
dataLogDir=/usr/local/spark/zookeeper-3.4.6/logs
server.0=Master:2888:3888
server.1=Worker1:2888:3888
server.2=Worker2:2888:3888

在/usr/local/spark/zookeeper-3.4.6/下创建data文件夹

[root@Master zookeeper-3.4.6]# mkdir data
10.  在/usr/local/spark/zookeeper-3.4.6/data 下创建标记每台机器的ID,最简单的方法:
[root@Master data]# echo 0>myid
11. 利用scp命令将在Master配置的zookeeper,复制到Worker1和Worker2节点上。
12. 在spark-env.sh中配置Zookeeper信息,注意此时的Master_IP是master就不须要了。由于zookeeper中配置了.
-Dspark.deploy.recoveryMode:    表明整个集群的恢复和维护都是Zookeeper.
-Dspark.deploy.zookeeper.url: 全部做HA机器。当中端口2181是默认端口。 -Dspark.deploy.zookeeper.dir: 指定Spark在Zookeeper注冊的信息
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_60
export SCALA_HOME=/usr/local/scala/scala-2.10.4
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0
export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.6.0/etc/hadoop
//export SPARK_MASTER_IP=Master 这个IP就不须要了。
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=Master:2181,Worker1:2181,Worker2:2181 -Dspark.deploy.zookeeper.dir=/spark"
export SPARK_WORKER_MEMORY=2g
export SPARK_EXECUTOR_MEMORY=2g
export SPARK_DRIVER_MEMORY=2G
export SPARK_WORKER_CORES=2
13. 至此就全部安装完毕了,启动Master,Worker1和Worker2节点上的Zookeeper.
[root@Worker1 bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/spark/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED [root@Worker2 bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/spark/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED [root@Master bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/spark/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
14. jps查看进程,三台机器均启动成功。
[root@Master bin]# jps
4005 Jps
3685 SecondaryNameNode
3978 QuorumPeerMain [root@Master bin]# jps
4005 Jps
3685 SecondaryNameNode
3978 QuorumPeerMain [root@Worker2 Desktop]# jps
3194 DataNode
3453 QuorumPeerMain
3503 Jps
15. 启动Spark集群。
[root@Master sbin]# ./start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.master.Master-1-Master.out Worker2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-Worker2.out Worker1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-Worker1.out
16. 可是此时Worker1和Worker2上的进程是Worker,而Master进程是master为什么?

由于在Spark集群配置中,slaves文件里我们此时指定了Worker节点。因此在启动的时候就会默认依据我们的配置启动Spark集群。

[root@Master sbin]# jps
4067 Master
3685 SecondaryNameNode
3978 QuorumPeerMain
4110 Jps
[root@Master sbin]# ssh Worker1
Last login: Sat May 7 17:29:50 2016 from master
[root@Worker1 ~]# jps
2881 Jps
2484 DataNode
2724 QuorumPeerMain
2827 Worker
[root@Worker1 ~]# exit
logout
Connection to Worker1 closed.
[root@Master sbin]# ssh Worker2
Last login: Sat May 7 17:24:00 2016 from worker1
[root@Worker2 ~]# jps
3569 Worker
3194 DataNode
3644 Jps
3453 QuorumPeerMain
17. 到Worker1和Worker2上手动启动Master.
[root@Worker1 sbin]# ./start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.master.Master-1-Worker1.out [root@Worker1 ~]# jps
2484 DataNode
2724 QuorumPeerMain
2952 Master
2827 Worker
3052 Jps
[root@Worker2 sbin]# ./start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.master.Master-1-Worker2.out
[root@Worker2 sbin]# jps
3569 Worker
3704 Master
3194 DataNode
3772 Jps
3453 QuorumPeerMain
18. 通过web界面查看,Master是ALIVE.



而Worker1和Worker2的Status是STANDY(备胎)状态。



三:提交程序測试HA

1. 以集群的方式启动Spark-shell。

由于此时受Zookeeper管理,因此在集群启动的时候,须要将三台HA中的Master都要写上。此时程序执行的时候肯定要向Zookeeper找active级别的Master。

[root@Master bin]# ./spark-shell --master spark://Master:7077,Worker1:7077,Worker2:7077
2.  启动spark-shell的时候通过日志能够看到,应用程序会连接三台Master.
16/05/07 10:28:20 INFO client.AppClient$ClientEndpoint: Connecting to master spark://Master:7077...
16/05/07 10:28:20 INFO client.AppClient$ClientEndpoint: Connecting to master spark://Worker1:7077...
16/05/07 10:28:20 INFO client.AppClient$ClientEndpoint: Connecting to master spark://Worker2:7077...
3.  关闭Master节点上的master进程。
[root@Master sbin]# ./stop-master.sh
stopping org.apache.spark.deploy.master.Master

Zookeeper切换master,这个时候须要将Master上的master进行恢复给Worker1,因此须要延迟一段时间。

scala> 16/05/07 10:34:12 WARN client.AppClient$ClientEndpoint: Connection to Master:7077 failed; waiting for master to reconnect...
16/05/07 10:34:12 WARN cluster.SparkDeploySchedulerBackend: Disconnected from Spark cluster! Waiting for reconnection...
16/05/07 10:34:12 WARN client.AppClient$ClientEndpoint: Connection to Master:7077 failed; waiting for master to reconnect...
16/05/07 10:35:05 INFO client.AppClient$ClientEndpoint: Master has changed, new master is at spark://Worker1:7077
4.  刷新web端,此时就无法链接上master进程。



5. 查看Worker1的web端信息,奇妙的事发生了,此时我们能够看到之前Master节点上的master信息.

Spark搭建HA具体解释的更多相关文章

  1. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十)安装hadoop2.9.0搭建HA

    如何搭建配置centos虚拟机请参考<Kafka:ZK+Kafka+Spark Streaming集群环境搭建(一)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网.& ...

  2. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  3. spark搭建部署

    基础环境准备 安装JDK1.8+,并设置环境变量 搭建zookeeper集群 搭建Hadoop集群 Spark local模式 上传编译完成的spark安装程序到服务器上,并解压到指定目录 [root ...

  4. MySQL: Fabric 搭建 HA

    搭建好Fabric之后,就可以在它的基础上创建HA Group. Shard Group.HA+Shard Group等.这里来说明一下如何快速的搭建HA环境. Fabric 192.168.2.23 ...

  5. spark standalone ha spark submit

    when you build a spark standalone ha cluster, when you submit your app,  you should send it to the l ...

  6. Spark standalone HA

    配置Spark standalone HA 主机:node1,node2,node3 master: node1,node2 slave:node2,node3 修改配置文件: node1,node3 ...

  7. 伪分布式Spark + Hive on Spark搭建

    Spark大数据平台有使用一段时间了,但大部分都是用于实验而搭建起来用的,搭建过Spark完全分布式,也搭建过用于测试的伪分布式.现在是写一遍随笔,记录一下曾经搭建过的环境,免得以后自己忘记了.也给和 ...

  8. 攻城狮在路上(陆)-- hadoop分布式环境搭建(HA模式)

    一.环境说明: 操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 ...

  9. hadoop+hive+spark搭建(三)

    一.spark安装   因为之前安装过hadoop,所以,在“Choose a package type”后面需要选择“Pre-build with user-provided Hadoop [can ...

随机推荐

  1. unity DoTween使用

    先说插件获取,DoTween是一个开源的插件,它的代码托管在Github上[https://github.com/Demigiant/dotween].若只是单纯项目需要是可以去AssetStore获 ...

  2. 用十条命令在一分钟内检查 Linux 服务器性能

    原文地址: http://www.oschina.net/news/69132/linux-performance 如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出L ...

  3. 折叠代码块 C#中用 #region和#endregion java中用 //region和//endregion

    折叠代码块 C#中用 #region和#endregion   java中用 //region和//endregion

  4. C++11 多线程编程 使用lambda创建std::thread (生产/消费者模式)

    要写个tcp server / client的博客,想着先写个c++11多线程程序.方便后面写博客使用. 目前c++11中写多线程已经很方便了,不用再像之前的pthread_create,c++11中 ...

  5. Android Gesture Detector

    Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等.这些Gesture会使用户体验大大提升.An ...

  6. 服务器能远程连接,网络连接正常,但是外网域名Ping不通,浏览器中打不开网站

    服务器能远程连接成功,但在浏览器中打不开任何网站,出现这个问题一般是安装什么软件引起IE的相关设置做了变动或者是服务器中了病毒引起的,或是服务器的DNS设置是错误的. 一.先检查服务器DNS是否正确 ...

  7. windows多线程--原子操作

    推荐参考博客:秒杀多线程第三篇 原子操作 Interlocked系列函数 原子操作 VS 非原子操作 原子操作就是不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程切 ...

  8. 学校公文办公处理系统_基于ASP.NET和Swfupload、FlashPaper2.2、校讯通短信发送的开发

    学校新来了一个主管教学的副校长,他对他以前工作学校的公文处理系统表示高度留念,于是乎叫我们也开发一个. 我就参考了那个学校的办公管理系统,发现其实功能也蛮简单的,就是一个文件上传下载的功能,选择用户组 ...

  9. 逼格高又实用的Linux高级命令,开发运维都要懂!

    在运维的坑里摸爬滚打好几年了,我还记得我刚开始的时候,我只会使用一些简单的命令,写脚本的时候,也是要多简单有多简单,所以有时候写出来的脚本又长又臭. 像一些高级点的命令,比如说 Xargs 命令.管道 ...

  10. Newtonsoft.Json2.0下面序列化和反序列化

    序列化 string xml = JavaScriptConvert.SerializeObject(dataTable); 反序列化 JavaScriptConvert.DeserializeObj ...