一、Spark概述 Spark基礎概念和原理講解可以參考我上篇博文:大數據Hadoop之——計算引擎Spark 二、Spark的運行模式 1)Standalone(本章講解) 獨立模式,自己獨立一套集群(master/client/slave),Spark 原生的簡單集群管理器, 自帶完整的服務, ...
目錄
一、Spark概述
Spark基礎概念和原理講解可以參考我上篇博文:大數據Hadoop之——計算引擎Spark
二、Spark的運行模式
1)Standalone(本章講解)
獨立模式,自己獨立一套集群(master/client/slave),Spark 原生的簡單集群管理器, 自帶完整的服務, 可單獨部署到一個集群中,無需依賴任何其他資源管理系統, 使用 Standalone 可以很方便地搭建一個集群,一般在公司內部沒有搭建其他資源管理框架的時候才會使用。缺點:資源不利於充分利用
2)Mesos
一個強大的分散式資源管理框架,它允許多種不同的框架部署在其上,包括 yarn,由於mesos這種方式目前應用的比較少,這裡沒有記錄mesos的部署方式。
3)YARN(推薦)
統一的資源管理機制, 在上面可以運行多套計算框架, 如map reduce、storm,spark、flink 等, 根據 driver 在集群中的位置不同,分為 yarn client 和 yarn cluster,其實本質就是drive不同。企業里用得最多的一種模式。這種模式環境部署,已經在大數據Hadoop之——計算引擎Spark博文中講過,這裡就不重覆了。
- yarn Client模式:Driver運行在本地,適合交互調試
- yarn Cluster模式:Driver運行在集群(AM),正式提交任務的模式(remote)
4)K8S(新模式)
K8S 是 Spark 上全新的集群管理和調度系統。由於在實際生產環境下使用的絕大多數的集群管理器是 ON YARN模式,因此我們目前最主要還是關註ON YARN模式,ON K8S模式瞭解就行,有興趣的小伙伴可以試試,工作模式如下圖所示:
Spark 的運行模式取決於傳遞給 SparkContext 的 MASTER 環境變數的值, 個別模式還需要輔助的程式介面來配合使用,目前支持的 Master 字元串及 URL 包括:
--deploy-mode:是否將驅動程式(driver)部署在工作節點(cluster)上,或作為外部客戶機(client)本地部署(預設值:client)。
Master URL | 含義 |
---|---|
local | 在本地運行,只有一個工作進程,無並行計算能力 |
local[K] | 在本地運行,有 K 個工作進程,通常設置 K 為機器的CPU 核心數量 |
local[*] | 在本地運行,工作進程數量等於機器的 CPU 核心數量。 |
spark://HOST:PORT | 以 Standalone 模式運行,這是 Spark 自身提供的集群運行模式,預設埠號: 7077 |
mesos://HOST:PORT | 在 Mesos 集群上運行,Driver 進程和 Worker 進程運行在 Mesos 集群上,部署模式必須使用固定值:--deploy-mode cluster |
yarn | 在yarn集群上運行,依賴於hadoop集群,yarn資源調度框架,將應用提交給yarn,在ApplactionMaster(相當於Stand alone模式中的Master)中運行driver,在集群上調度資源,開啟excutor執行任務。 |
k8s | 在k8s集群上運行 |
三、Standalone 模式運行機制
Standalone 集群有四個重要組成部分, 分別是:
- Driver: 是一個進程,我們編寫的 Spark 應用程式就運行在 Driver 上, 由Driver 進程執行;
- Master:是一個進程,主要負責資源的調度和分配,併進行集群的監控等職責;
- Worker:是一個進程,一個 Worker 運行在集群中的一臺伺服器上,主要負責兩個職責,一個是用自己的記憶體存儲 RDD 的某個或某些 partition;另一個是啟動其他進程和線程(Executor) ,對 RDD 上的 partition 進行並行的處理和計算。
- Executor:是一個進程, 一個 Worker 上可以運行多個 Executor, Executor 通過啟動多個線程( task)來執行對 RDD 的 partition 進行並行計算,也就是執行我們對 RDD 定義的例如 map、flatMap、reduce 等運算元操作。
1)Standalone Client 模式
- 在Standalone Client模式下,Driver在任務提交的本地機器上運行,
- Driver啟動後向Master註冊應用程式,Master根據submit腳本的資源需求找到內部資源至少可以啟動一個Executor的所有Worker,
- 然後在這些Worker之間分配Executor,Worker上的Executor啟動後會向Driver反向註冊,所有的Executor註冊完成後,
- Driver開始執行main函數,之後執行到Action運算元時,開始劃分stage,每個stage生成對應的taskSet,之後將task分發到各個Executor上執行。
2)Standalone Cluster 模式
- 在 Standalone Cluster 模式下,任務提交後,Master 會找到一個 Worker 啟動 Driver進程,
- Driver 啟動後向 Master 註冊應用程式,
- Master 根據 submit 腳本的資源需求找到內部資源至少可以啟動一個 Executor 的所有 Worker,
- 然後在這些 Worker 之間分配 Executor,Worker 上的 Executor 啟動後會向 Driver 反向註冊,
- 所有的 Executor 註冊完成後,Driver 開始執行 main 函數,之後執行到 Action 運算元時,開始劃分 stage,每個 stage 生成對應的 taskSet,之後將 task 分發到各個 Executor 上執行。
【 註意】Standalone的兩種模式下(client/Cluster),Master在接到Driver註冊Spark應用程式的請求後,會獲取其所管理的剩餘資源能夠啟動一個Executor的所有Worker,然後在這些Worker之間分發Executor,此時的分發只考慮Worker上的資源是否足夠使用,直到當前應用程式所需的所有Executor都分配完畢,Executor反向註冊完畢後,Driver開始執行main程式。
四、Spark 集群安裝(Standalone)
1)機器及角色劃分
機器IP | 機器名 | 節點類型 |
---|---|---|
192.168.0.113 | hadoop-node1 | Master/Worker |
192.168.0.114 | hadoop-node2 | Worker |
192.168.0.115 | hadoop-node3 | Worker |
2)三台機器安裝JDK環境
之前安裝Hadoop集群的時候已經安裝過了,這裡就略過了,不清楚的可以參考我之前的文章:大數據Hadoop原理介紹+安裝+實戰操作(HDFS+YARN+MapReduce)
3)下載
Spark下載地址:http://spark.apache.org/downloads.html
這裡需要註意版本,我的hadoop版本是3.3.1,這裡spark就下載最新版本的3.2.0,而Spark3.2.0依賴的Scala的2.13,所以後面用到Scala編程時註意Scala的版本。
$ cd /opt/bigdata/hadoop/software
# 下載
$ wget https://dlcdn.apache.org/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz
# 解壓
$ tar -zxvf spark-3.2.0-bin-hadoop3.2.tgz -C /opt/bigdata/hadoop/server/
# 修改安裝目錄名稱
$ cp -r /opt/bigdata/hadoop/server/spark-3.2.0-bin-hadoop3.2 /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2
4)配置spark
1、配置slaves文件
$ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/conf
$ cp workers.template workers
# slaves文件內容如下:
hadoop-node1
hadoop-node2
hadoop-node3
hadoop-node1即是master,也是worker
2、配置spark-env.sh
$ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/conf
# 創建data目錄(所有節點都得創建這個目錄)
$ mkdir -p /opt/bigdata/hadoop/data/spark-standalone
# copy一份環境變數文件
$ cp spark-env.sh.template spark-env.sh
# 加入以下內容:
export SPARK_MASTER_HOST=hadoop-node1
export SPARK_LOCAL_DIRS=/opt/bigdata/hadoop/data/spark-standalone
3、配置spark-defaults.conf
這裡不做修改,如果需要修改,自行修改就行,預設埠7077
$ cp spark-defaults.conf.template spark-defaults.conf
$ cat spark-defaults.conf
5)將配置好的包copy另外兩台集群
$ scp -r spark-standalone-3.2.0-bin-hadoop3.2 hadoop-node2:/opt/bigdata/hadoop/server/
$ scp -r spark-standalone-3.2.0-bin-hadoop3.2 hadoop-node3:/opt/bigdata/hadoop/server/
5)啟動
1、啟動Master(在hadoop-node1節點上執行)
$ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/sbin
$ ./start-master.sh
# 查看進程埠,spark master web ui 預設埠為8080
$ ss -tnlp|grep :8080
# 如果埠衝突,修改start-master.sh腳本里的埠即可
$ grep SPARK_MASTER_WEBUI_PORT start-master.sh
訪問spark master web ui:http://hadoop-node1:8080
2、啟動Worker節點(在所有節點上都執行)
$ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/sbin
$ ./start-worker.sh spark://hadoop-node1:7077
五、測試驗證
spark-submit 詳細參數說明
參數名 | 參數說明 |
---|---|
--master | master 的地址,提交任務到哪裡執行,例如 spark://host:port, yarn, local |
--deploy-mode | 在本地 (client) 啟動 driver 或在 cluster 上啟動,預設是 client |
--class | 應用程式的主類,僅針對 java 或 scala 應用 |
--name | 應用程式的名稱 |
--jars | 用逗號分隔的本地 jar 包,設置後,這些 jar 將包含在 driver 和 executor 的 classpath 下 |
--packages | 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐標 |
--exclude-packages | 為了避免衝突 而指定不包含的 package |
--repositories | 遠程 repository |
--conf PROP=VALUE | 指定 spark 配置屬性的值, 例如 -conf spark.executor.extraJavaOptions="-XX:MaxPermSize=256m" |
--properties-file | 載入的配置文件,預設為 conf/spark-defaults.conf |
--driver-memory | Driver記憶體,預設 1G |
--driver-java-options | 傳給 driver 的額外的 Java 選項 |
--driver-library-path | 傳給 driver 的額外的庫路徑 |
--driver-class-path | 傳給 driver 的額外的類路徑 |
--driver-cores | Driver 的核數,預設是1。在 yarn 或者 standalone 下使用 |
--executor-memory | 每個 executor 的記憶體,預設是1G |
--total-executor-cores | 所有 executor 總共的核數。僅僅在 mesos 或者 standalone 下使用 |
--num-executors | 啟動的 executor 數量。預設為2。在 yarn 下使用 |
--executor-core | 每個 executor 的核數。在yarn或者standalone下使用 |
1)driver client模式(--deploy-mode client)
$ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/bin
$ ./spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop-node1:7077 \
--deploy-mode client \
--driver-memory 1G \
--executor-memory 1G \
--total-executor-cores 2 \
--executor-cores 1 \
/opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.2.0.jar 10
這種模式運行結果,直接在客戶端顯示出來了。
2)driver cluster模式(--deploy-mode cluster)
$ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/bin
$ ./spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop-node1:7077 \
--deploy-mode cluster \
--driver-memory 1G \
--executor-memory 1G \
--total-executor-cores 2 \
--executor-cores 1 \
/opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.2.0.jar 10
這種模式基本上沒什麼輸出信息,需要登錄web頁面查看
查看driver日誌信息
最終在driver日誌里查看運行結果了。
【溫馨提示】目前企業里用的最多的模式還是on yarn模式,Standalone模式瞭解就行。