1. 程式人生 > >《Spark官方文件》提交Spark應用

《Spark官方文件》提交Spark應用

提交Spark應用

spark-submit指令碼在Spark的bin目錄下,可以利用此指令碼向叢集提交Spark應用。該指令碼為所有Spark所支援的叢集管理器( cluster managers)提供了統一的介面,因此,你基本上可以用同樣的配置和指令碼,向不同型別的叢集管理器提交你的應用。

打包應用程式依賴

如果你的程式碼依賴於其他工程,那麼你需要把依賴項也打包進來,併發布給Spark叢集。這需要建立一個程式集jar包(或者uber jar),包含你自己的程式碼,同時也包含其依賴項。sbt and Maven 都有assembly外掛。建立程式集jar包時,注意,要把Spark和Hadoop的jar包都可設為provided;這些jar包在Spark叢集上已經存在,不需要再打包進來。完成jar包後,你就可以使用bin/spark-submit來提交你的jar包了。

對於Python,你可以使用spark-submit的–py-files引數,將你的程式以.py、.zip 或.egg檔案格式提交給叢集。如果你需要依賴很多Python檔案,我們推薦你使用.zip或者.egg來打包。

利用spark-submit啟動應用

一旦打包好一個應用程式,你就可以用bin/spark-submit來提交之。這個指令碼會自動設定Spark及其依賴的classpath,同時可以支援多種不同型別的叢集管理器、以及不同的部署模式:

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

一些常用的選項如下:

  • --class: 應用入口類(例如:org.apache.spark.examples.SparkPi))
  • --master: 叢集的master URL (如:spark://23.195.26.187:7077)
  • --deploy-mode驅動器程序是在叢集上工作節點執行(cluster),還是在叢集之外客戶端執行(client)(預設:client)
  • --conf: 可以設定任意的Spark配置屬性,鍵值對(key=value)格式。如果值中包含空白字元,可以用雙引號括起來(”key=value“)。
  • application-jar: 應用程式jar包路徑,該jar包必須包括你自己的程式碼及其所有的依賴項。如果是URL,那麼該路徑URL必須是對整個叢集可見且一致的,如:hdfs://path 或者 
    file://path
     (要求對所有節點都一致)
  • application-arguments: 傳給入口類main函式的啟動引數,如果有的話。

一種常見的部署策略是,在一臺閘道器機器上提交你的應用,這樣距離工作節點的物理距離比較近。這種情況下,client模式會比較適合。client模式下,驅動器直接執行在spark-submit的程序中,同時驅動器對於叢集來說就像是一個客戶端。應用程式的輸入輸出也被繫結到控制檯上。因此,這種模式特別適用於互動式執行(REPL),spark-shell就是這種模式。

當然,你也可以從距離工作節點很遠的機器(如:你的筆記本)上提交應用,這種情況下,通常適用cluster模式,以減少網路驅動器和執行器之間的網路通訊延遲。注意:對於Mesos叢集管理器,Spark還不支援cluster模式。目前,只有YARN上Python應用支援cluster模式。

對於Python應用,只要把<application-jar>換成一個.py檔案,再把.zip、.egg或者.py檔案傳給–py-files引數即可。

有一些引數是專門用於設定叢集管理器的(cluster manager)。例如,在獨立部署( Spark standalone cluster )時,並且使用cluster模式,你可以用–supervise引數來確保驅動器在異常退出情況下(退出並返回非0值)自動重啟。spark-submit –help可檢視完整的選項列表。這裡有幾個常見的示例:

# 本地執行,佔用8個core
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master local[8] \
  /path/to/examples.jar \
  100

# 獨立部署,client模式
./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

# 獨立部署,cluster模式,異常退出時自動重啟
./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

# YARN上執行,cluster模式
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode cluster \  # 要client模式就把這個設為client
  --executor-memory 20G \
  --num-executors 50 \
  /path/to/examples.jar \
  1000

# 獨立部署,執行python
./bin/spark-submit \
  --master spark://207.184.161.138:7077 \
  examples/src/main/python/pi.py \
  1000

# Mesos叢集上執行,cluster模式,異常時自動重啟
./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

Master URLs

傳給Spark的master URL可以是以下幾種格式:

Master URL 含義
local 本地執行Spark,只用1個worker執行緒(沒有平行計算)
local[K] 本地執行Spark,使用K個worker執行緒(理論上,最好將這個值設為你機器上CPU core的個數)
local[*] 本地執行Spark,使用worker執行緒數同你機器上邏輯CPU core個數
spark://HOST:PORT 連線到指定的Spark獨立部署的叢集管理器(Spark standalone cluster)。埠是可以配置的,預設7077。
mesos://HOST:PORT 連線到指定的Mesos叢集。埠號可以配置,預設5050。如果Mesos叢集依賴於ZooKeeper,可以使用 mesos://zk://… 來提交,注意 –deploy-mode需要設定為cluster,同時,HOST:PORT應指向 MesosClusterDispatcher.
yarn 連線到指定的 YARN  叢集,使用–deploy-mode來指定 client模式 或是 cluster 模式。YARN叢集位置需要通過 $HADOOP_CONF_DIR 或者 $YARN_CONF_DIR 變數來查詢。
yarn-client YARN client模式的簡寫,等價於 –master yarn –deploy-mode client
yarn-cluster YARN cluster模式的簡寫,等價於 –master yarn –deploy-mode cluster

從檔案載入配置

spark-submit指令碼可以從一個屬性檔案載入預設的Spark屬性配置值(Spark configuration values ),並將這些屬性傳給你的應用程式。預設Spark會從 conf/spark-defaults.conf讀取這些屬性配置。更詳細資訊,請參考 loading default configurations.

用這種方式載入預設Spark屬性配置,可以在呼叫spark-submit指令碼時省略一些引數標誌。例如:如果屬性檔案中設定了spark.master屬性,那麼你就以忽略spark-submit的–master引數。通常,在程式碼裡用SparkConf中設定的引數具有最高的優先順序,其次是spark-submit中傳的引數,再次才是spark-defaults.conf檔案中的配置值。

如果你總是搞不清楚最終生效的配置值是從哪裡來的,你可以通過spark-submit的–verbose選項來列印細粒度的除錯資訊。

高階依賴管理

通過spark-submit提交應用時,application jar和–jars選項中的jar包都會被自動傳到叢集上。Spark支援以下URL協議,並採用不同的分發策略:

  • file: – 檔案絕對路徑,並且file:/URI是通過驅動器的HTTP檔案伺服器來下載的,每個執行器都從驅動器的HTTP server拉取這些檔案。
  • hdfs:http:https:ftp: – 設定這些引數後,Spark將會從指定的URI位置下載所需的檔案和jar包。
  • local: –  local:/ 打頭的URI用於指定在每個工作節點上都能訪問到的本地或共享檔案。這意味著,不會佔用網路IO,特別是對一些大檔案或jar包,最好使用這種方式,當然,你需要把檔案推送到每個工作節點上,或者通過NFS和GlusterFS共享檔案。

注意,每個SparkContext對應的jar包和檔案都需要拷貝到所對應執行器的工作目錄下。一段時間之後,這些檔案可能會佔用相當多的磁碟。在YARN上,這些清理工作是自動完成的;而在Spark獨立部署時,這種自動清理需要配置 spark.worker.cleanup.appDataTtl 屬性。

使用者還可以用–packages引數,通過給定一個逗號分隔的maven座標,來指定其他依賴項。這個命令會自動處理依賴樹。額外的maven庫(或者SBT resolver)可以通過–repositories引數來指定。Spark命令(pyspark,spark-shell,spark-submit)都支援這些引數。

對於Python,也可以使用等價的–py-files選項來分發.egg、.zip以及.py檔案到執行器上。

更多資訊

部署完了你的應用程式後, cluster mode overview 描述了分散式執行中所涉及的各個元件,以及如何監控和除錯應用程式。