目录
Standalone模式与Local模式的区别点在于,Local模式是单节点运行,而Standalone模式是构建了由Master+Slave组成的Spark集群
由于Spark与Hadoop良好的兼容性,这里讲Spark集群搭建在Hadoop集群中
1. 搭建Standalone模式
三台已经安装好Hadoop的主机:hadoop100、hadoop101、hadoop102;
(1)进入spark/conf目录,修改配置文件
[kevin@hadoop100 conf]$ mv slaves.template slaves
[kevin@hadoop100 conf]$ mv spark-env.sh.template spark-env.sh
(2)修改slaves文件,添加worker节点
[kevin@hadoop100 conf]$ vim slaves
hadoop100
hadoop101
hadoop102
(3)修改spark-env.sh文件
[kevin@hadoop100 conf]$ vim spark-env.sh
SPARK_MASTER_HOST=hadoop100
SPARK_MASTER_PORT=7077
添加master节点名称hadoop100,端口号7077
(4)sbin/spark-config.sh目录下加入如下配置
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置JavaHome环境变量,防止运行报“JAVA_HOME not set”异常
(5)分发spark包
[kevin@hadoop100 module]$ xsync spark/
(6)启动spark-shell和HDFS
(7)启动spark的master和worker
[kevin@hadoop100 spark]$ sbin/start-all.sh
(8)jps查看集群状态
--------------------- hadoop100 ----------------
4353 SparkSubmit
5410 Jps
5202 Master
3432 NameNode
3579 DataNode
5326 Worker
--------------------- hadoop101 ----------------
3397 Jps
3318 Worker
3129 DataNode
--------------------- hadoop102 ----------------
3431 Worker
3271 SecondaryNameNode
3512 Jps
3150 DataNode
此时spark集群的master和worker开启,Driver端的SparkSubmit进程也开启,HDFS的NameNode和DataNode也开启;集群搭建完毕
(9)启动bin/spark-shell就可以开始编写scala程序了
2. HA配置
Spark通过Zookeeper可以实现高可用,master有多个,这样便于备份数据
(1)开启Zookeeper
(2)修改spark-env.sh文件
[kevin@hadoop100 conf]$ vi spark-env.sh
注释掉如下内容:
#SPARK_MASTER_HOST=hadoop102
#SPARK_MASTER_PORT=7077
添加上如下内容:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop100,hadoop101,hadoop102
-Dspark.deploy.zookeeper.dir=/spark"
(3)分发配置文件
[kevin@hadoop100 conf]$ xsync spark-env.sh
(4)在hadoop100上启动所有节点
[kevin@hadoop100 spark]$ sbin/start-all.sh
(5)在hadoop101上启动master节点
[kevin@hadoop101 spark]$ sbin/start-master.sh
这样master就在hadoop100和hadoop101两台服务器上都部署了,同时拥有3个worker,spark集群的HA配置完毕。
一般如果仅限本地测试Demo,spark会关闭HA即把conf/spark-env.sh文件中HA的信息注掉,开启一个Master即可。
3. Standalone模式下spark工作流程
(1)Master是资源管理器,Worker是具备资源环境的工作节点;Master与Worker关联;
(2)ApplicationMaster是应用管理器,向Master注册应用程序、申请和调度资源,并分配给Executor;ApplicationMaster与Master和Executor关联;Executor中资源配置完毕后启动;
(3)Driver是驱动器,调度Executor任务,跟踪任务运行情况。
既然Driver管任务调度,那么Driver就需要知道Executor的位置,所以Executor通过反向注册告诉Driver自己的信息;Executor通过反向注册与Driver关联;
(4)这样Driver就可以给Executor发送任务,Executor执行任务,Driver中编写的程序打包成依赖的jar包,在Executor中执行;
(5)当Executor中的任务执行完毕,Executor进程关闭,Driver进程也会关闭,Spark集群部分资源释放,全部关闭,剩下Client打印结果显示。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ApplicationMaster负责资源调度,向Master申请资源,给Worker中的Executor分配资源,
Driver负责任务调度,通过反向注册知道Executor的位置,并把任务分配给Executor执行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
若任务太大,而Executor的内存不足:
(1)首选在当前Executor执行;
(2)内存不够,降级处理,在同一个Worker下的Executor中执行;
(3)内存还不够,继续降级,在同一个机架下的Executor中执行。