一、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模式了解就行。