Spark詳解(03) - Spark3.0.0運行環境安裝
Spark運行模式
Spark常見部署模式:
Local模式:在本地部署單個Spark服務
所謂的Local模式,就是不需要其他任何節點資源就可以在本地執行Spark代碼的環境,一般用於教學,調試,演示等。
在IDEA中運行代碼的環境稱之為開發環境,和Local模式還是有區別的。
Standalone模式:Spark自帶的任務調度模式。(國內常用)
YARN模式:Spark使用Hadoop的YARN組件進行資源與任務調度。(國內常用)
Windows模式:為了方便在學習測試spark程序,Spark提供了可以在windows系統下啟動本地集群的方式,這樣,在不使用虛擬機或服務器的情況下,也能滿足Spark的基本使用。
Mesos & K8S模式:(了解)。
Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統的內核,在Twitter得到廣泛使用,管理着Twitter超過30,0000台服務器上的應用部署,但是在國內,依然使用着傳統的Hadoop大數據框架,所以國內使用Mesos框架的並不多,但是原理都差不多。
容器化部署是目前業界很流行的一項技術,基於Docker鏡像運行能夠讓用戶更加方便地對應用進行管理和運維。容器管理工具中最為流行的就是Kubernetes(k8s),而Spark也在最近的版本中支持了k8s部署模式。詳情參考官網地址:https://spark.apache.org/docs/latest/running-on-kubernetes.html
Spark安裝地址
文檔查看地址:https://spark.apache.org/docs/3.0.0/
官網下載地址:https://spark.apache.org/downloads.html
鏡像歷史版本下載地址:https://archive.apache.org/dist/spark/
本文使用的版本下載地址:https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz
Local模式安裝(測試環境)
Local模式就是運行在一台計算機上的模式,通常就是用於測試環境。
安裝
Local模式的安裝非常簡單,直接將安裝包上傳到服務器並解壓即可使用,具體操作步驟如下
上傳安裝包park-3.0.0-bin-hadoop3.2.tgz到服務器
[root@hadoop102 software]# tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/
[root@hadoop102 software]# cd /opt/module/
[root@hadoop102 module]# mv spark-3.0.0-bin-hadoop3.2/ spark-local
使用
(1)local: 沒有指定線程數,則所有計算都運行在一個線程當中,沒有任何並行計算
(2)local[K]:指定使用K個Core來運行計算,比如local[2]就是運行2個Core來執行
(3)local[*]:默認模式。自動按照CPU最多核來設置線程數。比如CPU有8核,Spark自動設置8個線程計算。
spark-examples_2.12-3.0.0.jar:要運行的程序jar包名稱;
10:要運行程序的輸入參數(這里表示計算圓周率π的次數,計算次數越多,准確率越高);
[root@hadoop102 spark-local]# bin/spark-submit
官方WordCount案例
在input下創建2個文件1.txt和2.txt,並輸入內容
(2)使用bin/spark-shell命令啟動spark-shell
注意:sc是SparkCore程序的入口;spark是SparkSQL程序入口;master = local[*]表示本地模式運行。
Spark context Web UI available at http://192.168.194.102:4040
Spark context available as 'sc' (master = local[*], app id = local-1646410143774).
再開啟一個hadoop102遠程連接窗口,使用jps查看SparkSubmit進程
spark-submit,是將jar上傳到集群,執行Spark任務;
spark-shell,相當於命令行工具,本身也是一個Application。
(3)登錄hadoop102:4040,查看程序運行情況(注意:spark-shell窗口關閉掉,則hadoop102:4040頁面關閉)
res0: Array[(String, Int)] = Array((hello,4), (spark,2), (hadoop,2))
Standalone(獨立)模式
Standalone模式(也稱獨立模式)是Spark自帶的資源調動引擎,構建一個由Master + Slave構成的Spark集群,Spark運行在集群中。
這個要和Hadoop中的Standalone區別開來。這里的Standalone是指只用Spark來搭建一個集群,不需要借助Hadoop的Yarn和Mesos等其他框架。
安裝
[root@hadoop102 module]# tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/
[root@hadoop102 module]# cd /opt/module/
[root@hadoop102 module]# mv spark-3.0.0-bin-hadoop3.2/ spark-standlone
[root@hadoop102 module]# cd spark-standlone/conf/
[root@hadoop102 conf]# mv slaves.template slaves
[root@hadoop102 conf]# vi slaves
[root@hadoop102 conf]# mv spark-env.sh.template spark-env.sh
[root@hadoop102 conf]# vi spark-env.sh
[root@hadoop102 spark-standlone]# cd ../
[root@hadoop102 spark-standlone]# vi /opt/module/spark-standlone/sbin/spark-config.sh
export JAVA_HOME=export JAVA_HOME=/usr/local/jdk1.8.0_191
如果不配置JAVA_HOME環境變量,在執行sbin/start-all.sh命令啟動spark集群的時候可能會出現JAVA_HOME is not set 異常
[root@hadoop102 conf]# cd /opt/module/
[root@hadoop102 module]# scp -r spark-standlone/ hadoop103:/opt/module/spark-standlone
[root@hadoop102 module]# scp -r spark-standlone/ hadoop104:/opt/module/spark-standlone
[root@hadoop102 module]# cd /opt/module/spark-standlone/
[root@hadoop102 spark-standlone]# sbin/start-all.sh
[root@hadoop102 spark-standlone]# jps
Spark集群測試案例
頁面查看http://hadoop102:8080/,發現執行本次任務,默認采用三台服務器節點的總核數3核,每個節點內存1024M。
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
參數 |
解釋 |
可選值舉例 |
--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()方法的參數 |
配置歷史服務
由於spark-shell停止掉后,hadoop102:4040頁面就看不到歷史任務的運行情況,所以開發時都配置歷史服務器記錄任務運行情況。
1)修改spark-default.conf.template名稱
mv spark-defaults.conf.template spark-defaults.conf
2)修改spark-default.conf文件,配置日志存儲路徑(寫),並同步到其他服務器上
spark.eventLog.dir hdfs://hadoop102:8020/directory
-Dspark.history.fs.logDirectory=hdfs://hadoop102:8020/directory
-Dspark.history.retainedApplications=30"
# 參數1 Dspark.history.ui.port:WEBUI訪問的端口號為18080
# 參數2 Dspark.history.fs.logDirectory:指定歷史服務器日志存儲路徑(讀)
啟動Hadoop集群,並在HDFS上創建/directory目錄。
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
7)查看Spark歷史服務地址:hadoop102:18080
配置高可用(HA)
安裝Zookeeper集群並啟動:《Zookeeper詳解(02) - zookeeper安裝部署-單機模式-集群模式》
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop102,hadoop103,hadoop104
-Dspark.deploy.zookeeper.dir=/spark"
#Zookeeper3.5的AdminServer默認端口是8080,和Spark的WebUI沖突
export SPARK_MASTER_WEBUI_PORT=8989
在Zookeeper節點中自動創建/spark目錄,用於管理:
再啟動一個hadoop102窗口,將/opt/module/spark-local/input中的測試數據上傳到hadoop集群的/input目錄
hadoop fs -put /opt/module/spark-local/input/ /input
--master spark://hadoop102:7077,hadoop103:7077 \
參數:--master spark://hadoop102:7077指定要連接的集群的master
5831 CoarseGrainedExecutorBackend
Kill掉hadoop102的master進程,頁面中觀察http://hadoop103:8080/的狀態是否切換為active。
運行模式
Spark有standalone-client(客戶端模式)和standalone-cluster(集群模式)兩種模式,主要區別在於:Driver程序的運行節點。
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
--deploy-mode client,表示Driver程序運行在本地客戶端
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
--deploy-mode cluster,表示Driver程序運行在集群
client用於測試,因為該模式的Driver運行在本地客戶端,會與yarn集群產生較大的網絡通信,從而導致網卡流量激增;它的好處在於直接執行時,在本地可以查看到所有的log,方便調試;
由於cluster模式,客戶端的終端顯示的僅是簡單運行狀況,無法像client模式將所有的日志信息都顯示到客戶端的終端上,若要查看cluster模式下的運行日志信息,只能夠通過如下方式進行查看
在http://192.168.194.102:8080/頁面點擊Completed Drivers里面的Worker
跳轉到Spark Worker頁面,點擊Finished Drivers中Logs下面的stdout
Spark ON Yarn模式(重點)
Spark客戶端直接連接Yarn,不需要額外構建Spark集群。
安裝
[hadoop@hadoop102 software]$ tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/
[hadoop@hadoop102 software]$ cd /opt/module/
[hadoop@hadoop102 module]$ mv spark-3.0.0-bin-hadoop3.2/ spark-yarn
如果使用的環境是虛擬機且內存較少,為防止執行過程進行被意外殺死,做如下配置
<!--是否啟動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<name>yarn.nodemanager.pmem-check-enabled</name>
<!--是否啟動一個線程檢查每個任務正使用的虛擬內存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<name>yarn.nodemanager.vmem-check-enabled</name>
xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
[hadoop@hadoop102 conf]$ mv spark-env.sh.template spark-env.sh
[hadoop@hadoop102 conf]$ vi spark-env.sh
在文件末尾添加YARN_CONF_DIR配置,保證后續運行任務的路徑都變成集群路徑
YARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
參數:--master yarn,表示Yarn方式運行;--deploy-mod表示客戶端方式運行程序
如果運行的時候,拋出如下異常ClassNotFoundException:com.sun.jersey.api.client.config.ClientConfig
-原因分析:Spark2中jersey版本是2.22,但是yarn中還需要依賴1.9,版本不兼容
<name>yarn.timeline-service.enabled</name>
9)查看http://192.168.194.102:8088/頁面,點擊History,查看歷史頁面
spark-shell --master yarn --deploy-mode client
配置歷史服務
為了查看spark程序的歷史運行情況,需要配置一下歷史服務器。
[hadoop@hadoop102 conf]$ mv spark-defaults.conf.template spark-defaults.conf
[hadoop@hadoop102 conf]$ vi spark-defaults.conf
spark.eventLog.dir hdfs://hadoop102:9820/directory
[hadoop@hadoop102 conf]$ vi spark-env.sh
-Dspark.history.fs.logDirectory=hdfs://hadoop102:9820/directory
-Dspark.history.retainedApplications=30"
# 參數3含義:指定保存Application歷史記錄的個數,如果超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數。
hadoop@hadoop102 conf]$ vi spark-defaults.conf
spark.yarn.historyServer.address=hadoop102:18080
[hadoop@hadoop102 conf]$ hadoop fs -mkdir /directory
[hadoop@hadoop102 spark-yarn]$ sbin/start-history-server.sh
停止命令:sbin/stop-history-server.sh
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.0.0.jar \
Web頁面查看日志:http://hadoop102:8088/cluster
待spark任務執行成功后點擊"history"跳轉到http://hadoop102:18080/
Spark ON Yarn運行模式
Spark有yarn-client(客戶端模式)和yarn-cluster(集群模式)兩種模式,主要區別在於:Driver程序的運行節點。
yarn-client:Driver程序運行在客戶端,適用於交互、調試,希望立即看到spark程序的輸出結果。
yarn-cluster:Driver程序運行在由ResourceManager啟動的APPMaster適用於生產環境。
查看http://hadoop103:8088/cluster頁面,點擊History按鈕,跳轉到歷史詳情頁面
在http://hadoop102:18080點擊Executors->點擊driver中的stdout
注意:如果在yarn日志端無法查看到具體的日志,則需要配置並啟動Yarn歷史服務器,具體配置流程請參考文章《Hadoop詳解(02)Hadoop集群運行環境搭建》--配置歷史服務器(可選)章節
Windows模式(開發環境)
將文件spark-3.0.0-bin-hadoop3.2.tgz解壓縮到無中文無空格的任意路徑下
雙擊執行解壓縮文件路徑下bin目錄中的spark-shell.cmd文件,啟動Spark本地環境
創建D:/input/word.txt文件並在文件中添加內容, 在命令行中輸入腳本代碼
scala> sc.textFile("D:/input/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res0: Array[(String, Int)] = Array((hello,2), (spark,1), (hadoop,1))
則需要在啟動spark-shell.cmd腳本的時候使用以管理員身份運行
在spark安裝目錄的bin目錄下,按Shift右鍵空白處,選擇 在此處打開Powershell窗口
Mesos & K8S模式(了解)
幾種部署模式對比
模式 |
Spark安裝機器數 |
需啟動的進程 |
所屬者 |
Local |
1 |
無 |
Spark |
Standalone |
3 |
Master及Worker |
Spark |
Yarn |
1 |
Yarn及HDFS |
Hadoop |
端口號總結
1)Spark查看當前Spark-shell運行任務情況端口號:4040
2)Spark Master內部通信服務端口號:7077 (類比於Hadoop的9820端口)
3)Spark Standalone模式Master Web端口號:8080(類比於Hadoop YARN任務運行情況查看端口號:8088)
4)Spark歷史服務器端口號:18080(類比於Hadoop歷史服務器端口號:19888)





















