Spark-Submit简介
spark-submit脚本用于在集群上启动应用程序,它位于Spark的bin目录中。这种启动方式可以通过统一的界面使用所有的Spark支持的集群管理功能,因此您不必为每个应用程序专门配置应用程序。
绑定应用程序的依赖关系
如果您的代码依赖于其他项目,则需要将它们与应用程序一起打包,才能将代码分发到Spark群集。为此,请创建一个包含代码及其依赖关系的程序集jar(或“uber”jar)。 sbt和Maven都有集成插件。创建程序集jar时,列出Spark和Hadoop作为提供的依赖项;这些不需要捆绑,因为它们在运行时由集群管理器提供。一旦你有一个组装的jar,你可以调用bin/spark-submit
脚本,传递你的jar。
对于Python,您可以使用spark-submit
的--py-files
参数来添加.py,.zip或.egg文件以与应用程序一起发布。如果您依赖多个Python文件,我们建议将它们打包成.zip或.egg。
使用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]
一些常用的选项是:
--class
:应用程序的入口点,main函数所在的类(例如org.apache.spark.examples.SparkPi
)--master
:群集的主网址(例如spark://23.195.26.187:7077
)--deploy-mode
:是否将驱动程序部署在工作节点(cluster
)上,或作为外部客户机(client
)本地部署(默认值:client
)†--conf
:Key = value
格式的任意Spark配置属性。对于包含空格的值,用引号括起“key = value”(参见示例)。application-jar
:包含应用程序和所有依赖关系的捆绑jar的路径。该URL必须在集群内全局可见,例如hdfs://路径或所有节点上存在的file://路径。application-arguments
:参数传递给主类的main方法(如果有的话)
†常见的部署策略是从与您的工作机器物理上位于的网关机器提交应用程序(例如,独立的EC2集群中的主节点)。在此设置中,client
模式是适当的。在client模式下,驱动程序直接在spark-submit
过程中启动,该过程充当集群的客户端。应用程序的输入和输出连接到控制台。因此,该模式特别适用于涉及REPL(例如Spark shell)的应用。
或者,如果您的应用程序从远离工作机器(例如本地在笔记本电脑上)的机器提交,通常使用cluster
模式来最大限度地减少驱动程序和执行程序之间的网络延迟。目前,独立模式不支持Python应用程序的集群模式。
对于Python应用程序,只需将.py文件传递到<application-jar>
而不是JAR文件中,并使用--py
文件将Python .zip,.egg或.py文件添加到搜索路径。
有几个可用的选项是特定于正在使用的集群管理器。例如,使用具有集群部署模式的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
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # can be client for client mode
--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
Master URLs
传递给Spark的主URL可以是以下格式之一:
Master URL | 解释 |
---|---|
local |
在本地运行Spark一个工作线程(即根本没有并行性)。 |
local[K] |
使用K个工作线程在本地运行Spark(理想情况下,将其设置为机器上的核心数)。 |
local[*] |
在本地运行Spark,其工作线程与机器上的逻辑内核一样多。 |
spark://HOST:PORT |
连接到给定的Spark独立集群主控。端口必须是您的主机配置为使用哪个,默认情况下为7077。 |
mesos://HOST:PORT |
连接到给定的Mesos集群。端口必须是您配置为使用的端口,默认值为5050。或者,对于使用ZooKeeper的Mesos集群,请使用mesos://zk://.... 要使用--deploy-mode 集群提交,HOST:PORT应配置为连接到MesosClusterDispatcher。 |
yarn |
根据-deploy-mode的值,以客户端(client )或集群(cluster )模式连接到YARN群集。将基于HADOOP_CONF_DIR或YARN_CONF_DIR变量找到集群位置。 |
从文件加载配置
spark-submit脚本可以从属性文件加载默认的Spark配置值,并将它们传递到应用程序。默认情况下,它将从Spark目录中的conf/spark-defaults.conf
中读取选项。有关详细信息,请参阅有关加载默认配置的部分。
以这种方式加载默认Spark配置可以避免需要某些标志来引发提交。例如,如果设置了spark.master
属性,则可以从spark-submit
中安全地省略--master
标志。通常,在SparkConf上显式设置的配置值具有最高优先级,然后将标志传递给spark-submit,然后将该值设置为默认值。
如果您不清楚配置选项的来源,您可以使用--verbose
选项运行spark-submit
来打印出细粒度的调试信息。
高级依赖管理
当使用spark-submit时,应用程序jar以及-jars
选项中包含的任何jar将被自动传输到群集。 --jars
之后提供的URL必须用逗号分隔。该列表包含在驱动程序和执行器类路径上。目录扩展不适用于--jars
。
Spark使用以下URL方案来允许不同的策略来传播jar:
file:
– 绝对路径和file:/
URI由驱动程序的HTTP文件服务器提供,每个执行程序从驱动程序HTTP服务器提取文件。hdfs:, http:, https:, ftp:
– 这些按照预期从URI中下拉文件和JARlocal:
– 以local:/
开头的URI预计作为每个工作节点上的本地文件存在。这意味着不会出现网络IO,并且适用于推送到每个工作者的大型文件/ JAR,或通过NFS,GlusterFS等共享。
请注意,JAR和文件将复制到执行程序节点上每个SparkContext的工作目录。这可能会随着时间的推移占用大量空间,并需要清理。使用YARN,清理将自动进行处理,并且通过Spark standalone,可以使用spark.worker.cleanup.appDataTtl
属性配置自动清理。
用户可以通过提供逗号分隔的maven坐标列表与--packages
来包含任何其他的依赖关系。使用此命令时将处理所有传递依赖关系。可以使用标记--repositories
以逗号分隔的方式添加附加存储库(或SBT中的解析器)。 (请注意,在某些情况下,可以在存储库URI中提供受密码保护的存储库的凭据,例如https://user:password@host/....
在以这种方式提供凭据时请小心。)这些命令可以是与pyspark,spark-shell和spark-submit一起使用,包括Spark Packages。
对于Python,等效的--py-files
选项可用于将.egg,.zip和.py库分发到执行程序。
spark submit示意图
进阶阅读
部署应用程序后,[集群模式概述][http://spark.apache.org/docs/latest/cluster-overview.html]将介绍分布式执行中涉及的组件以及如何监视和调试应用程序。