# standalone模式
1、修改三台机器环境变量:
vi编辑.bash_profile文件
```
[hadoop@master ~]$ vim .bash_profile
```
添加spark相关信息,然后保存退出
```
export SPARK_HOME=/home/hadoop/spark-2.1.1-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
```
运行source命令,重新编译.bash\_profile,使添加变量生效
```
[hadoop@master ~]$ source ~/.bash_profile
```
2、修改slaves文件:
进入spark的配置文件目录
```
[hadoop@master ~]$ cd spark-2.1.1-bin-hadoop2.7/conf/
```
将conf目录中的slaves.template文件重命名为slaves
`[hadoop@master conf]$ mv slaves.template slaves`
将slaves原内容替换为如下内容,并保存退出
```
slave1
slave2
```
3、修改conf目录中的spark-env.sh文件:
重命名文件 spark-env.sh.template 为 spark-env.sh
`[hadoop@master conf]$ mv spark-env.sh.template spark-env.sh`
将如下内容添加到spark-env.sh文件,并保存退出
```
export SPARK_MASTER_HOST=master #设置运行master进程的节点
export SPARK_MASTER\_PORT=7077 #设置master的通信端口
export SPARK_WORKER_CORES=1 #每个worker使用的核数
export SPARK_WORKER_MEMORY=1024M #每个worker使用的内存大小
export SPARK_MASTER\_WEBUI_PORT=8080 #master的webui端口
export SPARK_CONF_DIR=/home/hadoop/spark-2.1.1-bin-hadoop2.7/conf #spark的配置文件目录
export JAVA_HOME=/usr/java/jdk1.8.0_131/ #jdk安装路径`
```
4、将经过配置的spark主目录远程拷贝到另外两个从节点:
远程拷贝spark主目录到slave1、slave2
```
[hadoop@master ~]$ scp -r spark-2.1.1-bin-hadoop2.7/ hadoop@slave1:/home/hadoop
[hadoop@master ~]$ scp -r spark-2.1.1-bin-hadoop2.7/ hadoop@slave2:/home/hadoop
```
5、启动spark集群:
进入master节点 的spark的sbin目录
`[hadoop@master ~]$ cd spark-2.1.1-bin-hadoop2.7/sbin/`
运行start-all.sh启动spark集群
`[hadoop@master sbin]$ ./start-all.sh`
打开浏览器访问spark webui界面地址:[http://master:8080]
# Yarn模式
1、编辑.bash_profile文件:
```
[hadoop@master ~]$ vim .bash_profile
```
添加如下三个环境变量,然后保存退出:
```
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
```
运行source命令,重新编译.bash_profile,使添加变量生效:
```
[hadoop@master ~]$ source .bash_profile
```
2、有时候我们在启动Spark on Yarn时会出现内存大小错误,此时job会被强制杀死,为了避免这一情况,我们编辑/home/hadoop/hadoop-.7.3/etc/hadoop目录下的yarn-site.xml文件
```
[hadoop@master ~]$ cd hadoop-2.7.3/etc/hadoop/
[hadoop@master hadoop]$ vim yarn-site.xml
```
加入以下内容:
(这里的设置是取消yarn运行模式的运行内存检测,这样就算内存达不到要求也不会kill掉任务)
```
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
```
将yarn-site.xml文件发送到从节点:
```
[hadoop@master hadoop]$ scp yarn-site.xml hadoop@slave01:/home/hadoop/hadoop-2.7.3/etc/hadoop
[hadoop@master hadoop\]$ scp yarn-site.xml hadoop@slave02:/home/hadoop/hadoop-2.7.3/etc/hadoop
```
3、启动Hadoop集群:
在master启动Hadoop集群
`[hadoop@master ~]$ start-all.sh`
访问web ui:[http://master:18088]
![](https://box.kancloud.cn/a73fb3028329dd48aae415eccb143816_654x385.png)
Standalone模式
1、使用SparkSubmit提交任务的时候(包括Eclipse或者其它开发工具使用new SparkConf()来运行任务的时候),Driver运行在Client;使用SparkShell提交的任务的时候,Driver是运行在Master上
2、使用SparkSubmit提交任务的时候,使用本地的Client类的main函数来创建sparkcontext并初始化它;
3、SparkContext连接到Master,注册并申请资源(内核和内存)。
4、Master根据SC提出的申请,根据worker的心跳报告,来决定到底在那个worker上启动StandaloneExecutorBackend(executor)
5、executor向SC注册
6、SC将应用分配给executor,
7、SC解析应用,创建DAG图,提交给DAGScheduler进行分解成stage(当出发action操作的时候,就会产生job,每个job中包含一个或者多个stage,stage一般在获取外部数据或者shuffle之前产生)。然后stage(又称为Task Set)被发送到TaskScheduler。TaskScheduler负责将stage中的task分配到相应的worker上,并由executor来执行
8、executor创建Executor线程池,开始执行task,并向SC汇报
9、所有的task执行完成之后,SC向Master注销
![](https://box.kancloud.cn/6d2bf21f9eecd303ddf60ce89446c53b_663x478.png)
二、yarn client
1、spark-submit脚本提交,Driver在客户端本地运行;
2、Client向RM申请启动AM,同时在SC(client上)中创建DAGScheduler和TaskScheduler。
3、RM收到请求之后,查询NM并选择其中一个,分配container,并在container中开启AM
4、client中的SC初始化完成之后,与AM进行通信,向RM注册,根据任务信息向RM申请资源
5、AM申请到资源之后,与AM进行通信,要求在它申请的container中开启CoarseGrainedExecutorBackend(executor)。Executor在启动之后会向SC注册并申请task
6、SC分配task给executor,executor执行任务并向Driver(运行在client之上的)汇报,以便客户端可以随时监控任务的运行状态
7、任务运行完成之后,client的SC向RM注销自己并关闭自己
![](https://box.kancloud.cn/1ef8e2c002c0a0a5a712699760a98442_663x460.png)
三、yarn cluster
1、spark-submit脚本提交,向yarn(RM)中提交ApplicationMaster程序、AM启动的命令和需要在Executor中运行的程序等
2、RM收到请求之后,选择一个NM,在其上开启一个container,在container中开启AM,并在AM中完成SC的初始化
3、SC向RM注册并请求资源,这样用户可以在RM中查看任务的运行情况。RM根据请求采用轮询的方式和RPC协议向各个NM申请资源并监控任务的运行状况直到结束
4、AM申请到资源之后,与对应的NM进行通信,要求在其上获取到的Container中开启CoarseGrainedExecutorBackend(executor), executor 开启之后,向AM中的SC注册并申请task
5、AM中的SC分配task给executor,executor运行task并向AM中的SC汇报自己的状态和进度
6、应用程序完成之后(各个task都完成之后),AM向RM申请注销自己并关闭自己