陜西網(wǎng)頁(yè)制作seo挖關(guān)鍵詞
1 Spark的部署方式介紹
? Spark部署模式分為Local模式(本地模式)和集群模式(集群模式又分為Standalone模式、Yarn模式和Mesos模式)
1.1 Local模式
Local模式常用于本地開(kāi)發(fā)程序與測(cè)試,如在idea中
1.2 Standalone模式
? Standalone模式被稱為集群?jiǎn)螜C(jī)模式。Spark與Hadoop1.0版本有點(diǎn)類似,Spark本身自帶了完整的資源調(diào)度管理服務(wù)(但這不是它的強(qiáng)項(xiàng),因?yàn)镾park主要是一個(gè)計(jì)算框架),可以獨(dú)立部署到集群中,無(wú)須依賴任何其他的資源管理系統(tǒng),在該模式下,Spark集群架構(gòu)為主從模式,即一臺(tái)Master節(jié)點(diǎn)與多臺(tái)Slave節(jié)點(diǎn),Slave節(jié)點(diǎn)啟動(dòng)的進(jìn)程名稱為Worker,此時(shí)集群會(huì)存在單點(diǎn)故障。(單點(diǎn)故障可利用Spark HA 與zookeeper解決)
這種模式下, Driver 和 Worker 是啟動(dòng)在節(jié)點(diǎn)上的進(jìn)程,運(yùn)行在JVM 中的進(jìn)程
- Driver 與集群節(jié)點(diǎn)之間有頻繁的通信。
- Driver 負(fù)責(zé)任務(wù)(task)的分發(fā)和結(jié)果的回收 即任務(wù)的調(diào)度。如果task的計(jì)算結(jié)果非常大就不要回收了。會(huì)造成OOM
- Worker 是 Standalone 資源調(diào)度框架里面資源管理的從節(jié)點(diǎn),也是JVM進(jìn)程
- 管理每個(gè)節(jié)點(diǎn)中的資源狀態(tài),啟動(dòng)進(jìn)程,執(zhí)行Task任務(wù)
- Master 是 Standalone 資源調(diào)度框架里面資源管理的主節(jié)點(diǎn),也是JVM進(jìn)程
- 管理所有資源狀態(tài)
簡(jiǎn)單來(lái)說(shuō):
? Master類似于 yarn的 RM,Driver類似于 yarn的 AM(ApplicationMaster),Slaves類似于 yarn的 NM
? Worker、Master是常駐進(jìn)程、Driver是當(dāng)有任務(wù)來(lái)時(shí)才會(huì)啟動(dòng)
1.3 Yarn模式
? Yarn模式被稱為 Spark on Yarn 模式,即把Spark作為一個(gè)客戶端,將作業(yè)提交給Yarn服務(wù),由于在生產(chǎn)環(huán)境中,很多時(shí)候要與Hadoop使用同一個(gè)集群,因此采用Yarn來(lái)管理資源調(diào)度,可以有效提高資源利用率
Yarn模式又分為Yarn Cluster模式、Yarn Client模式
- Yarn Cluster:用于生產(chǎn)環(huán)境,所以的資源調(diào)度和計(jì)算都在集群上運(yùn)行
- Yarn Client:用于交互、調(diào)試環(huán)境
若要基于 yarn 來(lái)進(jìn)行資源調(diào)度,必須實(shí)現(xiàn) ApplicationMaster 接口,Spark 實(shí)現(xiàn)了這個(gè)接口,所以可以基于 Yarn 來(lái)進(jìn)行資源調(diào)度
1.4 Mesos模式
? Mesos模式被稱為 Spark on Mesos 模式,Mesos與Yarn同樣是一款資源調(diào)度管理系統(tǒng),可以為Spark提供服務(wù),由于Spark與Mesos存在密切的關(guān)系,因此在設(shè)計(jì)Spark框架時(shí)充分考慮到了對(duì)Mesos的集成,但如果同時(shí)運(yùn)行Hadoop和Spark,從兼容性的角度來(lái)看,Spark on Yarn是更好的選擇。
1.5 小結(jié)
Spark作為一個(gè)數(shù)據(jù)處理框架和計(jì)算引擎,被設(shè)計(jì)在所有常見(jiàn)的集群環(huán)境中運(yùn)行, 在國(guó)內(nèi)工作中主流的環(huán)境為Yarn,不過(guò)逐漸容器式環(huán)境也慢慢流行起來(lái)。接下來(lái),我們就分別看看不同環(huán)境下Spark的運(yùn)行
2 Spark環(huán)境部署
2.1 Local模式
Local模式,就是不需要其他任何節(jié)點(diǎn)資源就可以在本地執(zhí)行Spark代碼的環(huán)境,一般用于教學(xué),調(diào)試,演示等
這種模式最為簡(jiǎn)單,解壓即用不需要進(jìn)入任何配置
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)啟動(dòng)spark shell
命令
spark-shell -master local | local[k]| local[*] # 建議 k>= 2
其中k表示啟動(dòng)線程數(shù)目(CPU Core核數(shù))
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. |
# 進(jìn)入解壓縮后的路徑,執(zhí)行如下指令
[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)輸入網(wǎng)址進(jìn)入web ui監(jiān)控頁(yè)面訪問(wèn)
http://kk01:4040
注意:
? 這里的kk01是在hosts文件配置了ip地址映射,如果沒(méi)有,默認(rèn)填寫ip
4)退出Local本地模式
兩種方式:
1、直接按ctrl+c 或 ctrl+d
2、輸入Scala指令
:quit
5)提交應(yīng)用
[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 表示要執(zhí)行的程序的主類(可以可以根據(jù)我們自己編寫的程序做出相應(yīng)修改)
# --master local[2] 部署模式,默認(rèn)為本地模式,數(shù)字表示分配的虛擬cpu核數(shù)量
# spark-examples_2.13-3.2.0.jar 運(yùn)行的應(yīng)用類所在的jar包(實(shí)際使用時(shí)可設(shè)定為我們自己打的jar報(bào))
# 數(shù)字10表示程序的入口參數(shù),用于設(shè)定當(dāng)前應(yīng)用的任務(wù)數(shù)量
2.2 Standalone模式
? 真實(shí)工作中還是要將應(yīng)用提交到對(duì)應(yīng)的集群中去執(zhí)行,這里我們來(lái)看看只使用Spark自身節(jié)點(diǎn)運(yùn)行的集群模式,也就是我們所謂的獨(dú)立部署(Standalone)模式。
Spark的 Standalone 模式體現(xiàn)了經(jīng)典的master-slave模式
注意:
? 搭建集群之前需要確認(rèn) jdk版本為8
0)集群規(guī)劃
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)修改配置文件
- 進(jìn)入spark-standalone/conf目錄,修改workers.template文件名為workes(保守做法可以選擇復(fù)制)
[nhk@kk01 software]$ cd spark-standalone/conf/
[nhk@kk01 conf]$ cp workers.template workers
- 修改workes文件,添加worker節(jié)點(diǎn)
[nhk@kk01 conf]$ vim workers
# 將文件內(nèi)容替換為如下kk01
kk02
kk03
- 修改spark-env.sh.template文件名為spark-env.sh (保守做法可以選擇復(fù)制)
[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環(huán)境變量和集群對(duì)應(yīng)的master節(jié)點(diǎn)
[nhk@kk01 conf]$ vim spark-env.sh
# 在文件末尾添加如下內(nèi)容# 配置 jdk 環(huán)境
export JAVA_HOME=/opt/software/jdk1.8.0_152
# 配置 Master 的 IP 端口
export SPARK_MASTER_HOST=kk01
export SPARK_MASTER_PORT=7077# 注意:7077端口,相當(dāng)于kk01內(nèi)部通信的8020端口(此處的端口需要確認(rèn)自己的Hadoop)
3)分發(fā)spark-standalone目錄
# 使用scp或rsync分發(fā),scp或rsync區(qū)別在于 scp是完全拷貝 rsync只對(duì)差異文件進(jìn)行拷貝# 由于是第一次配置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/# 如果定義了分發(fā)腳本 xsync ,則使用自定義腳本
[nhk@kk01 software]$ xsync spark-standalone
4)啟動(dòng)集群
[nhk@kk01 spark-standalone]$ sbin/start-all.sh
5)查看服務(wù)器進(jìn)程
[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資源監(jiān)控Web UI界面
http://kk01:8080
注意:
? kk01這里默認(rèn)是填寫服務(wù)器ip,但是我們?cè)趆osts文件里映射了ip,因此填主機(jī)名也可以
7)提交應(yīng)用(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 表示要執(zhí)行的程序的主類(可以可以根據(jù)我們自己編寫的程序做出相應(yīng)修改)
# --master spark://kk01:7077 獨(dú)立部署模式,連接到Spark集群
# spark-examples_2.13-3.2.0.jar 運(yùn)行的應(yīng)用類所在的jar包
# 數(shù)字10表示程序的入口參數(shù),用于設(shè)定當(dāng)前應(yīng)用的任務(wù)數(shù)量
-
執(zhí)行任務(wù)時(shí),會(huì)產(chǎn)生多個(gè)Java進(jìn)程
? CoarseGrainedExecutorBackend 執(zhí)行節(jié)點(diǎn)進(jìn)程
? SparkSumbit 提交節(jié)點(diǎn)進(jìn)程
[nhk@kk01 ~]$ jps 2611 DataNode 3027 ResourceManager 3171 NodeManager 3687 Master 3783 Worker 2473 NameNode 3581 JobHistoryServer 4205 Jps 3998 SparkSubmit
-
執(zhí)行任務(wù)時(shí),默認(rèn)采用服務(wù)器集群節(jié)點(diǎn)的總核數(shù),每個(gè)節(jié)點(diǎn)內(nèi)存1024M。
任務(wù)執(zhí)行流程
- client 模式提交任務(wù)后,會(huì)在客戶端啟動(dòng) Driver進(jìn)程
- Driver 回向 Master 申請(qǐng)啟動(dòng) Application 啟動(dòng)的資源
- 資源申請(qǐng)成功,Driver 端將 task 分發(fā)到worker 端執(zhí)行,啟動(dòng) executor進(jìn)程(任務(wù)的分發(fā))
- Worker 端(executor進(jìn)程) 將task 執(zhí)行結(jié)果返回到 Driver 端(任務(wù)結(jié)果的回收)
提交參數(shù)說(shuō)明
在提交應(yīng)用中,一般會(huì)同時(shí)一些提交參數(shù)
bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]
參數(shù) | 解釋 | 可選值舉例 |
---|---|---|
–class | Spark程序中包含主函數(shù)的類 | |
–master | Spark程序運(yùn)行的模式(環(huán)境) | 模式:local[*]、spark://linux1:7077、Yarn |
–executor-memory 1G | 指定每個(gè)executor可用內(nèi)存為1G (這里越大計(jì)算能力越強(qiáng)) | |
–total-executor-cores 2 | 指定所有executor使用的cpu核數(shù)為2個(gè) | |
–executor-cores | 指定每個(gè)executor使用的cpu核數(shù) | |
application-jar | 打包好的應(yīng)用jar,包含依賴。 這個(gè)URL在集群中全局可見(jiàn)。 比如hdfs:// 共享存儲(chǔ)系統(tǒng)。 如果是file://path,那么所有的節(jié)點(diǎn)的path都包含同樣的jar | |
application-arguments | 傳給main()方法的參數(shù) |
總結(jié):
? **client模式適用于測(cè)試調(diào)試程序。**Driver進(jìn)程是在客戶端啟動(dòng)的,這里的客戶端指的是提交應(yīng)用程序的當(dāng)前節(jié)點(diǎn)。在Driver端可以看到 task執(zhí)行的情況
? **生成環(huán)境中不能使用client模式。**因?yàn)?#xff1a;假設(shè)要提交100個(gè)application 到集群運(yùn)行,Driver每次都會(huì)在 client端啟動(dòng),那么就會(huì)導(dǎo)致客戶端100網(wǎng)卡流量暴增的問(wèn)題。
8)提交應(yīng)用(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配置歷史服務(wù)器
? 由于spark-shell停止掉后,集群監(jiān)控kk01:4040頁(yè)面就看不到歷史任務(wù)的運(yùn)行情況,所以開(kāi)發(fā)時(shí)都配置歷史服務(wù)器記錄任務(wù)運(yùn)行情況。(說(shuō)白點(diǎn),就是Driver節(jié)點(diǎn)停止了)
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文件,配置日志存儲(chǔ)路徑
[nhk@kk01 conf]$ vim spark-defaults.conf
# 在文件末尾加入如下內(nèi)容spark.eventLog.enabled true
spark.eventLog.dir hdfs://kk01:8020/spark-history
注意:
? 需要啟動(dòng)hadoop集群,HDFS上的spark-history 目錄需要提前存在。
3)在創(chuàng)建HDFS上的spark-history 目錄
[nhk@kk01 conf]$ start-dfs.sh # Hadoop配置了環(huán)境變量,腳本全局可用
[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 # 在文件中添加如下內(nèi)容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"# 參數(shù)說(shuō)明
# 參數(shù)1含義:WEB UI訪問(wèn)的端口號(hào)為18080
# 參數(shù)2含義:指定歷史服務(wù)器日志存儲(chǔ)路徑
# 參數(shù)3含義:指定保存Application歷史記錄的個(gè)數(shù),如果超過(guò)這個(gè)值,舊的應(yīng)用程序信息將被刪除,這個(gè)是內(nèi)存中的應(yīng)用數(shù),而不是頁(yè)面上顯示的應(yīng)用數(shù)
5)分發(fā)配置文件
# 使用rsync命名更新差異文件 # 因?yàn)槲覀冎桓牧薱onf目錄下的文件,因此只分發(fā)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/# 參數(shù)說(shuō)明
# -a 歸檔拷貝
# -v 顯示拷貝過(guò)程
6)重新啟動(dòng)集群和歷史服務(wù)
# 先確保hdfs集群、spark集群關(guān)閉
[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)查看進(jìn)程
[nhk@kk01 spark-standalone]$ jps
5921 Master
6052 Worker
5558 DataNode
5371 NameNode
6235 Jps
6174 HistoryServer
8)重新執(zhí)行任務(wù)
[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)查看歷史服務(wù)
確保歷史服務(wù)可用
http://kk01:18080/
2.4 standalone配置高可用(HA)基于Zookeeper
當(dāng)前集群中的Master節(jié)點(diǎn)只有一個(gè),所以會(huì)存在單點(diǎn)故障問(wèn)題。所以為了解決單點(diǎn)故障問(wèn)題,需要在集群中配置多個(gè)Master節(jié)點(diǎn),一旦處于活動(dòng)狀態(tài)的Master發(fā)生故障時(shí),由備用Master提供服務(wù),保證作業(yè)可以繼續(xù)執(zhí)行。這里的高可用一般采用Zookeeper設(shè)置
集群規(guī)劃
kk01 Worker ZooKeeper Masterkk02 Worker ZooKeeper Masterkk03 Worker ZooKeeper
1)停止集群(可選)
在確保hdfs集群、spark集群停止的情況下,才開(kāi)始配置HA
[nhk@kk01 spark-standalone]$ sbin/stop-all.sh
[nhk@kk01 spark-standalone]$ stop-dfs.sh
2)啟動(dòng)Zookeeper集群
[nhk@kk01 spark-standalone]$ zkServer.sh start
[nhk@kk02 ~]$ zkServer.sh start
[nhk@kk03 ~]$ zkServer.sh start# 也可以使用自定義腳本啟動(dòng)集群(如果你定義了的話)
[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注釋如下內(nèi)容:
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077添加如下內(nèi)容:
#Master監(jiān)控頁(yè)面默認(rèn)訪問(wèn)端口為8080,但是可能會(huì)和Zookeeper沖突,所以改成8989,也可以自定義,訪問(wèn)UI監(jiān)控頁(yè)面時(shí)請(qǐng)注意
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監(jiān)控頁(yè)面默認(rèn)訪問(wèn)端口為8080,但是可能會(huì)和Zookeeper沖突,所以改成8989,也可以自定義,訪問(wèn)UI監(jiān)控頁(yè)面時(shí)請(qǐng)注意
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)分發(fā)配置文件
[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)啟動(dòng)集群
啟動(dòng)spark集群前先啟動(dòng)hdfs集群,確定歷史服務(wù)器正常,當(dāng)然也需要確保zookeeper集群正常啟動(dòng)
[nhk@kk01 conf]$ start-dfs.sh # 啟動(dòng)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 # 啟動(dòng)歷史服務(wù)進(jìn)程
6) 啟動(dòng)kk02的單獨(dú)Master節(jié)點(diǎn),此時(shí)kk02節(jié)點(diǎn)Master狀態(tài)處于備用狀態(tài)
[nhk@kk02 ~]$ cd /opt/software/spark-standalone/
[nhk@kk02 spark-standalone]$ sbin/start-master.sh
7)查看進(jìn)程
[nhk@kk01 spark-standalone]$ jps
7697 NameNode
8385 Worker
8504 Jps
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer # 歷史服務(wù)器進(jìn)程[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)提交應(yīng)用到高可用集群
[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 資源監(jiān)控Web UI
http://kk01:8989/
發(fā)現(xiàn)狀態(tài)為 Status: ALIVE
10)手動(dòng)停止kk01的Master資源監(jiān)控進(jìn)程
[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 資源監(jiān)控Web UI,稍等一段時(shí)間后,kk02節(jié)點(diǎn)的Master狀態(tài)提升為活動(dòng)狀態(tài)
http://kk02:8989/
狀態(tài)變化
? Status:STANDBY ====> Status: ALIVE
2.5 Yarn模式
? 獨(dú)立部署(Standalone)模式由Spark自身提供計(jì)算資源,無(wú)需其他框架提供資源。這種方式降低了和其他第三方資源框架的耦合性,獨(dú)立性非常強(qiáng)。但是你也要記住,**Spark主要是計(jì)算框架,而不是資源調(diào)度框架,所以本身提供的資源調(diào)度并不是它的強(qiáng)項(xiàng),所以還是和其他專業(yè)的資源調(diào)度框架集成會(huì)更靠譜一些。**所以接下來(lái)我們來(lái)學(xué)習(xí)在強(qiáng)大的Yarn環(huán)境下Spark是如何工作的(其實(shí)是因?yàn)樵趪?guó)內(nèi)工作中,Yarn使用的非常多)。
注意:
? Spark on Yarn 不需要單獨(dú)開(kāi)啟spark相關(guān)的進(jìn)程
Spark On Yarn的本質(zhì)
- Master 角色由YARN的 ResourceManager 擔(dān)任
- Worker 角色由YARN的 NodeManager 擔(dān)任
- Driver 角色運(yùn)行在YARN容器內(nèi) 或 提交任務(wù)的客戶端進(jìn)程中
- 真正干活的Executor運(yùn)行在YARN提供的容器內(nèi)
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
修改這個(gè)配置文件的原因是因?yàn)?#xff1a;
[nhk@kk01 hadoop]$ pwd
/opt/software/hadoop-3.1.3/etc/hadoop
[nhk@kk01 hadoop]$ vim yarn-site.xml
# 添加如下內(nèi)容<!-- 是否將對(duì)容器實(shí)施物理內(nèi)存限制 生產(chǎn)中可產(chǎn)生改配置-->
<!--是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的物理內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true -->
<property><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value>
</property><!-- 是否將對(duì)容器實(shí)施虛擬內(nèi)存限制 生產(chǎn)中可產(chǎn)生改配置-->
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value>
</property><!-- 開(kāi)啟日志聚集-->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property>
<!-- 設(shè)置yarn歷史服務(wù)器地址-->
<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>
<!-- 歷史日志保存的時(shí)間 7天-->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>
4)同步修改的文件至所有服務(wù)器
[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
當(dāng)Spark Application連接到y(tǒng)arn集群上運(yùn)行時(shí),需要設(shè)置環(huán)境變量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
# 添加如下內(nèi)容export JAVA_HOME=/opt/software/jdk1.8.0_152HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
# 下面這個(gè)也可以不配,因?yàn)楹蜕厦嬉粯?/span>
YARN_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
6)啟動(dòng)HDFS集群、YARN集群
# 我們配置過(guò)Hadoop環(huán)境變量,因此可以直接使用腳本一鍵啟動(dòng)
[nhk@kk01 conf]$ start-dfs.sh
[nhk@kk01 conf]$ start-yarn.sh
7)提交應(yīng)用(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頁(yè)面,查看歷史頁(yè)面,查看任務(wù)調(diào)度情況,點(diǎn)擊History,查看歷史頁(yè)面
yarn client 任務(wù)執(zhí)行流程
- 客戶端提交一個(gè) Application,在客戶端會(huì)啟動(dòng)一個(gè) Driver進(jìn)程
- 應(yīng)用程序啟動(dòng)后會(huì)向 RM(ResourceMananger)(相當(dāng)于 standalone模式下的master進(jìn)程)發(fā)送請(qǐng)求,啟動(dòng)AM(ApplicationMaster)
- RM收到請(qǐng)求,隨機(jī)選擇一臺(tái) NM(NodeManager)啟動(dòng)AM。這里的NM相當(dāng)于standalone中的Worker進(jìn)程
- AM啟動(dòng)后,會(huì)向 RM 請(qǐng)求一批 container資源,用于啟動(dòng)Executor
- RM會(huì)找到一批 NM(包含container)返回給AM,用于啟動(dòng)Executor
- AM 會(huì)向 NM發(fā)送命令啟動(dòng) Executor
- Executor啟動(dòng)后,會(huì)方向注冊(cè)給 Driver,Driver發(fā)送 task 到 Executor ,執(zhí)行情況和結(jié)果返回給Driver端
總結(jié):
? yarn-client模式同樣是適用于測(cè)試,因?yàn)镈river 運(yùn)行在本地,Driver會(huì)與yarn集群中的Executor 進(jìn)行大量的通信,提交的 application 過(guò)多同樣會(huì)造成客戶機(jī)網(wǎng)卡流量的大量增加
? ApplicationMaster(executorLauncher)在次模式中的作用:
- 為當(dāng)前的 Application 申請(qǐng)資源
- 給 NodeManager 發(fā)送消息啟動(dòng) Executor
注意:ApplicationMaster 在此模式下有 launchExecutor和申請(qǐng)資源的功能,沒(méi)有作業(yè)調(diào)度的功能
2.6 Yarn配置歷史服務(wù)器
? 配置了 historyServer,停止程序后,可以在web ui 中 Completed Application 對(duì)應(yīng)的 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文件**,配置日志存儲(chǔ)路徑**
[nhk@kk01 conf]$ vim spark-defaults.conf
# 在文件末尾加入如下內(nèi)容# 開(kāi)啟記錄事件日志的功能
spark.eventLog.enabled true
# 設(shè)置事件日志存儲(chǔ)的路徑
spark.eventLog.dir hdfs://kk01:8020/spark-history
spark.history.fs.logDirectory hdfs://kk01:8020/spark-history # 日志優(yōu)化選項(xiàng),壓縮日志
spark.eventLog.compress true
注意:
? 需要啟動(dòng)hadoop集群,HDFS上的spark-history 目錄需要提前存在。
3)在創(chuàng)建HDFS上的directory目錄
[nhk@kk01 conf]$ start-dfs.sh # Hadoop配置了環(huán)境變量,腳本全局可用
[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 # 在文件中添加如下內(nèi)容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"# 參數(shù)說(shuō)明
# 參數(shù)1含義:WEB UI訪問(wèn)的端口號(hào)為18080
# 參數(shù)2含義:指定歷史服務(wù)器日志存儲(chǔ)路徑
# 參數(shù)3含義:指定保存Application歷史記錄的個(gè)數(shù),如果超過(guò)這個(gè)值,舊的應(yīng)用程序信息將被刪除,這個(gè)是內(nèi)存中的應(yīng)用數(shù),而不是頁(yè)面上顯示的應(yīng)用數(shù)
5)修改spark-defaults.conf配置SparkHistoryServer
[nhk@kk01 conf]$ vim spark-defaults.conf
# 添加如下配置spark.yarn.historyServer.address=kk01:18080
spark.history.ui.port=18080
6)啟動(dòng)歷史服務(wù)器
[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 # 這個(gè)是Hadoop的歷史服務(wù)器
4677 Jps
4605 HistoryServer # 這個(gè)是Spark的歷史服務(wù)器
3134 NodeManager
7)重新提交應(yīng)用(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頁(yè)面查看日志
http://kk01:18080/
配置依賴Spark jar包(優(yōu)化配置)
當(dāng)Spark Application應(yīng)用提交運(yùn)行在YARN上時(shí),默認(rèn)情況下,每次提交應(yīng)用都需要將Spark相關(guān)jar包上傳到Y(jié)ARN集群上,為了節(jié)省提交時(shí)間和存儲(chǔ)空間,將Spark相關(guān)jar包上傳到HDFS目錄,設(shè)置屬性告知Spark Application應(yīng)用
說(shuō)明:
? 該項(xiàng)配置屬于優(yōu)化配置,可酌情考慮配置與否
上傳Spark jar包前需要確保HDFS集群開(kāi)啟
# 在HDFS上創(chuàng)建目錄,用于存放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 相關(guān)jar包存儲(chǔ)在HDFS上的位置信息
[nhk@kk01 ~]$ vim /opt/software/spark-yarn/conf/spark-defaults.conf
# 添加如下配置spark.yarn.jars hdfs://kk01:8020/sparkjars/*
同步配置到所有節(jié)點(diǎn)
[nhk@kk01 ~]$ sudo /home/nhk/bin/xsync /opt/software/spark-yarn/
3 部署模式對(duì)比
模式 | Spark安裝機(jī)器數(shù) | 需啟動(dòng)的進(jìn)程 | 所屬者 | 應(yīng)用場(chǎng)景 |
---|---|---|---|---|
Local | 1 | 無(wú) | Spark | 測(cè)試 |
Standalone | 3 | Master及Worker | Spark | 單獨(dú)部署 |
Yarn | 1 | Yarn及HDFS | Hadoop | 混合部署 |
4 常見(jiàn)端口號(hào)
-
Spark查看當(dāng)前Spark-shell運(yùn)行任務(wù)情況端口號(hào):4040(計(jì)算)
-
Spark Master內(nèi)部通信服務(wù)端口號(hào):7077
-
Standalone模式下,Spark Master Web端口號(hào):8080(資源)
-
Spark歷史服務(wù)器端口號(hào):18080
-
Hadoop YARN任務(wù)運(yùn)行情況查看端口號(hào):8088