大數據Hadoop之——Spark集群部署(Standalone)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM