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
|
[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。