1 Spark的部署方式介紹
? Spark部署模式分為Local模式(本地模式)和集群模式(集群模式又分為Standalone模式、Yarn模式和Mesos模式)
1.1 Local模式
Local模式常用于本地開發程序與測試,如在idea中
1.2 Standalone模式
? Standalone模式被稱為集群單機模式。Spark與Hadoop1.0版本有點類似,Spark本身自帶了完整的資源調度管理服務(但這不是它的強項,因為Spark主要是一個計算框架),可以獨立部署到集群中,無須依賴任何其他的資源管理系統,在該模式下,Spark集群架構為主從模式,即一臺Master節點與多臺Slave節點,Slave節點啟動的進程名稱為Worker,此時集群會存在單點故障。(單點故障可利用Spark HA 與zookeeper解決)
這種模式下, Driver 和 Worker 是啟動在節點上的進程,運行在JVM 中的進程
- Driver 與集群節點之間有頻繁的通信。
- Driver 負責任務(task)的分發和結果的回收 即任務的調度。如果task的計算結果非常大就不要回收了。會造成OOM
- Worker 是 Standalone 資源調度框架里面資源管理的從節點,也是JVM進程
- 管理每個節點中的資源狀態,啟動進程,執行Task任務
- Master 是 Standalone 資源調度框架里面資源管理的主節點,也是JVM進程
- 管理所有資源狀態
簡單來說:
? Master類似于 yarn的 RM,Driver類似于 yarn的 AM(ApplicationMaster),Slaves類似于 yarn的 NM
? Worker、Master是常駐進程、Driver是當有任務來時才會啟動
1.3 Yarn模式
? Yarn模式被稱為 Spark on Yarn 模式,即把Spark作為一個客戶端,將作業提交給Yarn服務,由于在生產環境中,很多時候要與Hadoop使用同一個集群,因此采用Yarn來管理資源調度,可以有效提高資源利用率
Yarn模式又分為Yarn Cluster模式、Yarn Client模式
- Yarn Cluster:用于生產環境,所以的資源調度和計算都在集群上運行
- Yarn Client:用于交互、調試環境
若要基于 yarn 來進行資源調度,必須實現 ApplicationMaster 接口,Spark 實現了這個接口,所以可以基于 Yarn 來進行資源調度
1.4 Mesos模式
? Mesos模式被稱為 Spark on Mesos 模式,Mesos與Yarn同樣是一款資源調度管理系統,可以為Spark提供服務,由于Spark與Mesos存在密切的關系,因此在設計Spark框架時充分考慮到了對Mesos的集成,但如果同時運行Hadoop和Spark,從兼容性的角度來看,Spark on Yarn是更好的選擇。
1.5 小結
Spark作為一個數據處理框架和計算引擎,被設計在所有常見的集群環境中運行, 在國內工作中主流的環境為Yarn,不過逐漸容器式環境也慢慢流行起來。接下來,我們就分別看看不同環境下Spark的運行
2 Spark環境部署
2.1 Local模式
Local模式,就是不需要其他任何節點資源就可以在本地執行Spark代碼的環境,一般用于教學,調試,演示等
這種模式最為簡單,解壓即用不需要進入任何配置
1)將壓縮包上傳至Linux并解壓到指定目錄
[nhk@kk01 opt]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
[nhk@kk01 opt]$ cd /opt/software/
[nhk@kk01 software]$ mv spark-3.2.0-bin-hadoop3.2-scala2.13 spark-local
2)配置文件spark-env.sh
[nhk@kk01 conf]$ pwd
/opt/software/spark-local/conf
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
[nhk@kk01 conf]$ vim spark-env.sh
# 添加如下配置JAVA_HOME=/opt/software/jdk1.8.0_152
SCALA_HOME=/opt/software/scala-2.13.5HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
3)啟動spark shell
命令
spark-shell -master local | local[k]| local[*] # 建議 k>= 2
其中k表示啟動線程數目(CPU Core核數)
Value | |
---|---|
local | Runs Spark locally with one worker thread. There will be no multiple threads running in parallel |
local[k] | Runs Spark locally with k number of threads.( K is ideally the number of cores in your machine.) |
local[*] | Runs Spark locally with a number of worker threads that equals the number of logical cores in your machine. |
# 進入解壓縮后的路徑,執行如下指令
[nhk@kk01 software]$ cd spark-local/
[nhk@kk01 spark-local]$ bin/spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to____ __/ __/__ ___ _____/ /___\ \/ _ \/ _ `/ __/ '_//___/ .__/\_,_/_/ /_/\_\ version 3.2.0/_/Using Scala version 2.13.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_152)
Type in expressions to have them evaluated.
Type :help for more information.
23/04/13 07:08:48 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://kk01:4040
Spark context available as 'sc' (master = local[*], app id = local-1681384129891).
Spark session available as 'spark'.scala>
3)輸入網址進入web ui監控頁面訪問
http://kk01:4040
注意:
? 這里的kk01是在hosts文件配置了ip地址映射,如果沒有,默認填寫ip
4)退出Local本地模式
兩種方式:
1、直接按ctrl+c 或 ctrl+d
2、輸入Scala指令
:quit
5)提交應用
[nhk@kk01 spark-local]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10# --class 表示要執行的程序的主類(可以可以根據我們自己編寫的程序做出相應修改)
# --master local[2] 部署模式,默認為本地模式,數字表示分配的虛擬cpu核數量
# spark-examples_2.13-3.2.0.jar 運行的應用類所在的jar包(實際使用時可設定為我們自己打的jar報)
# 數字10表示程序的入口參數,用于設定當前應用的任務數量
2.2 Standalone模式
? 真實工作中還是要將應用提交到對應的集群中去執行,這里我們來看看只使用Spark自身節點運行的集群模式,也就是我們所謂的獨立部署(Standalone)模式。
Spark的 Standalone 模式體現了經典的master-slave模式
注意:
? 搭建集群之前需要確認 jdk版本為8
0)集群規劃
kk01 | kk02 | kk03 |
---|---|---|
Worker Master | Worker | Worker |
1)將壓縮包上傳至Linux并解壓到指定目錄
[nhk@kk01 opt]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
[nhk@kk01 opt]$ cd /opt/software/
[nhk@kk01 software]$ mv spark-3.2.0-bin-hadoop3.2-scala2.13 spark-standalone
2)修改配置文件
- 進入spark-standalone/conf目錄,修改workers.template文件名為workes(保守做法可以選擇復制)
[nhk@kk01 software]$ cd spark-standalone/conf/
[nhk@kk01 conf]$ cp workers.template workers
- 修改workes文件,添加worker節點
[nhk@kk01 conf]$ vim workers
# 將文件內容替換為如下kk01
kk02
kk03
- 修改spark-env.sh.template文件名為spark-env.sh (保守做法可以選擇復制)
[nhk@kk01 conf]$ cd /opt/software/spark-standalone/conf/
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
- 修改spark-env.sh文件,添加JAVA_HOME環境變量和集群對應的master節點
[nhk@kk01 conf]$ vim spark-env.sh
# 在文件末尾添加如下內容# 配置 jdk 環境
export JAVA_HOME=/opt/software/jdk1.8.0_152
# 配置 Master 的 IP 端口
export SPARK_MASTER_HOST=kk01
export SPARK_MASTER_PORT=7077# 注意:7077端口,相當于kk01內部通信的8020端口(此處的端口需要確認自己的Hadoop)
3)分發spark-standalone目錄
# 使用scp或rsync分發,scp或rsync區別在于 scp是完全拷貝 rsync只對差異文件進行拷貝# 由于是第一次配置standalone模式,因此這里使用scp
[nhk@kk01 software]$ scp -r /opt/software/spark-standalone/ kk02:/opt/software/spark-standalone/
[nhk@kk01 software]$ scp -r /opt/software/spark-standalone/ kk03:/opt/software/spark-standalone/# 如果定義了分發腳本 xsync ,則使用自定義腳本
[nhk@kk01 software]$ xsync spark-standalone
4)啟動集群
[nhk@kk01 spark-standalone]$ sbin/start-all.sh
5)查看服務器進程
[nhk@kk01 spark-standalone]$ jps
2480 Master
2695 Jps
2586 Worker[nhk@kk02 ~]$ jps
2497 Jps
2414 Worker[nhk@kk03 ~]$ jps
2416 Worker
2499 Jps
6)查看Master資源監控Web UI界面
http://kk01:8080
注意:
? kk01這里默認是填寫服務器ip,但是我們在hosts文件里映射了ip,因此填主機名也可以
7)提交應用(client模式)
[root@kk01 spark-standalone]# bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10# --class 表示要執行的程序的主類(可以可以根據我們自己編寫的程序做出相應修改)
# --master spark://kk01:7077 獨立部署模式,連接到Spark集群
# spark-examples_2.13-3.2.0.jar 運行的應用類所在的jar包
# 數字10表示程序的入口參數,用于設定當前應用的任務數量
-
執行任務時,會產生多個Java進程
? CoarseGrainedExecutorBackend 執行節點進程
? SparkSumbit 提交節點進程
[nhk@kk01 ~]$ jps 2611 DataNode 3027 ResourceManager 3171 NodeManager 3687 Master 3783 Worker 2473 NameNode 3581 JobHistoryServer 4205 Jps 3998 SparkSubmit
-
執行任務時,默認采用服務器集群節點的總核數,每個節點內存1024M。
任務執行流程
- client 模式提交任務后,會在客戶端啟動 Driver進程
- Driver 回向 Master 申請啟動 Application 啟動的資源
- 資源申請成功,Driver 端將 task 分發到worker 端執行,啟動 executor進程(任務的分發)
- Worker 端(executor進程) 將task 執行結果返回到 Driver 端(任務結果的回收)
提交參數說明
在提交應用中,一般會同時一些提交參數
bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]
參數 | 解釋 | 可選值舉例 |
---|---|---|
–class | Spark程序中包含主函數的類 | |
–master | Spark程序運行的模式(環境) | 模式:local[*]、spark://linux1:7077、Yarn |
–executor-memory 1G | 指定每個executor可用內存為1G (這里越大計算能力越強) | |
–total-executor-cores 2 | 指定所有executor使用的cpu核數為2個 | |
–executor-cores | 指定每個executor使用的cpu核數 | |
application-jar | 打包好的應用jar,包含依賴。 這個URL在集群中全局可見。 比如hdfs:// 共享存儲系統。 如果是file://path,那么所有的節點的path都包含同樣的jar | |
application-arguments | 傳給main()方法的參數 |
總結:
? **client模式適用于測試調試程序。**Driver進程是在客戶端啟動的,這里的客戶端指的是提交應用程序的當前節點。在Driver端可以看到 task執行的情況
? **生成環境中不能使用client模式。**因為:假設要提交100個application 到集群運行,Driver每次都會在 client端啟動,那么就會導致客戶端100網卡流量暴增的問題。
8)提交應用(cluster模式)
[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
--deploy-mode cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10
2.3 standalone配置歷史服務器
? 由于spark-shell停止掉后,集群監控kk01:4040頁面就看不到歷史任務的運行情況,所以開發時都配置歷史服務器記錄任務運行情況。(說白點,就是Driver節點停止了)
1)修改spark-defaults.conf.template文件名為spark-defaults.conf
[nhk@kk01 conf]$ cd /opt/software/spark-standalone/conf/
[nhk@kk01 conf]$ cp spark-defaults.conf.template spark-defaults.conf
2)修改spark-default.conf文件,配置日志存儲路徑
[nhk@kk01 conf]$ vim spark-defaults.conf
# 在文件末尾加入如下內容spark.eventLog.enabled true
spark.eventLog.dir hdfs://kk01:8020/spark-history
注意:
? 需要啟動hadoop集群,HDFS上的spark-history 目錄需要提前存在。
3)在創建HDFS上的spark-history 目錄
[nhk@kk01 conf]$ start-dfs.sh # Hadoop配置了環境變量,腳本全局可用
[nhk@kk01 conf]$ hadoop fs -mkdir /spark-history
4)修改spark-env.sh文件, 添加日志配置
[nhk@kk01 conf]$ pwd
/opt/software/spark-standalone/conf
[nhk@kk01 conf]$ vim spark-env.sh # 在文件中添加如下內容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"# 參數說明
# 參數1含義:WEB UI訪問的端口號為18080
# 參數2含義:指定歷史服務器日志存儲路徑
# 參數3含義:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數
5)分發配置文件
# 使用rsync命名更新差異文件 # 因為我們只更改了conf目錄下的文件,因此只分發conf目錄即可
[nhk@kk01 spark-standalone]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/[nhk@kk01 spark-standalone]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/# 參數說明
# -a 歸檔拷貝
# -v 顯示拷貝過程
6)重新啟動集群和歷史服務
# 先確保hdfs集群、spark集群關閉
[nhk@kk01 spark-standalone]$ stop-dfs.sh
[nhk@kk01 spark-standalone]$ sbin/stop-all.sh # 重啟
[nhk@kk01 spark-standalone]$ start-dfs.sh
[nhk@kk01 spark-standalone]$ sbin/start-all.sh
[nhk@kk01 spark-standalone]$ sbin/start-history-server.sh
7)查看進程
[nhk@kk01 spark-standalone]$ jps
5921 Master
6052 Worker
5558 DataNode
5371 NameNode
6235 Jps
6174 HistoryServer
8)重新執行任務
[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10
9)查看歷史服務
確保歷史服務可用
http://kk01:18080/
2.4 standalone配置高可用(HA)基于Zookeeper
當前集群中的Master節點只有一個,所以會存在單點故障問題。所以為了解決單點故障問題,需要在集群中配置多個Master節點,一旦處于活動狀態的Master發生故障時,由備用Master提供服務,保證作業可以繼續執行。這里的高可用一般采用Zookeeper設置
集群規劃
kk01 Worker ZooKeeper Masterkk02 Worker ZooKeeper Masterkk03 Worker ZooKeeper
1)停止集群(可選)
在確保hdfs集群、spark集群停止的情況下,才開始配置HA
[nhk@kk01 spark-standalone]$ sbin/stop-all.sh
[nhk@kk01 spark-standalone]$ stop-dfs.sh
2)啟動Zookeeper集群
[nhk@kk01 spark-standalone]$ zkServer.sh start
[nhk@kk02 ~]$ zkServer.sh start
[nhk@kk03 ~]$ zkServer.sh start# 也可以使用自定義腳本啟動集群(如果你定義了的話)
[nhk@kk01 spark-standalone]$ xzk.sh start
3)修改spark-env.sh文件添加如下配置
[nhk@kk01 conf]$ pwd
/opt/software/spark-standalone/conf
[nhk@kk01 conf]$ vim spark-env.sh注釋如下內容:
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077添加如下內容:
#Master監控頁面默認訪問端口為8080,但是可能會和Zookeeper沖突,所以改成8989,也可以自定義,訪問UI監控頁面時請注意
SPARK_MASTER_WEBUI_PORT=8989export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03
-Dspark.deploy.zookeeper.dir=/spark"
參考配置文件如下
export JAVA_HOME=/opt/software/jdk1.8.0_152
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"#Master監控頁面默認訪問端口為8080,但是可能會和Zookeeper沖突,所以改成8989,也可以自定義,訪問UI監控頁面時請注意
SPARK_MASTER_WEBUI_PORT=8989export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03
-Dspark.deploy.zookeeper.dir=/spark"
4)分發配置文件
[nhk@kk01 conf]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/[nhk@kk01 conf]$ rsync -av /opt/software/spark-standalone/conf/ kk03:/opt/software/spark-standalone/conf/
5)啟動集群
啟動spark集群前先啟動hdfs集群,確定歷史服務器正常,當然也需要確保zookeeper集群正常啟動
[nhk@kk01 conf]$ start-dfs.sh # 啟動hdfs集群[nhk@kk01 spark-standalone]$ pwd
/opt/software/spark-standalone
[nhk@kk01 spark-standalone]$ sbin/start-all.sh [nhk@kk01 spark-standalone]$ sbin/start-history-server.sh # 啟動歷史服務進程
6) 啟動kk02的單獨Master節點,此時kk02節點Master狀態處于備用狀態
[nhk@kk02 ~]$ cd /opt/software/spark-standalone/
[nhk@kk02 spark-standalone]$ sbin/start-master.sh
7)查看進程
[nhk@kk01 spark-standalone]$ jps
7697 NameNode
8385 Worker
8504 Jps
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer # 歷史服務器進程[nhk@kk02 spark-standalone]$ jps
4546 DataNode
4315 QuorumPeerMain
5003 Jps
4909 Master # 備份master
4798 Worker[nhk@kk03 ~]$ jps
4688 SecondaryNameNode
4256 Worker
4347 Jps
3884 QuorumPeerMain
4111 DataNodes
8)提交應用到高可用集群
[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077,kk02:7077 \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10
9)查看kk01的Master 資源監控Web UI
http://kk01:8989/
發現狀態為 Status: ALIVE
10)手動停止kk01的Master資源監控進程
[nhk@kk01 spark-standalone]$ jps
7697 NameNode
8385 Worker
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer
8910 Jps
[nhk@kk01 spark-standalone]$ kill -9 8250
11) 查看kk02的Master 資源監控Web UI,稍等一段時間后,kk02節點的Master狀態提升為活動狀態
http://kk02:8989/
狀態變化
? Status:STANDBY ====> Status: ALIVE
2.5 Yarn模式
? 獨立部署(Standalone)模式由Spark自身提供計算資源,無需其他框架提供資源。這種方式降低了和其他第三方資源框架的耦合性,獨立性非常強。但是你也要記住,**Spark主要是計算框架,而不是資源調度框架,所以本身提供的資源調度并不是它的強項,所以還是和其他專業的資源調度框架集成會更靠譜一些。**所以接下來我們來學習在強大的Yarn環境下Spark是如何工作的(其實是因為在國內工作中,Yarn使用的非常多)。
注意:
? Spark on Yarn 不需要單獨開啟spark相關的進程
Spark On Yarn的本質
- Master 角色由YARN的 ResourceManager 擔任
- Worker 角色由YARN的 NodeManager 擔任
- Driver 角色運行在YARN容器內 或 提交任務的客戶端進程中
- 真正干活的Executor運行在YARN提供的容器內
1)上傳并解壓縮文件
將spark-3.2.0-bin-hadoop3.2-scala2.13.tgz文件上傳到linux并解壓縮,放置在指定位置。
[nhk@kk01 ~]$ cd /opt/software/
[nhk@kk01 software]$ rz[nhk@kk01 software]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
2)重命名
[nhk@kk01 software]$ mv spark-3.2.0-bin-hadoop3.2-scala2.13/ spark-yarn
3)修改配置文件yarn-site.xml
修改hadoop配置文件/opt/software/hadoop-3.1.3/etc/hadoop/yarn-site.xml
修改這個配置文件的原因是因為:
[nhk@kk01 hadoop]$ pwd
/opt/software/hadoop-3.1.3/etc/hadoop
[nhk@kk01 hadoop]$ vim yarn-site.xml
# 添加如下內容<!-- 是否將對容器實施物理內存限制 生產中可產生改配置-->
<!--是否啟動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<property><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value>
</property><!-- 是否將對容器實施虛擬內存限制 生產中可產生改配置-->
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value>
</property><!-- 開啟日志聚集-->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property>
<!-- 設置yarn歷史服務器地址-->
<property><name>yarn.log.server.url</name><value>http://kk01:19888/jobhistory/logs</value>
</property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/tmp/logs</value>
</property>
<!-- 歷史日志保存的時間 7天-->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>
4)同步修改的文件至所有服務器
[nhk@kk01 hadoop]$ rsync -av /opt/software/hadoop-3.1.3/etc/hadoop/ kk02:/opt/software/hadoop-3.1.3/etc/hadoop/[nhk@kk01 hadoop]$ rsync -av /opt/software/hadoop-3.1.3/etc/hadoop/ kk03:/opt/software/hadoop-3.1.3/etc/hadoop/
5) 修改conf/spark-env.sh
當Spark Application連接到yarn集群上運行時,需要設置環境變量HADOOP_CONF_DIR指向Hadoop配置目錄,以獲取集群信息
在 $SPARK_HOME/conf/spark-env.sh 文件中
修改conf/spark-env.sh,添加 JAVA_HOME和YARN_CONF_DIR配置
[nhk@kk01 hadoop]$ cd /opt/software/spark-yarn/conf/
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
[nhk@kk01 conf]$ vim spark-env.sh
# 添加如下內容export JAVA_HOME=/opt/software/jdk1.8.0_152HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
# 下面這個也可以不配,因為和上面一樣
YARN_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
6)啟動HDFS集群、YARN集群
# 我們配置過Hadoop環境變量,因此可以直接使用腳本一鍵啟動
[nhk@kk01 conf]$ start-dfs.sh
[nhk@kk01 conf]$ start-yarn.sh
7)提交應用(cluster模式)
[nhk@kk01 spark-yarn]$ pwd
/opt/software/spark-yarn
[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10# 或者[nhk@kk01 spark-yarn]$ pwd
/opt/software/spark-yarn
[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10
查看http://kk01:8088頁面,查看歷史頁面,查看任務調度情況,點擊History,查看歷史頁面
yarn client 任務執行流程
- 客戶端提交一個 Application,在客戶端會啟動一個 Driver進程
- 應用程序啟動后會向 RM(ResourceMananger)(相當于 standalone模式下的master進程)發送請求,啟動AM(ApplicationMaster)
- RM收到請求,隨機選擇一臺 NM(NodeManager)啟動AM。這里的NM相當于standalone中的Worker進程
- AM啟動后,會向 RM 請求一批 container資源,用于啟動Executor
- RM會找到一批 NM(包含container)返回給AM,用于啟動Executor
- AM 會向 NM發送命令啟動 Executor
- Executor啟動后,會方向注冊給 Driver,Driver發送 task 到 Executor ,執行情況和結果返回給Driver端
總結:
? yarn-client模式同樣是適用于測試,因為Driver 運行在本地,Driver會與yarn集群中的Executor 進行大量的通信,提交的 application 過多同樣會造成客戶機網卡流量的大量增加
? ApplicationMaster(executorLauncher)在次模式中的作用:
- 為當前的 Application 申請資源
- 給 NodeManager 發送消息啟動 Executor
注意:ApplicationMaster 在此模式下有 launchExecutor和申請資源的功能,沒有作業調度的功能
2.6 Yarn配置歷史服務器
? 配置了 historyServer,停止程序后,可以在web ui 中 Completed Application 對應的 ApplicationID 中能查看history
1)spark-defaults.conf
修改spark-defaults.conf.template 文件名為 spark-defaults.conf
[nhk@kk01 spark-yarn]$ cd conf/
[nhk@kk01 conf]$ pwd
/opt/software/spark-yarn/conf
[nhk@kk01 conf]$ cp spark-defaults.conf.template spark-defaults.conf
2)修改spark-default.conf文件**,配置日志存儲路徑**
[nhk@kk01 conf]$ vim spark-defaults.conf
# 在文件末尾加入如下內容# 開啟記錄事件日志的功能
spark.eventLog.enabled true
# 設置事件日志存儲的路徑
spark.eventLog.dir hdfs://kk01:8020/spark-history
spark.history.fs.logDirectory hdfs://kk01:8020/spark-history # 日志優化選項,壓縮日志
spark.eventLog.compress true
注意:
? 需要啟動hadoop集群,HDFS上的spark-history 目錄需要提前存在。
3)在創建HDFS上的directory目錄
[nhk@kk01 conf]$ start-dfs.sh # Hadoop配置了環境變量,腳本全局可用
[nhk@kk01 conf]$ hadoop fs -mkdir /spark-history
4)修改spark-env.sh文件, 添加日志配置
[nhk@kk01 conf]$ pwd
/opt/software/spark-yarn/conf
[nhk@kk01 conf]$ vim spark-env.sh # 在文件中添加如下內容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"# 參數說明
# 參數1含義:WEB UI訪問的端口號為18080
# 參數2含義:指定歷史服務器日志存儲路徑
# 參數3含義:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數
5)修改spark-defaults.conf配置SparkHistoryServer
[nhk@kk01 conf]$ vim spark-defaults.conf
# 添加如下配置spark.yarn.historyServer.address=kk01:18080
spark.history.ui.port=18080
6)啟動歷史服務器
[nhk@kk01 conf]$ cd ..
[nhk@kk01 spark-yarn]$ sbin/start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to /opt/software/spark-yarn/logs/spark-nhk-org.apache.spark.deploy.history.HistoryServer-1-kk
01.out[nhk@kk01 spark-yarn]$ jps
2627 NameNode
2771 DataNode
3331 JobHistoryServer # 這個是Hadoop的歷史服務器
4677 Jps
4605 HistoryServer # 這個是Spark的歷史服務器
3134 NodeManager
7)重新提交應用(client模式)
[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10
8)Web頁面查看日志
http://kk01:18080/
配置依賴Spark jar包(優化配置)
當Spark Application應用提交運行在YARN上時,默認情況下,每次提交應用都需要將Spark相關jar包上傳到YARN集群上,為了節省提交時間和存儲空間,將Spark相關jar包上傳到HDFS目錄,設置屬性告知Spark Application應用
說明:
? 該項配置屬于優化配置,可酌情考慮配置與否
上傳Spark jar包前需要確保HDFS集群開啟
# 在HDFS上創建目錄,用于存放jar包
[nhk@kk01 ~]$ hadoop fs -mkdir sparkjars# 上傳$SPARK_HOME/jars中所有的jar包
[nhk@kk01 ~]$ hadoop fs -put /opt/software/spark-yarn/jars/* /sparkjars
在$SPARK_HOME/conf/spark-defaults.conf文件增加spark 相關jar包存儲在HDFS上的位置信息
[nhk@kk01 ~]$ vim /opt/software/spark-yarn/conf/spark-defaults.conf
# 添加如下配置spark.yarn.jars hdfs://kk01:8020/sparkjars/*
同步配置到所有節點
[nhk@kk01 ~]$ sudo /home/nhk/bin/xsync /opt/software/spark-yarn/
3 部署模式對比
模式 | Spark安裝機器數 | 需啟動的進程 | 所屬者 | 應用場景 |
---|---|---|---|---|
Local | 1 | 無 | Spark | 測試 |
Standalone | 3 | Master及Worker | Spark | 單獨部署 |
Yarn | 1 | Yarn及HDFS | Hadoop | 混合部署 |
4 常見端口號
-
Spark查看當前Spark-shell運行任務情況端口號:4040(計算)
-
Spark Master內部通信服務端口號:7077
-
Standalone模式下,Spark Master Web端口號:8080(資源)
-
Spark歷史服務器端口號:18080
-
Hadoop YARN任務運行情況查看端口號:8088