1. 程式人生 > 其它 >Spark 執行模式(Standalone 模式)

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埠)目前還看不到任何任務的執行資訊。 http://hadoop103:8080/ 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。