Submitting Applications提交應用程序
在spark的bin目錄下spark-submit腳本被用於在集群中啟動應用程序。它可以通過一個統一的接口來使用Spark支持的所有集群管理器(目前Spark支持的集群模式有自帶的Standalone、Apache Mesos、Hadoop YARN、Kubernetes),因此你不必為每個集群模式特意配置你的應用程序。
Bundling Your Application's Dependencies捆綁應用程序的依賴項
如果你的代碼依賴其他項目,你需要將它們和你的應用程序一起打包,以便將代碼分發到Spark集群。為了完成這個,需要創建一個包含你的代碼和它的依賴項的assembly jar包(或者 “uber” jar)。sbt和Maven都有assembly插件。當創建assembly jars時,將Spark和Hadoop列為provided的依賴項;這意味着不需要捆綁它們因為集群管理器在運行時已經提供了這些依賴項。一旦你有assembled jar包,當使用你的jar時可以調用bin/spark-submit腳本。
對於Python,你可以使用spark-submit的--py-files參數去添加.py,.zip或者.egg 文件去分發你的應用程序。如果你依賴多個Python文件,我們要求把它們打包進一個.zip或者.egg文件。
Launching Applications with spark-submit通過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]
一些通用的選項有:
| 參數名稱 | 說明 |
| --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)。
或者,如果你的應用程序從遠離工作計算機的計算機提交的(例如,在筆記本電腦上本地提交的),則通常使用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可以采用如下格式之一:
| 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更多消息
部署應用程序后,集群模式概述描述了分布式執行中涉及的組件,以及如何監視和調試應用程序。
