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更多消息
部署应用程序后,集群模式概述描述了分布式执行中涉及的组件,以及如何监视和调试应用程序。