Spark 執行模式(Standalone 模式)
阿新 • • 發佈:2022-05-24
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 slaves4、修改spark-env.sh檔案,新增master節點#刪除最後一行,增加一下三行 hadoop103 hadoop104 hadoop105
[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=70775、分發
[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 Jps7、網頁檢視: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-log3、修改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 DataNode5、再次執行
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 \ 106、檢視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.shhadoop103 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。