Spark Submitting Applications淺析

Submitting Applications提交應用程序

在spark的bin目錄下spark-submit腳本被用於在集羣中啓動應用程序。它能夠經過一個統一的接口來使用Spark支持的全部集羣管理器(目前Spark支持的集羣模式有自帶的Standalone、Apache Mesos、Hadoop YARN、Kubernetes),所以你沒必要爲每一個集羣模式特地配置你的應用程序。html

Bundling Your Application's Dependencies捆綁應用程序的依賴項

若是你的代碼依賴其餘項目,你須要將它們和你的應用程序一塊兒打包,以便將代碼分發到Spark集羣。爲了完成這個,須要建立一個包含你的代碼和它的依賴項的assembly jar包(或者 「uber」 jar)。sbt和Maven都有assembly插件。當建立assembly jars時,將Spark和Hadoop列爲provided的依賴項;這意味着不須要捆綁它們由於集羣管理器在運行時已經提供了這些依賴項。一旦你有assembled jar包,當使用你的jar時能夠調用bin/spark-submit腳本。java

對於Python,你可使用spark-submit--py-files參數去添加.py.zip或者.egg 文件去分發你的應用程序。若是你依賴多個Python文件,咱們要求把它們打包進一個.zip或者.egg文件。python

Launching Applications with spark-submit經過spark-submit啓動程序

用戶程序被捆綁後,可使用bin/spark-submit腳本啓動它。這個腳本負責使用Spark及其依賴項設置類路徑,而且能夠支持Spark支持的不一樣集羣管理器和部署模式:shell

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

一些通用的選項有:apache

參數名稱 說明
--master MASTER_URL 集羣的master URL,能夠是spark://host:port、mesos://host:port、yarn、yarn-cluster、yarn-client、local
--deploy-mode DEPLOY_MODE Driver程序運行的方式,Client或者Cluster,默認值是Client
--class CLASS_NAME 應用程序的入口點,主類名稱,含包名(e.g. org.apache.spark.examples.SparkPi)
--name NAME Spark Application的名稱
--jars JARS 加入到Driver和Executor的ClassPath中的jar包列表,以逗號分隔
--py-files PY_FILES 用逗號隔開的放置在Python應用程序PYTHONPATH上的.zip、.egg、.py文件列表
--files FILES 用逗號隔開的每一個Executor運行時須要的配置文件列表
--conf 以key-value格式的任意Spark配置屬性。對於包含空格的值,在引號中包含"key=value"
--properties-file FILE 設置應用程序屬性的文件路徑,默認時$SPARK_HOME/conf/spark-defaults.conf
--driver-memory MEM Driver程序運行時使用的內存大小,默認爲512MB
--driver-java-options Driver程序運行時的一些Java配置選項,好比GC相關信息,新生代大小設置等
--driver-library-path Driver程序依賴的第三方jar包
--driver-class-path Driver程序的類路徑
--driver-cores NUM Driver程序的使用CPU個數,僅限於Standalone模式,默認爲1個
--executor-memory MEM Executor運行時使用的內存大小,默認爲1GB
--total-executor-cores NUM executor使用的總核數,僅限於Standalone、Spark on Mesos模式
--executor-cores NUM 每一個Executor使用的內核數,默認爲1,僅限於Spark on Yarn模式
--num-executors NUM 啓動的Executor數量,默認是2個,僅限於Spark on Yarn模式
--supervise 失敗後是否重啓Driver,僅限於Standalone模式
--queue QUEUE_NAME 提交應用程序給哪一個Yarn的隊列,默認是default隊列,僅限於Spark on Yarn模式
--archives ARCHIVES 逗號分隔的歸檔文件列表,會被解壓到每一個Executor的工做目錄中,僅限於Spark on Yarn模式
application-jar 一個包含應用程序和所有依賴項的捆綁jar的路徑。URL必須在集羣中全局可見,例如,hdfs://路徑或者在全部節點上都存在的file://路徑。
application-arguments 傳遞給main類的main方法的參數(若是有的話)


常見的部署策略是從與工做計算機物理上位於同一位置的網關計算機(例如,獨立EC2集羣中的主節點)提交應用程序。
在這一設置中,clien模式是適用的。在client模式下,在集羣中扮演client的spark-submit進程中直接啓動驅動程序driver。應用程序的輸入輸出附加到控制檯。所以,這模式特別適用於設計REPL的應用程序(例如Spark shell)。api

或者,若是你的應用程序從遠離工做計算機的計算機提交的(例如,在筆記本電腦上本地提交的),則一般使用cluster模式去最小化驅動程序drivers和執行程序executors之間的網絡延遲。當前,standalone模式不支持Python應用程序的集羣模式。安全

對於Python應用程序,只需傳遞一個.py文件替代<application-jar>而不是JAR,並使用--py-files將Python .zip,.egg或.py文件添加到搜索路徑中。服務器

有一些特定於正在使用的集羣管理器的可用選項。例如,對於具備cluster部署模式的Spark standalone集羣,你也能夠指定--supervise去確保驅動程序driver在失敗且退出代碼爲非零時自動重啓。要枚舉全部可用與spark-submit的選項,請使用--help運行它。網絡

# Run application locally on 8 cores 用8個核本地運行應用程序 ./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 在client部署模式下運行Spark standalone集羣 ./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在具備supervise的cluster部署模式運行Spark standalone ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://207.184.138:7077 \
   --deploy-mode cluster \ --supervise \ --executor-memory 20G \ --total-executor-cores 100 \ /path/to/examples.jar \ 1000 # Run on a YARN cluster 在Yarn集羣上運行 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 # Run a Python application on a Spark standalone cluster在spark的standalone上部署Python應用程序 ./bin/spark-submit \ --master spark:207.184.161.138:7077 \ examples/src/main/python/pi.py # Run on a Mesos cluster in cluster deploy mode with supervise在具備supervise的cluster部署模式運行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 # Run on a Kubernetes cluster in cluster deploy mode在cluster部署模式上運行Kubernetes ./bin/spark-submit \ --class org.apache.spark.example.SparkPi \ --master k8s://xx.yy.zz.ww:443
  --deploy-mode cluster --num-executors 50 http://path/to/examples.jar \
  1000

Master URLS

傳遞給Spark的主URLs能夠採用以下格式之一:app

Master URL Meaning
local 使用一個工做線程在本地運行Spark(i.e. 根本沒有並行)。
local[K] 使用K個工做線程在本地運行Spark(理想的,把它設置成你機器的核數)
local[K, F] 使用K個工做線程和F最大錯誤在本地運行Spark。
local[*] 使用與計算機上的邏輯核心同樣多的工做線程在本地運行Spark。
local[*, F] 使用與計算機上的邏輯核心同樣多的工做線程和F最大錯誤在本地運行Spark。
spark://HOST:PORT 鏈接到給定的Spark standalone cluster模式主服務器。端口必須是你的主服務器配置使用的那個,默認7077。
spark://HOST1:PORT1,HOST2:PORT2 鏈接到給定的Spark standalone  cluster模式,其帶有zookeeper的備用主服務器。該列表必須具備使用Zookeeper設置的高可用集羣中的全部主機hosts。端口必須是每一個主服務器配置使用的那個,默認7077。
mesos://HOST:PORT 鏈接到給定的Mesos集羣。端口必須是你配置使用的那個,默認5050。或者,對於使用zookeeper的Mesos集羣,使用mesos://zk://...。使用deploy-mode cluster提交,HOST:PORT應該配置去鏈接MesosClusterDispatcher。
yarn 根據--deploy-mode的值,以客戶端或集羣模式鏈接到YARN集羣。集羣位置將根據HADOOP_CONF_DIR或YARN_CONF_DIR變量找到。
k8s://HOST:PORT 以cluster模式鏈接到Kubernetes集羣。client模式當前不支持,將會在未來的版本支持。HOST和PORT參考[Kubernetes API服務器](https://kubernetes.io/docs/reference/generated/kube-apiserver/)。默認使用TLS鏈接。爲了強制它使用不安全的鏈接,你可使用k8s://http://HOST:PORT。

Loading Configuration from a File從文件加載配置

spark-submit腳步能夠從一個屬性文件加載默認的Spark配置值,並將它們傳遞到你的應用程序。默認它將會從Spark目錄下的conf/spark-defaults.conf讀取選項。更多詳情,在loading default configurations上查看節點。

以這種方式加載默認的Spark配置能夠避免某些標誌須要Spark-submit。例如,若是設置spark.master屬性,你能夠安全地從spark-submit中省略--master標誌。一般,在SparkConf上顯式設置的配置值採用最高優先級,而後是傳遞給spark-submit的標誌,而後是默認文件中的值。

若是你不清楚配置選項的來源,能夠經過使用--verbose選項運行spark-submit來打印出細粒度的調試信息。

Advanced Dependency Management更高級的依賴管理

當使用spark-submit,應用程序jar以及--jars選項中包含的任何jar都將自動傳輸到集羣。在--jars以後提供的URL必須用逗號分隔。該列表包含在驅動程序driver和執行程序executor類路徑中。目錄擴展不適用於--jars

Spark使用如下的URL方案來容許傳播jar的不一樣策略:

  • file:-絕對路徑和file:/ URIs由驅動程序driver的HTTP文件服務器提供服務,每一個執行程序executor從驅動程序driver HTTP服務器提取文件。
  • hdfs:, http:, https:, ftp: -這些按預期從URI中下拉文件和JAR。
  • local: -以local:/開頭的URI應該做爲每一個工做節點上的本地文件存在。這意味着不會產生任何網絡IO,而且適用於推送給每一個工做者或經過NFS,GlusterFS等共享的大型文件/JARs。

注意:JARs和文件將複製到執行程序節點上的每一個SparkContext的工做目錄。隨着時間的推移,這會佔用大量空間,須要進行清理。使用YARN,能夠自動清理;使用Spark standalone,可使用spark.cleanup.appDataTtl屬性來配置清理。

用戶還能夠經過使用--packages提供以逗號分隔的Maven座標列表來包含任何其餘依賴項。 使用此命令時將處理全部傳遞依賴項。 可使用標誌--repositories以逗號分隔的方式添加其餘存儲庫(或SBT中的解析程序)。 (請注意,在某些狀況下,能夠在存儲庫URI中提供受密碼保護的存儲庫的憑據,例如在https:// user:password @ host / ....以這種方式提供憑據時要當心。)這些命令能夠是 與pyspark,spark-shell和spark-submit一塊兒使用以包含Spark Packages。

對於Python,可使用等效的--py-files選項將.egg,.zip和.py庫分發給執行程序。

More Information更多消息

部署應用程序後,集羣模式概述描述了分佈式執行中涉及的組件,以及如何監視和調試應用程序。

相關文章
相關標籤/搜索