🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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申请注销自己并关闭自己