提交應用程式

Spark 的 bin 目錄中的 spark-submit 指令碼用於在叢集上啟動應用程式。它可以使用所有 Spark 支援的 叢集管理員,透過統一的介面,因此您不必特別為每個叢集管理員組態您的應用程式。

打包您的應用程式相依性

如果您的程式碼依賴於其他專案,您需要將它們與您的應用程式一起打包,才能將程式碼分發到 Spark 叢集。為此,請建立一個包含您的程式碼及其相依性的組裝 JAR(或「uber」JAR)。sbtMaven 都有組裝外掛程式。在建立組裝 JAR 時,將 Spark 和 Hadoop 列為 provided 相依性;這些不需要打包,因為它們在執行時由叢集管理員提供。一旦您有了組裝好的 JAR,您就可以呼叫 bin/spark-submit 指令碼,如下所示,同時傳遞您的 JAR。

對於 Python,您可以使用 spark-submit--py-files 參數來新增 .py.zip.egg 檔案,以與您的應用程式一起分發。如果您依賴多個 Python 檔案,建議將它們打包成 .zip.egg。對於第三方 Python 依賴項,請參閱 Python 套件管理

使用 spark-submit 啟動應用程式

一旦使用者應用程式已打包,就可以使用 bin/spark-submit 腳本來啟動它。此腳本負責使用 Spark 及其依賴項設定類別路徑,並且可以支援 Spark 支援的不同叢集管理員和部署模式

./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]

一些常用的選項是

一個常見的部署策略是從與您的工作機器實體共置的閘道機器(例如獨立 EC2 叢集中的主節點)提交您的應用程式。在此設定中,client 模式是適當的。在 client 模式中,驅動程式會直接在 spark-submit 程序中啟動,該程序充當叢集的用戶端。應用程式的輸入和輸出會附加到主控台。因此,此模式特別適合涉及 REPL(例如 Spark shell)的應用程式。

或者,如果您的應用程式是由遠離工作機器的機器(例如,在您的筆記型電腦上)所提交,則通常使用 cluster 模式來最小化驅動程式和執行器之間的網路延遲。目前,獨立模式不支援 Python 應用程式的叢集模式。

對於 Python 應用程式,只需在 <application-jar> 的位置傳遞一個 .py 檔案,並使用 --py-files 將 Python .zip.egg.py 檔案新增至搜尋路徑。

有一些選項是特定於正在使用的 叢集管理員。例如,對於具有 cluster 部署模式的 Spark 獨立叢集,您還可以指定 --supervise 以確保如果驅動程式因非零退出碼而失敗,則會自動重新啟動。若要列舉所有此類可供 spark-submit 使用的選項,請使用 --help 執行它。以下是幾個常見選項的範例

# Run application locally on 8 cores
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master local[8] \
  /path/to/examples.jar \
  100

# Run on a Spark standalone cluster in client deploy mode
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://207.184.161.138:7077 \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/examples.jar \
  1000

# Run on a Spark standalone cluster in cluster deploy mode with supervise
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://207.184.161.138:7077 \
  --deploy-mode cluster \
  --supervise \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/examples.jar \
  1000

# Run on a YARN cluster in cluster deploy mode
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode cluster \
  --executor-memory 20G \
  --num-executors 50 \
  /path/to/examples.jar \
  1000

# Run a Python application on a Spark standalone cluster
./bin/spark-submit \
  --master spark://207.184.161.138:7077 \
  examples/src/main/python/pi.py \
  1000

# Run on a Mesos cluster in cluster deploy mode with supervise
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master mesos://207.184.161.138:7077 \
  --deploy-mode cluster \
  --supervise \
  --executor-memory 20G \
  --total-executor-cores 100 \
  http://path/to/examples.jar \
  1000

# Run on a Kubernetes cluster in cluster deploy mode
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master k8s://xx.yy.zz.ww:443 \
  --deploy-mode cluster \
  --executor-memory 20G \
  --num-executors 50 \
  http://path/to/examples.jar \
  1000

主控端 URL

傳遞給 Spark 的主控端 URL 可以採用下列格式之一

主控端 URL意義
local 在本地使用一個工作執行緒執行 Spark(即完全沒有並行性)。
local[K] 在本地使用 K 個工作執行緒執行 Spark(理想情況下,將其設定為您的機器上的核心數)。
local[K,F] 在本地使用 K 個工作執行緒和 F 個 maxFailures 執行 Spark(請參閱 spark.task.maxFailures 以了解此變數的說明)。
local[*] 在本地使用與您機器上的邏輯核心數一樣多的工作執行緒執行 Spark。
local[*,F] 在本地使用與您機器上的邏輯核心數一樣多的工作執行緒和 F 個 maxFailures 執行 Spark。
local-cluster[N,C,M] 本機叢集模式僅用於單元測試。它在單一 JVM 中模擬一個分散式叢集,具有 N 個工作執行緒、每個工作執行緒 C 個核心和每個工作執行緒 M MiB 的記憶體。
spark://HOST:PORT 連線到指定的 Spark 獨立叢集 主控端。埠必須是您的主控端設定為使用的埠,預設為 7077。
spark://HOST1:PORT1,HOST2:PORT2 連線至具有備用主機的給定 Spark 獨立叢集。清單中必須包含使用 Zookeeper 設定的高可用性叢集中所有主機主機。埠必須為每個主機設定為使用的埠,預設為 7077。
mesos://HOST:PORT 連線至給定的 Mesos 叢集。埠必須為設定為使用的埠,預設為 5050。或者,對於使用 ZooKeeper 的 Mesos 叢集,請使用 mesos://zk://...。若要使用 --deploy-mode cluster 提交,應將 HOST:PORT 設定為連線至 MesosClusterDispatcher
yarn 根據 --deploy-mode 的值,以 clientcluster 模式連線至 YARN 叢集。叢集位置將根據 HADOOP_CONF_DIRYARN_CONF_DIR 變數來尋找。
k8s://HOST:PORT 根據 --deploy-mode 的值,以 clientcluster 模式連線至 Kubernetes 叢集。HOSTPORT 指的是 Kubernetes API 伺服器。預設使用 TLS 連線。若要強制使用非安全連線,您可以使用 k8s://http://HOST:PORT

從檔案載入設定

spark-submit 指令碼可以從屬性檔案載入預設 Spark 設定值,並將它們傳遞給您的應用程式。預設情況下,它會從 Spark 目錄中的 conf/spark-defaults.conf 讀取選項。有關更多詳細資訊,請參閱 載入預設設定 一節。

以這種方式載入預設 Spark 組態可以避免需要某些旗標給 spark-submit。例如,如果設定 spark.master 屬性,您可以安全地從 spark-submit 省略 --master 旗標。一般而言,在 SparkConf 上明確設定的組態值具有最高優先權,然後是傳遞給 spark-submit 的旗標,然後是預設檔案中的值。

如果您曾經不清楚組態選項來自何處,您可以透過執行具有 --verbose 選項的 spark-submit 來列印細緻的偵錯資訊。

進階相依性管理

使用 spark-submit 時,應用程式 jar 以及包含在 --jars 選項中的任何 jar 都會自動傳輸到叢集。在 --jars 之後提供的 URL 必須以逗號分隔。該清單包含在驅動程式和執行器類別路徑中。目錄擴充套件不適用於 --jars

Spark 使用下列 URL 架構來允許不同的 jar 散播策略

請注意,JAR 和檔案會複製到執行器節點上每個 SparkContext 的工作目錄。這會隨著時間使用大量的空間,且需要清理。使用 YARN 時,清理會自動處理,使用 Spark 獨立時,可以使用 spark.worker.cleanup.appDataTtl 屬性組態自動清理。

使用者也可以透過提供以逗號分隔的 Maven 座標清單,使用 --packages 來包含任何其他相依性。使用此命令時,所有傳遞相依性都將獲得處理。使用標記 --repositories,可以以逗號分隔的方式新增其他儲存庫(或 SBT 中的解析器)。(請注意,在某些情況下,密碼保護儲存庫的認證資料可以在儲存庫 URI 中提供,例如 https://user:password@host/...。以這種方式提供認證資料時要小心。)這些命令可用於 pysparkspark-shellspark-submit,以包含 Spark 套件。

對於 Python,等效的 --py-files 選項可用於將 .egg.zip.py 函式庫分發給執行器。

更多資訊

部署應用程式後,叢集模式概觀 會說明分布式執行中涉及的元件,以及如何監控和除錯應用程式。