实验环境: 
zookeeper-3.4.6 
Spark:1.6.0 
简介: 
本篇博客将从以下几点组织文章: 
一:Spark 构建高可用HA架构 
二:动手实战构建高可用HA 
三:提交程序测试HA

一:Spark 构建高可用HA架构 
 
Spark本身是Master和Slave,而这这里的 
Master是指Spark资源调度和分配。负责整个集群的资源调度和分配。 
Worker是管理单个节点的资源。 
这里面的资源主要指:内存和CPU。 
1. Master-Slave模型很容易出现单节点故障的问题。所以为了应用这个问题,解决办法是通过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信息. 

HA下的Spark集群工作原理解密的更多相关文章

  1. keepalive集群工作原理及应用

    author:JevonWei 版权声明:原创作品 集群工作原理 一.集群基础 1.系统的扩展方式 scale up向上扩展:提高单台服务器的性能 scale out向外扩展:多台服务器联合起来满足同 ...

  2. LVS 集群工作原理

    1. 集群:集群(cluster )就是一组计算机,它们作为一个整体向用户提供一组网络资源,单个计算机系统就是一个集群节点(node). 2. 集群种类: <1>. 负载均衡集群(Load ...

  3. [Elasticsearch] 集群工作 - 第二部分

    本文翻译自Elasticsearch官方指南的life inside a cluster一章. 添加故障转移(Failover)功能 仅仅执行一个节点意味着可能存在着单点失败(Single point ...

  4. zhihu spark集群,书籍,论文

    spark集群中的节点可以只处理自身独立数据库里的数据,然后汇总吗? 修改 我将spark搭建在两台机器上,其中一台既是master又是slave,另一台是slave,两台机器上均装有独立的mongo ...

  5. Spark集群高可用HA配置

    本文中的Spark集群包含三个节点,分别是Master,Worker1,Worker2. 1.在Master机器上安装Zookeeper,本文安装在/usr/etc目录下 2.在Master机器配置Z ...

  6. 使用Kafka的一些简单介绍: 1集群 2原理 3 术语

    目录 第一节 Kafka 集群 Kafka 集群搭建 Kafka 集群快速搭建 第二节 集群管理工具 集群管理工具 集群 Issues 第三节 使用命令操纵集群 第四节 Kafka 术语说明 第五节 ...

  7. HA分布式集群配置三 spark集群配置

    (一)HA下配置spark 1,spark版本型号:spark-2.1.0-bin-hadoop2.7 2,解压,修改配置环境变量 tar -zxvf spark-2.1.0-bin-hadoop2. ...

  8. Spark入门:第2节 Spark集群安装:1 - 3;第3节 Spark HA高可用部署:1 - 2

    三. Spark集群安装 3.1 下载spark安装包 下载地址spark官网:http://spark.apache.org/downloads.html 这里我们使用 spark-2.1.3-bi ...

  9. Spark 在Hadoop HA下配置HistoryServer问题

    我的Spark机群是部署在Yarn上的,因为之前Yarn的部署只是简单的完全分布式,但是后来升级到HA模式,一个主NN,一个备NN,那么Spark HistoryServer的配置也需要相应的做修改, ...

随机推荐

  1. Service Fabric Placement and Load Balancing

    作者:潘罡 (Van Pan)@ Microsoft 什么是PLB (Placement and Load Balancing) 介绍FM的上文中,我们提到了PLB. 这个组件和FM协同工作,为FM提 ...

  2. Python3 笨方法 练习41(面向对象)详解及运行结果

    #无尽模式训练你,检验所掌握的面向对象的单词和短语. import random from urllib.request import urlopen import sys WORD_URL = &q ...

  3. Java多态性的“飘渺之旅”

    原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 朵星人A:人类,是一个很奇妙的物种. 朵星人B:他们好像分为两种,嗯 先生,以及美女? 朵星人C:对,更年轻的有 ...

  4. python---基础知识回顾(七)迭代器和生成器

    前戏:迭代器和生成器 迭代: 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). Python的for循环不仅可以用在 ...

  5. Nginx记录-Nginx配置

    1. 启动,停止和重新加载Nginx配置 要启动nginx,请运行可执行文件. 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它. 使用以下语法: nginx -s signal 信号( ...

  6. [USACO5.3]量取牛奶Milk Measuring

    https://daniu.luogu.org/problemnew/show/P2744 滚动数组压去第一维:前i种木桶 f[j] 量取体积j最少需要几种木桶 g[j]  体积j的最优解是否使用了第 ...

  7. Qt_扫雷游戏实现

    源代码下载(详细注释): 详细代码(注释): https://github.com/xiaocangtian/GameMine 链接: http://pan.baidu.com/s/1gf9Ux5h ...

  8. 深入浅出JavaScript之跨域总结

    什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用H ...

  9. 凸优化(Convex Optimization)浅析

    本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 在机器学习中, 很多情况下我们都需要求得一个 问题的全局最优值(global optimum) ...

  10. 网摘关于BarCodeControl控件

    简介 BarCodeControl是一个用户制作条形码的控件. MicrosoftBarcodeControl9.0是可以在MicrosoftOfficeAccess窗体和报表中显示条码符号的Acti ...