Spark 运行模式(Standalone 模式)

1、Driver & Executor

Driver & Executor 是Spark 集群中两个非常重要的角色;

2、Standalone 模式

Standalone模式是Spark自带的资源调动引擎,构建一个由Master + Slave构成的Spark集群,Spark运行在集群中。这个要和Hadoop中的Standalone区别开来。这里的Standalone是指只用Spark来搭建一个集群,不需要借助其他的框架。是相对于Yarn和Mesos来说的。

Master和Worker是Spark的守护进程,即Spark在特定模式下正常运行所必须的进程。Driver和Executor是临时程序,当有具体任务提交到Spark集群才会开启的程序。

2.1、安装

1、集群规划
 
hadoop103
hadoop104
hadoop105
Spark
Master
Worker
Worker
Worker
2、安装文件准备

[hui@hadoop103 module]$ cp -r spark-3.0.3-bin-hadoop2.7 spark_standalone

3、修改slave文件,添加work节点:

[hui@hadoop103 module]$ cd spark_standalone/conf/
[hui@hadoop103 conf]$ mv slaves.template slaves
[hui@hadoop103 conf]$ vim slaves
#删除最后一行,增加一下三行
hadoop103
hadoop104
hadoop105
4、修改spark-env.sh文件,添加master节点 
[hui@hadoop103 conf]$ cp spark-env.sh.template spark-env.sh
[hui@hadoop103 conf]$ vim spark-env.sh
#指定Master节点&端口
SPARK_MASTER_HOST=hadoop103
SPARK_MASTER_PORT=7077
5、分发 
[hui@hadoop103 module]$ sxync.sh spark_standalone/
6、启动 standalone 集群

[hui@hadoop103 spark_standalone]$ sbin/start-all.sh 

检查发现进程没有完全起来

[hui@hadoop103 spark_standalone]$ jps.sh
------------------- hui@hadoop103 --------------
7258 Master
7839 Jps
------------------- hui@hadoop104 --------------
1979 DataNode
4830 Jps
------------------- hui@hadoop105 --------------
2384 Jps

查看日志

[hui@hadoop103 logs]$ cat spark-hui-org.apache.spark.deploy.worker.Worker-1-hadoop103.out
JAVA_HOME is not set

解决方案

[hui@hadoop103 spark_standalone]$ cd sbin/
[hui@hadoop103 sbin]$ vim spark-config.sh
#手工指定 JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
分发
[hui@hadoop103 sbin]$ sxync.sh spark-config.sh 

再次启动

[hui@hadoop103 spark_standalone]$ sbin/start-all.sh 
[hui@hadoop103 spark_standalone]$ jps.sh
------------------- hui@hadoop103 --------------
8054 Worker
8153 Jps
7979 Master
------------------- hui@hadoop104 --------------
4984 Worker
5069 Jps
------------------- hui@hadoop105 --------------
2529 Worker
2612 Jps
7、网页查看:hadoop103:8080(master web的端口,相当于hadoop的9870端口)目前还看不到任何任务的执行信息。
8、官方求PI案例
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop103:7077 \
./examples/jars/spark-examples_2.12-3.0.3.jar \
10
参数:--master spark://hadoop103:7077指定要连接的集群的master
页面查看http://hadoop103:8080/ ,发现执行本次任务,默认采用三台服务器节点的总核数6核,每个节点内存1024M。
8080:master的webUI 4040:application的webUI的端口号
查看任务总体情况

 

查看任务每个节点的使用情况

2.2、参数说明

1、配置Executor可用内存为2G,使用CPU核数为2个
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop103:7077 \
--executor-memory 2G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.12-3.0.3.jar \
10
参数说明: 
--executor-memory 2G 设置任务内存只要2G,也可以使用  M 进行设置
--total-executor-cores 2 2核参与计算
2、查看页面
http://hadoop103:8080/ 任务总体运行 

这个时候只有2个节点参与运算

3、基本语法

bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]
4、参数说明

参数
解释
可选值举例
--class
Spark程序中包含主函数的类
 
--master
Spark程序运行的模式
本地模式:local[*]、spark://hadoop102:7077、
Yarn
--executor-memory 1G
指定每个executor可用内存为1G
符合集群内存配置即可,具体情况具体分析。
--total-executor-cores 2
指定所有executor使用的cpu核数为2个
application-jar
打包好的应用jar,包含依赖。这个URL在集群中全局可见。 比如hdfs:// 共享存储系统,如果是file:// path,那么所有的节点的path都包含同样的jar
application-arguments
传给main()方法的参数

2.3、配置历史服务

由于spark-shell停止掉后,hadoop102:4040页面就看不到历史任务的运行情况,所以开发时都配置历史服务器记录任务运行情况。
1、修改spark-default.conf.template名称,并编辑配置
[hui@hadoop103 conf]$ cp  spark-defaults.conf.template  spark-defaults.conf
[hui@hadoop103 conf]$ vim spark-defaults.conf
spark.eventLog.enabled          true
spark.eventLog.dir              hdfs://hadoop103:9000/spark-log
#分发
[hui@hadoop103 conf]$ sxync.sh  spark-defaults.conf

参数说明

spark.eventLog.enabled          true 
开启历史服务
spark.eventLog.dir              hdfs://hadoop103:9000/spark-log
指定历史服务日志的hdfs存储路径
2、hdfs 创建存储历史日志的路径:注意:需要启动Hadoop集群,HDFS上的目录需要提前存在。

[hui@hadoop103 conf]$ hadoop fs -mkdir /spark-log
3、修改spark-env.sh文件,添加如下配置:

[hui@hadoop103 conf]$ vim  spark-env.sh
#新增一下内容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://hadoop103:9000/spark-log
-Dspark.history.retainedApplications=30"
#分发
[hui@hadoop103 conf]$ sxync.sh spark-env.sh

参数说明

# 参数1含义:WEBUI访问的端口号为18080
# 参数2含义:指定历史服务器日志存储路径
# 参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
4、启动历史服务

hui@hadoop103 spark_standalone]$ sbin/start-history-server.sh
[hui@hadoop103 spark_standalone]$ jps.sh
------------------- hui@hadoop103 --------------
8292 NameNode
8054 Worker
7979 Master
9117 HistoryServer
9167 Jps
8431 DataNode
------------------- hui@hadoop104 --------------
5398 Jps
5127 DataNode
4984 Worker
------------------- hui@hadoop105 --------------
2529 Worker
3153 Jps
2743 SecondaryNameNode
2670 DataNode
5、再次运行

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop103:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.12-3.0.3.jar \
10
6、查看Spark历史服务地址:hadoop103:18080

2.4、配置高可用(HA)

1、配置高可用(HA)
  

2、配置高可用

先停止集群
[hui@hadoop103 spark_standalone]$ sbin/stop-all.sh 

启动zk 

[hui@hadoop103 spark_standalone]$ zk.sh start
修改spark-env.sh文件添加如下配置:

[hui@hadoop103 spark_standalone]$ cd conf/
[hui@hadoop103 conf]$ vim spark-env.sh
#注释以下两条配置
#SPARK_MASTER_HOST=hadoop103
#SPARK_MASTER_PORT=7077
#添加上如下内容。配置由Zookeeper管理Master,在Zookeeper节点中自动创建/spark目录,用于管理:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop103,hadoop104,hadoop105
-Dspark.deploy.zookeeper.dir=/spark"
#添加如下代码 Zookeeper3.5的AdminServer默认端口是8080,和Spark的WebUI冲突
export SPARK_MASTER_WEBUI_PORT=8989
分发
[hui@hadoop103 conf]$ sxync.sh  spark-env.sh
在hadoop103上启动全部节点
[hui@hadoop103 spark_standalone]$ sbin/start-all.sh 
在hadoop104上单独启动master节点

[hui@hadoop104 spark_standalone]$ sbin/start-master.sh 

查看进程

[hui@hadoop103 spark_standalone]$ jps.sh
------------------- hui@hadoop103 --------------
8292 NameNode
9701 Worker
9625 Master
9117 HistoryServer
9533 QuorumPeerMain
9791 Jps
8431 DataNode
------------------- hui@hadoop104 --------------
5524 QuorumPeerMain
5127 DataNode
5721 Jps
5598 Worker
5663 Master
------------------- hui@hadoop105 --------------
3490 Jps
2743 SecondaryNameNode
3434 Worker
2670 DataNode
3342 QuorumPeerMain

运行官方wordcount

[hui@hadoop103 spark_standalone]$ hadoop fs -ls /input
-rw-r--r--   3 hui supergroup         24 2022-05-21 10:55 /input/1.txt

执行程序

bin/spark-shell \
--master spark://hadoop103:7077,hadoop104:7077 \
--executor-memory 2g \
--total-executor-cores 2

参数说明

--master spark://hadoop103:7077指定要连接的集群的master

运行wordcount

scala> sc.textFile("hdfs://hadoop103:9000/input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res0: Array[(String, Int)] = Array((wdh01,1), (hello,2), (spark,1))    

高可用测试:kill hadoop103 的master

[hui@hadoop103 logs]$ jps
8292 NameNode
9956 CoarseGrainedExecutorBackend
9701 Worker
10069 Jps
9880 SparkSubmit
9625 Master
9117 HistoryServer
9533 QuorumPeerMain
8431 DataNod
[hui@hadoop103 logs]$ kill -9 9625

窗口仍然可用

scala> 22/05/21 14:33:35 WARN client.StandaloneAppClient$ClientEndpoint: Connection to hadoop103:7077 failed; waiting for master to reconnect...
22/05/21 14:33:35 WARN cluster.StandaloneSchedulerBackend: Disconnected from Spark cluster! Waiting for reconnection...
22/05/21 14:33:35 WARN client.StandaloneAppClient$ClientEndpoint: Connection to hadoop103:7077 failed; waiting for master to reconnect...
scala> sc.textFile("hdfs://hadoop103:9000/input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res1: Array[(String, Int)] = Array((wdh01,1), (hello,2), (spark,1))  

此时查看 hadoop104 的master 

http:/adoop104:8989/

单独启动hadoop103的master

[hui@hadoop103 spark_standalone]$ sbin/start-master.sh 
hadoop103 master 现在是备份状态,只有现在kill hadoop104 的master,才会回到正常状态

  

2.5、运行模式说明

Spark有standalone-client和standalone-cluster两种模式,主要区别在于:Driver程序的运行节点。
1、client 模式:

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop103:7077,hadoop104:7077 \
--executor-memory 2G \
--total-executor-cores 2 \
--deploy-mode client \
./examples/jars/spark-examples_2.12-3.0.3.jar \
10
--deploy-mode client,表示Driver程序运行在本地客户端;其实默认模式就是 client 模式

 

2、cluster 模式

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop103:7077,hadoop104:7077 \
--executor-memory 2G \
--total-executor-cores 2 \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.3.jar \
10
--deploy-mode cluster,表示Driver程序运行在集群

 

查看http://hadoop104:8989/页面,点击Completed Drivers里面的Worker

跳转到Spark Worker页面,点击Finished Drivers中Logs下面的stdout

运行结果

注意:在测试Standalone模式,cluster运行流程的时候,阿里云用户访问不到Worker,因为Worker是从Master内部跳转的,这是正常的,实际工作中我们不可能通过客户端访问的,这些对口对外都会禁用,需要的时候会通过授权到Master访问Worker。

posted @ 2022-05-24 15:52  晓枫的春天  阅读(1776)  评论(0编辑  收藏  举报