Spark 系列(五)—— Spark 運行模式與作業提交

一、作業提交

1.1 spark-submit

Spark 所有模式均使用 spark-submit 命令提交作業,其格式如下:

./bin/spark-submit \
  --class <main-class> \        # 應用程序主入口類
  --master <master-url> \       # 集羣的 Master Url
  --deploy-mode <deploy-mode> \ # 部署模式
  --conf <key>=<value> \        # 可選配置       
  ... # other options    
  <application-jar> \           # Jar 包路徑 
  [application-arguments]       #傳遞給主入口類的參數  

需要注意的是:在集羣環境下,application-jar 必須能被集羣中所有節點都能訪問,可以是 HDFS 上的路徑;也可以是本地文件系統路徑,如果是本地文件系統路徑,則要求集羣中每一個機器節點上的相同路徑都存在該 Jar 包。

1.2 deploy-mode

deploy-mode 有 clusterclient 兩個可選參數,默認爲 client。這裏以 Spark On Yarn 模式對兩者進行說明 :

  • 在 cluster 模式下,Spark Drvier 在應用程序的 Master 進程內運行,該進程由羣集上的 YARN 管理,提交作業的客戶端可以在啓動應用程序後關閉;
  • 在 client 模式下,Spark Drvier 在提交作業的客戶端進程中運行,Master 進程僅用於從 YARN 請求資源。

1.3 master-url

master-url 的所有可選參數如下表所示:

Master URL Meaning
local 使用一個線程本地運行 Spark
local[K] 使用 K 個 worker 線程本地運行 Spark
local[K,F] 使用 K 個 worker 線程本地運行 , 第二個參數爲 Task 的失敗重試次數
local[*] 使用與 CPU 核心數一樣的線程數在本地運行 Spark
local[*,F] 使用與 CPU 核心數一樣的線程數在本地運行 Spark<br/>第二個參數爲 Task 的失敗重試次數
spark://HOST:PORT 連接至指定的 standalone 集羣的 master 節點。端口號默認是 7077。
spark://HOST1:PORT1,HOST2:PORT2 如果 standalone 集羣採用 Zookeeper 實現高可用,則必須包含由 zookeeper 設置的所有 master 主機地址。
mesos://HOST:PORT 連接至給定的 Mesos 集羣。端口默認是 5050。對於使用了 ZooKeeper 的 Mesos cluster 來說,使用 mesos://zk://... 來指定地址,使用 --deploy-mode cluster 模式來提交。
yarn 連接至一個 YARN 集羣,集羣由配置的 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 來決定。使用 --deploy-mode 參數來配置 clientcluster 模式。

下面主要介紹三種常用部署模式及對應的作業提交方式。

二、Local模式

Local 模式下提交作業最爲簡單,不需要進行任何配置,提交命令如下:

# 本地模式提交應用
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100   # 傳給 SparkPi 的參數

spark-examples_2.11-2.4.0.jar 是 Spark 提供的測試用例包,SparkPi 用於計算 Pi 值,執行結果如下:

https://github.com/heibaiying

三、Standalone模式

Standalone 是 Spark 提供的一種內置的集羣模式,採用內置的資源管理器進行管理。下面按照如圖所示演示 1 個 Mater 和 2 個 Worker 節點的集羣配置,這裏使用兩臺主機進行演示:

  • hadoop001: 由於只有兩臺主機,所以 hadoop001 既是 Master 節點,也是 Worker 節點;
  • hadoop002 : Worker 節點。

https://github.com/heibaiying

3.1 環境配置

首先需要保證 Spark 已經解壓在兩臺主機的相同路徑上。然後進入 hadoop001 的 ${SPARK_HOME}/conf/ 目錄下,拷貝配置樣本並進行相關配置:

# cp spark-env.sh.template spark-env.sh

spark-env.sh 中配置 JDK 的目錄,完成後將該配置使用 scp 命令分發到 hadoop002 上:

# JDK安裝位置
JAVA_HOME=/usr/java/jdk1.8.0_201

3.2 集羣配置

${SPARK_HOME}/conf/ 目錄下,拷貝集羣配置樣本並進行相關配置:

# cp slaves.template slaves

指定所有 Worker 節點的主機名:

# A Spark Worker will be started on each of the machines listed below.
hadoop001
hadoop002

這裏需要注意以下三點:

  • 主機名與 IP 地址的映射必須在 /etc/hosts 文件中已經配置,否則就直接使用 IP 地址;
  • 每個主機名必須獨佔一行;
  • Spark 的 Master 主機是通過 SSH 訪問所有的 Worker 節點,所以需要預先配置免密登錄。

3.3 啓動

使用 start-all.sh 代表啓動 Master 和所有 Worker 服務。

./sbin/start-master.sh 

訪問 8080 端口,查看 Spark 的 Web-UI 界面,,此時應該顯示有兩個有效的工作節點:

https://github.com/heibaiying

3.4 提交作業

# 以client模式提交到standalone集羣 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop001:7077 \
--executor-memory 2G \
--total-executor-cores 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

# 以cluster模式提交到standalone集羣 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \  # 配置此參數代表開啓監督,如果主應用程序異常退出,則自動重啓 Driver
--executor-memory 2G \
--total-executor-cores 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

3.5 可選配置

在虛擬機上提交作業時經常出現一個的問題是作業無法申請到足夠的資源:

Initial job has not accepted any resources; 
check your cluster UI to ensure that workers are registered and have sufficient resources

https://github.com/heibaiying

<br/>

這時候可以查看 Web UI,我這裏是內存空間不足:提交命令中要求作業的 executor-memory 是 2G,但是實際的工作節點的 Memory 只有 1G,這時候你可以修改 --executor-memory,也可以修改 Woker 的 Memory,其默認值爲主機所有可用內存值減去 1G。

https://github.com/heibaiying

<br/>

關於 Master 和 Woker 節點的所有可選配置如下,可以在 spark-env.sh 中進行對應的配置:

Environment Variable(環境變量) Meaning(含義)
SPARK_MASTER_HOST master 節點地址
SPARK_MASTER_PORT master 節點地址端口(默認:7077)
SPARK_MASTER_WEBUI_PORT master 的 web UI 的端口(默認:8080)
SPARK_MASTER_OPTS 僅用於 master 的配置屬性,格式是 "-Dx=y"(默認:none),所有屬性可以參考官方文檔:spark-standalone-mode
SPARK_LOCAL_DIRS spark 的臨時存儲的目錄,用於暫存 map 的輸出和持久化存儲 RDDs。多個目錄用逗號分隔
SPARK_WORKER_CORES spark worker 節點可以使用 CPU Cores 的數量。(默認:全部可用)
SPARK_WORKER_MEMORY spark worker 節點可以使用的內存數量(默認:全部的內存減去 1GB);
SPARK_WORKER_PORT spark worker 節點的端口(默認: random(隨機))
SPARK_WORKER_WEBUI_PORT worker 的 web UI 的 Port(端口)(默認:8081)
SPARK_WORKER_DIR worker 運行應用程序的目錄,這個目錄中包含日誌和暫存空間(default:SPARK_HOME/work)
SPARK_WORKER_OPTS 僅用於 worker 的配置屬性,格式是 "-Dx=y"(默認:none)。所有屬性可以參考官方文檔:spark-standalone-mode
SPARK_DAEMON_MEMORY 分配給 spark master 和 worker 守護進程的內存。(默認: 1G)
SPARK_DAEMON_JAVA_OPTS spark master 和 worker 守護進程的 JVM 選項,格式是 "-Dx=y"(默認:none)
SPARK_PUBLIC_DNS spark master 和 worker 的公開 DNS 名稱。(默認:none)

三、Spark on Yarn模式

Spark 支持將作業提交到 Yarn 上運行,此時不需要啓動 Master 節點,也不需要啓動 Worker 節點。

3.1 配置

spark-env.sh 中配置 hadoop 的配置目錄的位置,可以使用 YARN_CONF_DIRHADOOP_CONF_DIR 進行指定:

YARN_CONF_DIR=/usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop
# JDK安裝位置
JAVA_HOME=/usr/java/jdk1.8.0_201

3.2 啓動

必須要保證 Hadoop 已經啓動,這裏包括 YARN 和 HDFS 都需要啓動,因爲在計算過程中 Spark 會使用 HDFS 存儲臨時文件,如果 HDFS 沒有啓動,則會拋出異常。

# start-yarn.sh
# start-dfs.sh

3.3 提交應用

#  以client模式提交到yarn集羣 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--executor-memory 2G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

#  以cluster模式提交到yarn集羣 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--executor-memory 2G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100

更多大數據系列文章可以參見 GitHub 開源項目大數據入門指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章