1. 程式人生 > >Spark 系列(五)—— Spark 執行模式與作業提交

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
第二個引數為 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 值,執行結果如下:

三、Standalone模式

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

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

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 介面,,此時應該顯示有兩個有效的工作節點:

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


這時候可以檢視 Web UI,我這裡是記憶體空間不足:提交命令中要求作業的 executor-memory 是 2G,但是實際的工作節點的 Memory 只有 1G,這時候你可以修改 --executor-memory,也可以修改 Woker 的 Memory,其預設值為主機所有可用記憶體值減去 1G。


關於 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 開源專案: 大資料入門指南