Spark運行環境和架構
1. Spark運行環境
Spark作為一個資料處理框架和計算引擎,它被設計在所有常見的集群環境下運行,目前主流環境是基于Hadoop的Yarn環境,docker環境也在慢慢流行起來
Spark的運行環境目前分為三種模式:local模式、standalone模式和Yarn模式
1.1 local模式
local模式是不需要其他任何節點資源就可以在本地執行Spark程式的環境,一般用于學習、除錯等
安裝不需要額外配置,解壓到你想放的路徑即可
· 提交應用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10s
注意事項:
-
–class 表示要執行程式的主類,此處根據自己需要提交的程式更換為自己寫的應用程式即可
2. --master local[2] 部署模式,默認為本地模式,數字表示分配的虛擬CPU核數量 3. spark-exam.....jar運行的應用類所在的jar包,**實際使用時,設定為自己打的jar包** 4. 數字10代表程式的入口引數,用于設定當前應用的任務數量
1.2 standalone模式
standalone是只使用Spark自身節點運行的集群模式,稱為獨立部署模式,Spark的standalone模式是經典的master-slave模式
1.2.1 組態檔修改
與local模式不同,standalone需要修改一些組態檔:
將conf/下的spark-env.sh.template修改為spark-env.sh(或者復制一份為好)
在spark-env.sh添加如下配置:
export JAVA_HOME=/opt/module/jdk1.8.0_144 // 配置自己實際的jdk安裝目錄
SPARK_MASTER_HOST=linux1 // 主機名需要根據自己的進行修改
SPARK_MASTER_PORT=7077 // 7077埠,相當于Hadoop3內部通信的8020埠,此處埠需要確認自己的Hadoop配置
注:由于是集群模式,以上命令在從節點主機上也要執行
1.2.2 提交應用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://linux1:7077 \
examples/jars/spark-examples_2.12-3.0.0.jar \
10
注意事項
-
–class 表示要執行程式的主類
-
–master spark://linux1:7077 獨立部署模式,連接到Spark 集群
-
spark-examples_2.12-3.0.0.jar 運行類所在的jar 包
-
數字10 表示程式的入口引數,用于設定當前應用的任務數量
1.2.3 提交引數說明
| 引數 | 解釋 | 可選值舉例 |
|---|---|---|
| –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()方法的引數 |
1.2.4 配置歷史服務
由于spark-shell關閉后,集群監控(:4040)頁面就看不到歷史任務的運行情況了,所以在開發時一般要配置歷史服務器記錄任務運行情況
-
修改spark-defaults.conf.template檔案名為spark-defaults.conf
mv spark-defaults.conf.template spark-defaults.conf -
修改spark-default.conf 檔案,配置日志存盤路徑
spark.eventLog.enabled true spark.eventLog.dir hdfs://linux1:8020/directory注意:需要啟動Hadoop集群,且HDFS上的directory必須已經存在
sbin/start-dfs.sh hadoop fs -mkdir /directory -
修改spark-env.sh 檔案, 添加日志配置
export SPARK_HISTORY_OPTS=" -Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://linux1:8020/directory -Dspark.history.retainedApplications=30"· 引數1含義:WEB UI訪問的埠號為18080
· 引數2含義:指定歷史服務器日志存盤路徑
· 引數3含義:指定保存Application歷史紀錄的個數,如果超過這個值,舊的應用程式資訊將被洗掉,這個是記憶體中的應用數而非頁面顯示的應用數,
-
將組態檔分發到從節點上
-
重啟集群和歷史服務
sbin/start-all.sh sbin/start-history-server.sh -
重新執行任務
bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://linux1:7077 \ ./examples/jars/spark-examples_2.12-3.0.0.jar \ 10 -
查看歷史服務:http://linux1:18080
1.3 Yarn模式
standalone模式由Spark自身提供計算資源,這種方式降低了和其他第三方資源框架的耦合性,獨立性很強,但是作為一個計算框架,資源調度并不是其強項,yarn模式就是將Spark集成到yarn這個專業的資源調度框架下作業
1.3.1 組態檔修改
修改Hadoop組態檔/etc/hadoop/yarn-site.xml, 并分發到各從節點
<!--是否啟動一個執行緒檢查每個任務正使用的物理記憶體量,如果任務超出分配值,則直接將其殺掉,默認是 true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否啟動一個執行緒檢查每個任務正使用的虛擬記憶體量,如果任務超出分配值,則直接將其殺掉,默認是 true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
修改conf/spark-env.sh,添加JAVA_HOME 和YARN_CONF_DIR 配置
cp spark-env.sh.template spark-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
YARN_CONF_DIR=/opt/module/hadoop/etc/hadoop
1.3.2 提交應用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
1.4 三種部署模式的對比
| 模式 | Spark節點數 | 需要啟動的行程 | 所屬者 | 應用場景 |
|---|---|---|---|---|
| Local | 1 | 無 | Spark | 測驗、學習 |
| Standalone | 3(1master+2slaves) | Master && Worker | Spark | 單獨部署 |
| Spark on Yarn | 1 | Yarn && HDFS | Hadoop | 混合部署 |
1.5 埠號
· Spark 查看當前Spark-shell 運行任務情況埠號:4040(計算)
· Spark Master 內部通信服務埠號:7077
· Standalone 模式下,Spark Master Web 埠號:8080(資源)
· Spark 歷史服務器埠號:18080
· Hadoop YARN 任務運行情況查看埠號:8088
2. Spark運行架構
2.1 運行架構
Spark框架的核心是計算引擎,它整體上采用了標準的Master-Slave結構
下圖為Spark應用程式執行時的基本結構,Driver表示Master,負責管理整個集群中的作業任務調度,Executor則是slave,負責實際執行任務
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fCJawubZ-1619178532758)(C:\Users\Lee\AppData\Roaming\Typora\typora-user-images\image-20210423162147459.png)]](https://img.uj5u.com/2021/04/24/238974241156211.png)
2.2 核心組件
Spark框架有兩個核心組件
2.2.1 Driver
driver是Spark的驅動器節點,用于執行Spark任務中的main方法,負責實際代碼的執行作業,
driver在Spark作業執行時主要負責:
1. 將用戶程式轉化為job(作業)
2. 在executor間調度task(任務)
3. 跟蹤executor的執行情況
4. 通過UI展示查詢運行情況
關于driver類其實沒有精確的定義,在整個編程程序中我們也沒有看到任何有關driver的描述
簡單理解,我們認為所謂的driver其實就是驅使整個應用運行的程式,也叫driver類
2.2.2 executor
Spark executor是集群中worker節點中的一個JVM行程,負責在Spark job中運行具體的task,且task之間彼此是相互獨立的,Spark 應用程式啟動時,executor節點也被同時啟動,并且始終伴隨著整個Spark應用的生命周期而存在,如果executor節點發生故障或崩潰,Spark應用也可以繼續執行,它會將出錯節點上的task調度到其他executor節點上繼續執行
executor的兩個核心功能:
? · 負責運行組成Spark應用的task,并將結果反饋給driver行程
? · 通過自身的block manager(塊管理器)為用戶程式中要求快取的RDD提供記憶體式存盤,RDD是直接快取在executor行程里的,因此任務可以在運行時充分利用快取資料加速計算
2.2.3 Master & Worker
Spark集群的standalone部署環境中,不需要依賴于其他的資源調度框架,自身就實作了資源調度的功能,所以在該環境中還有其他兩個核心組件:Master和Worker,
這里的master是一個行程,主要負責資源的調度和分配,并進行集群的監控等職責,類似于yarn環境中的ResourceManager
而worker,也是行程,一個worker運行在集群中的一臺服務器上,由master分配資源對資料進行并行的處理和計算,類似于yarn環境中的NodeManager
2.2.4 ApplicationMaster
Hadoop用戶向yarn集群提交應用時,提交程式中應該包含ApplicationMaster,用于向資源調度器申請執行任務的資源容器container,運行用戶自己的程式任務job,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗等例外情況
簡而言之,RM(資源)和drive(計算)之間的解耦靠的就是AM
2.3 核心概念
2.3.1 executor和core
Spark executor是集群中worker節點中的一個JVM行程,是整個集群中專門用于計算的節點,在提交應用時,可以提供引數指定計算節點的個數,以及對應的資源,這里的資源一般指的是作業節點executor的記憶體大小和使用的CPU核心數量(core)
應用程式啟動相關引數如下:
| 名稱 | 說明 |
|---|---|
| –num-executors | 配置Executor的數量 |
| –executor-memory | 配置每個Executor的記憶體大小 |
| –executor-cores | 配置每個Executor的虛擬CPU core數量 |
2.3.2 并行度Parallelism
在分布式計算框架中,一般都是多個task同時執行,由于任務分布在不同的計算節點進行計算,所以能夠真正地實作多任務并行執行,這里是并行而不是并發,我們將整個集群并行執行人物的數量稱之為并行度,
一個作業的并行度是多少取決于框架的默認配置,應用程式也可以在運行程序中動態修改,
2.3.3 有向無環圖DAG(Directed Acyclic Graph)
有向無環圖是由點和線組成的拓撲圖形,有方向,不倍訓
第一代計算引擎:MapReduce:將計算分為map和reduce兩個階段,對于上層應用來說就不得不拆分演算法,甚至是多個job地串聯已完成一個完整地演算法,例如迭代計算
第二代計算引擎:支持DAG地計算引擎,如tez和Oozie
第三代:以Spark為代表,主要特點是job內部的DAG支持(不跨越job),以及實時計算
這里的DAG并不是指真正意義上的圖形,而是由Spark程式直接映射成的資料流的高級抽象模型,
2.3.4 提交流程
這里的提交流程指的是開發人員根據需求寫的應用程式通過Spark客戶端提交給Spark運行環境執行計算的流程,
Spark應用程式提交到yarn環境中執行時,一般有兩種部署執行的方式:client和cluster
兩種模式的主要區別在于:driver程式運行的節點位置不同
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7Mbyr9MH-1619178532761)(C:\Users\Lee\AppData\Roaming\Typora\typora-user-images\image-20210423191413497.png)]](https://img.uj5u.com/2021/04/24/238974241156212.png)
2.3.4.1 yarn client模式
Client 模式將用于監控和調度的Driver 模塊在客戶端執行,而不是在Yarn 中,所以一般用于測驗,
- Driver 在任務提交的本地機器上運行
- Driver 啟動后會和ResourceManager 通訊申請啟動ApplicationMaster
- ResourceManager 分配container,在合適的NodeManager 上啟動ApplicationMaster,負責向ResourceManager 申請Executor 記憶體
- ResourceManager 接到ApplicationMaster 的資源申請后會分配 container,然后ApplicationMaster 在資源分配指定的NodeManager 上啟動Executor 行程
- Executor 行程啟動后會向Driver 反向注冊,Executor 全部注冊完成后Driver 開始執行main 函式
- 之后執行到Action 算子時,觸發一個Job,并根據寬依賴開始劃分 stage,每個stage 生成對應的TaskSet,之后將task 分發到各個Executor 上執行,
2.3.4.2 yarn cluster模式
Cluster 模式將用于監控和調度的 Driver 模塊啟動在Yarn 集群資源中執行,一般應用于實際生產環境,
- 在YARN Cluster 模式下,任務提交后會和ResourceManager 通訊申請啟動ApplicationMaster,
- 隨后ResourceManager 分配container,在合適的NodeManager 上啟動ApplicationMaster,此時的ApplicationMaster 就是Driver,
- Driver 啟動后向ResourceManager 申請Executor 記憶體,ResourceManager 接到ApplicationMaster 的資源申請后會分配container,然后在合適的NodeManager 上啟動Executor 行程
- Executor 行程啟動后會向Driver 反向注冊,Executor 全部注冊完成后Driver 開始執行main 函式,
- 之后執行到Action 算子時,觸發一個Job,并根據寬依賴開始劃分 stage,每個stage 生成對應的TaskSet,之后將task 分發到各個Executor 上執行,
pplicationMaster 就是Driver,
3. Driver 啟動后向ResourceManager 申請Executor 記憶體,ResourceManager 接到ApplicationMaster 的資源申請后會分配container,然后在合適的NodeManager 上啟動Executor 行程
4. Executor 行程啟動后會向Driver 反向注冊,Executor 全部注冊完成后Driver 開始執行main 函式,
5. 之后執行到Action 算子時,觸發一個Job,并根據寬依賴開始劃分 stage,每個stage 生成對應的TaskSet,之后將task 分發到各個Executor 上執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279565.html
標籤:其他
