Spark-Master源码和Master-HA
源码
总结1:
Master(startRpcEnvAndEndpoint)的工作主要有2部分组成
一是搭建环境(RpcEnvEndpoint)–> val rpc = RpcEnv.create(…)
在new NettyRpcEnvFactory().create()的nettyEnv.startServer()底层的receivers.offer(data)触发
new NettyRpcEnvFactory().create()的val nettyEnv = new NettyRpcEnv()底层的receivers.take()方法
//val transportContext = new TransportContext(NettyRpcHandler)方法。
二是触发执行 --> val masterEndpoint: RpcEndpointRef = rpcEnv.setupEndpoint(xx.new Master…)
在其底层的 val data:EndpointData = endpoints.get(name) receivers.offer(data)执行
endpoint.onStart()
其中receivers.offer(data)和endpoint.onStart()触发receivers.take()方法完成整个过程
总结2:
Master执行由两条线组成,其中第一条线又分为2条线,在此分别用1-1,1-2,2表示
1-1 搭建环境 启动线程 线程死循环加载队列 等待onstart触发
1-2 创建Map集合(任务名字,EndpotionData)
2 Master任务触发找到Map集合去匹配类型,触发1-1
开始执行
Master-HA
原理
Standalone集群只有一个Master,如果Master挂了就无法提交应用程序,需要给Master进行高可用配置,Master的高可用有两种实现方法: 1使用fileSystem(文件系统) 2zookeeper(分布式协调服务)
fileSystem只有存储功能,可以存储Master的元数据信息,用fileSystem搭建的Master高可用,在Master失败时,需要我们手动启动另外的备用Master,这种方式不推荐使用。
zookeeper有选举和存储功能,可以存储Master的元素据信息,使用zookeeper搭建的Master高可用,当Master挂掉时,备用的Master会自动切换,推荐使用这种方式搭建Master的HA。
搭建
1 在主节点spark/conf/spark-env.sh添加 指定ZK,指定ZK节点,指定ZK中存储文件名
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=sxt002:2181,sxt003:2181,sxt004:2181 -Dspark.deploy.zookeeper.dir=/MasterHA"
2 将更改好的/spark-env.sh 分发到另外的2台Worker节点上
3 在其中一台worker节点上 更改spark-env.sh的主节点(原sxt001)改为自身节点
4 主节点spark/sbin启动spark集群 ./start-all.sh
5 更改过的Worker节点在sbin下启动 ./start-master.sh
5 更改过的Worker节点在sbin下启动 ./start-master.sh