第一阶段(1-3月):会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战。课程会涵盖Scala编程详解、Spark核心编程、Spark SQL和Spark Streaming、Spark GraphX、SparkR、Machine Learning、Spark内核以及源码剖析、性能调优、企业级案例实战等部分
第二阶段(Spark超大规模大数据案例实战):使用了Spark技术生态栈中的Spark Core、Spark SQL、Spark Streaming、SparkR、Machine Learning,进行离线计算和实时计算业务模块的开发、数据的关联性分析、用户行为模式和特征的训练与应用、用户网络的社区发现、用户影响力、能量传播、标签传播、标签推理、人群划分、年龄段预测、商品交易时序跳转
本期内容:
1 Spark高可用HA实战
2 Spark集群工作原理详解
通常资源指Memory、CPU,Master Slaves结构存在单点故障,即Master容易出现故障,为了应对单点故障,Spark在生产环境下通过zookeeperr做HA。现通常使用3个Master做HA,即使有Avtive的Master出现故障,另外两个STANDBY模式的Master会由zookeeper选出leader,替换故障的Master,变为Avtive Master,恢复集群状态,通过zookeeper保存集群的元数据恢复(Zookeeper中包含元数据,所有的Worker、Driver Application)。
只有STANDBY模式Master恢复了Avtive才能恢复集群的正常,而在此过程中不能提交作业,Master切换的过程中不会影响集群的作业的运行,因为程序在运行前,已经向Master申请过资源,申请过资源后,Driver与Worker分配的Executor进行通信,此过程不需要Master参与,除非Executor故障。所以,切换Master的过程不影响作业运行,这是一种粗粒度的管理方式。
粗粒度:一次性分配好资源,之后只需使用或覆用,
优点:在于一次性分配好资源后无需再分配,Driver和Worker的Executor 正常交互不受Master切换的影响;
缺点:job较多的时候,只要有一个job没有运行完,作业没有运行完,为作 业分配的资源就会闲置起来,
细粒度:需要资源的时候在进行分配,使用完资源后立即释放,缺点:资源无法覆 用,任务启动非常慢,且有通信麻烦。
实现Spark高可用HA实战:
第一步:下载zookeeper 地址:http://zookeeper.apache.org/
第二步:解压配置环境
export /ZOOKEEPER_HOME=/usr/local/zookeeper-3.6.4
并在path中添加zookeeper的bin目录(zookeeper安装和hadoop,spark没有关系)
修改:1、进到conf目录下,把zoo_sample.cfg修改成zoo.cfg
dataDir=.../zookeeper/zookeeper-3.6.4/data(若不修改,重启后会删除)
dataLogDir=.../logs(data和logs是zookeeper安装目录下创建的目录)
指定三台zookeeper集群
2、zookeeper安装目录下创建data和logs用来存放数据和日志,并在data 下创建文件myid,并在Master中myid添加0。
dataDir=/tmp/zookeeper
dataDir=/usr/local/zookeeper-3.4.6/data
dataLogDir=/usr/local/zookeeper-3.4.6/logs
server.0=master:2888:3888
server.1=worker1:2888:3888
server.2=worker2:2888:3888
第三步:scp 拷贝到2台Worker上面;将Worker1 myid中的0改为1,Worker2上的 myid中的0改为2
第四步:分别启动zookeeper(Master、Worker1、Worker2):
.../bin/# zkServer.sh start
jps查看进程,多了进程QuorumPeerMain
第五步:让Spark支持zookeeper:
vim spark-env.sh配置spark的支持信息,
1、将SPARK_DAEMON_JABA_OPTS
2、配置zookeeper所有做HA的机器
<p><span style="color:rgb(255,0,0);">export JAVA_HOME=/root/install/jdk1.7.0_21</span></p><p><span style="color:rgb(255,0,0);">#export SPARK_MASTER_IP=spark1</span></p><p><span style="color:rgb(255,0,0);">#export SPARK_MASTER_PORT=7077</span></p><p><span style="color:rgb(255,0,0);">export SPARK_WORKER_CORES=1</span></p><p><span style="color:rgb(255,0,0);">export SPARK_WORKER_INSTANCES=1</span></p><p><span style="color:rgb(255,0,0);">export SPARK_WORKER_MEMORY=1g</span></p><p><span style="color:rgb(255,0,0);">export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=Master:2181,Worker1:2181 -Dspark.deploy.zookeeper.dir=/spark"</span></p><p><strong>其中:</strong></p><p>-Dspark.deploy.recoveryMode=ZOOKEEPER <span style="font-family:宋体;">:说明整个集群状态通过</span><span style="font-family:Times New Roman;">zookeeper</span><span style="font-family:宋体;">来维护</span><span style="font-family: Arial, Helvetica, sans-serif;">也说明整个集群状态恢复也是靠</span><span style="font-family: 'Times New Roman';">zookeeper</span></p><p>-Dspark.deploy.zookeeper.url=Master:2181,Worker1:2181 <span style="font-family:宋体;">:说明</span><span style="font-family:Times New Roman;">zookeeper</span><span style="font-family:宋体;">做</span><span style="font-family:Times New Roman;">HA</span><span style="font-family:宋体;">的机器</span></p><p>-Dspark.deploy.zookeeper.dir=/spark"<span style="font-family:宋体;">:说明存放</span><span style="font-family:Times New Roman;">Spark</span><span style="font-family:宋体;">元数据,和</span><span style="font-family:Times New Roman;">spark</span><span style="font-family:宋体;">运行状态</span></p>
第六步:启动Spark集群
问题:为什么只在Master中有Master进程?
Spark配置文件Slaves中指定了Worker,此时需要手动启动Worker1、Worker2上启动Master进程:./start-master.sh ,之后查看Worker1的Status为STANDB
状态所以的Workers,所有的Died、所有的Alive
第七步:测试HA
./spark-shell --master spark://Master:7077,Worker1:7077,Worker2:7077
向zookeeper去找一个Active的Master,只跟Active的Master进行交互。
client.AppClient$ClientActor: Master haschanged, new master is at spark://worker1:7077
关闭Active Master机器,恢复集群需要时间,哪台机器恢复快Active,就会与Apalication中的Driver进行交互,即该机器变为Master,此时Web界面无法访问,Master变为Worker1,Master机器Status变为STANDBY(切换Master没有意义,且浪费时间),然后重启集群后,Maste任然变为Worker1。
zookeeper做ha,以前一直认为可以从woker选举变为master级别,原来从master(standby)变为master(active),心跳貌似是2秒,默认。
Spark Runtime
一般程序提交的时候,当Driver启动后,向Master进行注册初始化时完成,(Spark程序是在注册的时候完成资源分配)然后由Master分配资源,程序提交给Master由CoarseGraineSchedularBackend的子类SparkDeploySchedulerBackend进行管理。
DT大数据梦工厂
新浪微博:www.weibo.com/ilovepains/
微信公众号:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:18610086859@vip.126.com