Spark高可用HA实战

来源:互联网 发布:字体管家 mac 编辑:程序博客网 时间:2024/05/12 09:43

zookeeper可以做让所有机器的状态同步或者做集群的全局配置
Spark高可用HA实战
active挂掉后集群切换流程:当集群的master的active挂掉之后,zookeeper会在standby的master中通过选举机制选择一台standby机器作为leader, 通过读取zookeeper中的元数据信息,恢复整个集群的状态,成功恢复之后才能作为整个集群的master(active),开始接受所有的作业提交和资源申请的请求

集群的元数据存在于什么地方:整个集群的元数据都存在于zookeeper中,当master挂掉之后standby的机器会在zookeeper中恢复选择一台机器作为master的active

问题:zookeeper中包含的内容有哪些?
答:Worker,Driver,Application

问题:当active级别的master挂掉之后,standby级别的master作为active之前的这一段时间我们能不能向集群提交新的作业或者申请资源?
答:不能,但是程序在集群的运行是正常的是不会影响的,为什么不会影响?程序在运行之前(向master注册的时候,也是程序初始化的时候)已经向master申请过资源(粗粒度),分配资源之后,Driver开始于Worker分配的Excutor开始进行通信,这个时候一般不需要master参与,除非Excutor有故障。所以在master在出现故障之后,并不影响已有的作业的运行。

粗粒度好处:一次分配完资源之后还可以复用这些资源,Driver直接就可以和Worker分配的Excutor通信,
粗粒度坏处:当我们的job有100万个任务,只有1个任务非常的慢,那么其余100万-1个任务占用的资源将不会释放,资源闲置却不能释放
细粒度好处:资源动态分配,需要才会去申请,使用完毕释放资源。
细粒度坏处:任务启动非常慢,资源无法复用(因为一次任务task计算使用完毕之后就会释放资源),通信麻烦(需要多次申请资源)

配置zookeeper好处,当我们集群重启之后他会将上一次运行的Driver,Application,Worker等信息重新恢复出来
HA的配置:
dataDir必须重新配置:默认是在tmp下面,当下次集群(主要是zookeeper)启动的时候会全部删除
zoo.cfg文件配置信息:
Spark高可用HA实战
然后再data目录下面创建一个文件myid作为每一个server的标记 0 1 2
zookeeper启动命令:zkServer.sh start 每台机器需要分别手动去启动
zookeeper配置完毕:
下一步:让Spark支持zookeeper下的HA
在spark-env.sh
整个集群的维护以及恢复都靠zookeeper
Spark高可用HA实战

最后一句的意思是:spark在zookeeper注册的目录
然后将SPARK_MASTER_IP注释掉

然后启动Spark集群start-all.sh 由于spark的slave里面的信息指定了worker的节点所以只有在master机器上启动了master,我们需要手动启动其他部署有zookeeper的机器的spark的master(./start-master.sh),但是他们处于standby状态,如下图所示:
Spark高可用HA实战
通过启动spark-shell可以看出来
./spark-shell –master spark://192.168.5.128:7077,192.168.5.134:7077,192.168.5.135:7077
6/01/17 06:07:05 INFO AppClientClientEndpoint:Connectingtomasterspark://hadoop1:707716/01/1706:07:05INFOAppClientClientEndpoint: Connecting to master spark://hadoop2:7077…
16/01/17 06:07:05 INFO AppClient$ClientEndpoint: Connecting to master spark://hadoop3:7077…
他会尝试连接所有zookeeper下面的master( 相当于注册一下,知道会有哪一些master) 最后只跟具有active级别的master交互

hadoop1的master是active级别
hadoop2,hadoop3是standby级别
当我们将hadoop1的master挂掉之后,zookeeper会重新选举一个leader作为集群新的master,是集群规模大小,可能会达到分钟级别的切换,选出来新的leader之后,他需要恢复之前的active级别的master的所有集群信息以及状态(元数据包括:application,driver,worker) ,如有spark-shell正在连接,那么zookeeper会发消息给Driver,新的master已经改变
切换状态信息:16/01/17 06:12:43 WARN AppClientClientEndpoint:Connectiontohadoop1:7077failed;waitingformastertoreconnect16/01/1706:12:43WARNSparkDeploySchedulerBackend:DisconnectedfromSparkcluster!Waitingforreconnection16/01/1706:12:43WARNReliableDeliverySupervisor:Associationwithremotesystem[akka.tcp://sparkMaster@hadoop1:7077]hasfailed,addressisnowgatedfor[5000]ms.Reason:[Disassociated]16/01/1706:12:43WARNAppClientClientEndpoint: Connection to hadoop1:7077 failed; waiting for master to reconnect…
16/01/17 06:13:20 INFO AppClient$ClientEndpoint: Master has changed, new master is at spark://hadoop2:7077

当我们退出spark-shell之后,下次spark-shell还是会连接上一次退出时连接的master

当关闭一台节点的电源会产生如下的日志:
16/01/17 06:35:46 ERROR TaskSchedulerImpl: Lost executor 1 on 192.168.5.135: remote Rpc client disassociated
16/01/17 06:35:46 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@192.168.5.135:58527] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
16/01/17 06:35:46 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkMaster@hadoop2:7077] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
16/01/17 06:35:46 WARN AppClientClientEndpoint:Connectiontohadoop2:7077failed;waitingformastertoreconnect16/01/1706:35:46WARNSparkDeploySchedulerBackend:DisconnectedfromSparkcluster!Waitingforreconnection16/01/1706:35:46INFODAGScheduler:Executorlost:1(epoch0)16/01/1706:35:46WARNAppClientClientEndpoint: Connection to hadoop2:7077 failed; waiting for master to reconnect…
16/01/17 06:35:46 INFO BlockManagerMasterEndpoint: Trying to remove executor 1 from BlockManagerMaster.
16/01/17 06:35:46 INFO BlockManagerMasterEndpoint: Removing block manager BlockManagerId(1, 192.168.5.135, 45582)
16/01/17 06:35:46 INFO BlockManagerMaster: Removed 1 successfully in removeExecutor
16/01/17 06:35:58 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@192.168.5.134:33931] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
16/01/17 06:35:58 ERROR TaskSchedulerImpl: Lost executor 2 on 192.168.5.134: remote Rpc client disassociated
16/01/17 06:35:58 INFO DAGScheduler: Executor lost: 2 (epoch 1)
16/01/17 06:35:58 INFO BlockManagerMasterEndpoint: Trying to remove executor 2 from BlockManagerMaster.
16/01/17 06:35:58 INFO BlockManagerMasterEndpoint: Removing block manager BlockManagerId(2, 192.168.5.134, 38548)
16/01/17 06:35:58 INFO BlockManagerMaster: Removed 2 successfully in removeExecutor

搭建spark集群的配置信息问题(不是HA搭建的问题):
spark.default.parallelism 100什么意思?
解答:需要根据实际情况调整默认配置,调整方式是修改参数spark.default.parallelism。通常的,reduce数目设置为core数目的2-3倍。数量太大,造成很多小任务,增加启动任务的开销;数目太小,任务运行缓慢。所以要合理修改reduce的task数目即spark.default.parallelism

在集群中如果因为某种原因导致Worker失败了,重新启动使用命令:./start-all.sh

0 0
原创粉丝点击