Spark提交任务官网权威详解
bin
目录中的
spark-submit
脚本用于在集群上启动应用程序。它可以通过统一接口使用所有支持的
集群管理器,因此您不必为每个管理器单独配置应用程序。
打包应用程序依赖项
如果您的代码依赖于其他项目,您需要将它们与应用程序一起打包,以便将代码分发到Spark集群。为此,请创建一个包含您的代码及其依赖项的汇总JAR文件(也称为“uber” JAR)。sbt和Maven都有汇总插件。创建汇总JAR时,请将Spark和Hadoop列为“provided”依赖项;因为它们在运行时由集群管理器提供。一旦您有了汇总的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> \
... # 其他选项
<application-jar> \
[application-arguments]
一些常用的选项包括:
--class
:指定应用程序的入口点(例如org.apache.spark.examples.SparkPi
)。--master
:指定集群的主节点URL(例如spark://23.195.26.187:7077
)。--deploy-mode
:指定驱动程序在工作节点上部署时的模式,可以是cluster
(默认)或client
。--conf
:以key=value
格式指定任意的Spark配置属性。如果值包含空格,请使用引号将"key=value"
括起来。application-jar
:指定打包的JAR文件路径,包含您的应用程序和所有依赖项。URL必须在集群内的所有节点上都可见,可以是hdfs://
路径或所有节点上存在的file://
路径。application-arguments
:传递给主类的主方法的参数,如果有的话。
--deploy-mode
选项有两种常见的部署策略:
- 如果从与工作节点物理上相邻的网关机器(例如独立EC2集群中的主节点)提交应用程序,则适用于
client
模式。在client
模式下,驱动程序直接在spark-submit
进程中启动,spark-submit
进程充当集群的客户端。应用程序的输入和输出会附加到控制台。因此,这种模式特别适合涉及REPL(例如Spark shell)的应用程序。 - 或者,如果应用程序是从远离工作节点的机器(例如本地笔记本电脑)提交的,则通常使用
cluster
模式以最小化驱动程序和执行器之间的网络延迟。目前,独立模式不支持Python应用程序的集群模式。
对于Python应用程序,只需将.py
文件放在<application-jar>
的位置,而不是一个JAR文件,并使用--py-files
将Python .zip
、.egg
或.py
文件添加到搜索路径中。
spark-submit
还提供了一些针对所使用的集群管理器的特定选项。例如,在具有cluster
部署模式的Spark独立集群中,您还可以使用--supervise
选项,确保驱动程序在发生非零退出代码时自动重新启动。要枚举所有可用于spark-submit
的此类选项,请运行spark-submit --help
命令。
常见示例:
# 在本地使用8个内核线程运行应用程序
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# 在Spark独立集群中以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
# 在Spark独立集群中以cluster部署模式和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
# 在YARN集群上运行
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# 在Spark独立集群上运行Python应用程序
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
# 在Mesos集群中以cluster部署模式和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
# 在Kubernetes集群中以cluster部署模式运行
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master k8s://xx.yy.zz.ww:443 \
--deploy-mode cluster \
--executor-memory 20G \
--num-executors 50 \
http://path/to/examples.jar \
1000
主节点URL
传递给Spark的主节点URL可以采用以下格式:
主节点URL | 含义 |
---|---|
local | 在本地运行Spark,使用一个工作线程(即没有并行性)。 |
local[K] | 在本地运行Spark,使用K个工作线程(理想情况下,设置为您机器上的核心数)。 |
local[K,F] | 在本地运行Spark,使用K个工作线程和F个最大失败次数(请参阅spark.task.maxFailures 变量的说明)。 |
local[*] | 在本地运行Spark,使用与机器上的逻辑核心数相同数量的工作线程。 |
local[*,F] | 在本地运行Spark,使用与机器上的逻辑核心数相同数量的工作线程和F个最大失败次数。 |
spark://HOST:PORT | 连接到指定的Spark独立集群主节点。端口必须是您的主节点配置的端口,默认为7077。 |
spark://HOST1:PORT1,HOST2:PORT2 | 连接到具有Zookeeper的指定具有备用主节点的Spark独立集群。列表必须包含使用Zookeeper设置的所有主节点主机。端口必须是每个主节点配置的端口,默认为7077。 |
mesos://HOST:PORT | 连接到指定的Mesos集群。端口必须是您配置的端口,默认为5050。或者,对于使用Zookeeper的Mesos集群,使用mesos://zk://... 。要以--deploy-mode cluster 方式提交,请将HOST:PORT配置为连接到MesosClusterDispatcher的方式。 |
yarn | 连接到YARN集群,根据--deploy-mode 的值在client 或cluster 模式下连接。集群位置将基于HADOOP_CONF_DIR 或YARN_CONF_DIR 变量来确定。 |
k8s://HOST:PORT | 在Kubernetes集群中以cluster 部署模式连接。当前不支持client 模式,但将来版本将支持。HOST 和PORT 是Kubernetes API Server的地址。它默认使用TLS进行连接。为了强制使用不安全连接,可以使用k8s://http://HOST:PORT 。 |
从文件加载配置
spark-submit
脚本可以从属性文件中加载默认的Spark配置值,并将其传递给您的应用程序。默认情况下,它将从Spark目录中的conf/spark-defaults.conf
中读取选项。有关更多细节,请参阅有关加载默认配置的部分。
通过这种方式加载默认的Spark配置可以避免对spark-submit
的某些标志进行设置。例如,如果设置了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下载文件和JAR。
- local: - 以
local:/
开头的URI应该在每个工作节点上作为本地文件存在。这意味着不会产生网络IO,适用于大型文件/ JAR,这些文件/ JAR被推送到每个工作节点或通过NFS、GlusterFS等共享。
请注意,JAR文件和文件将复制到执行器节点上每个SparkContext的工作目录中。随着时间的推移,这可能会使用大量的空间,并且需要进行清理。在YARN中,清理是自动处理的;在独立模式下,可以使用spark.worker.cleanup.appDataTtl
属性配置自动清理。
用户还可以使用--packages
选项通过以逗号分隔的Maven坐标列表包含任何其他依赖项。使用此命令时,将处理所有传递依赖项。可以使用--repositories
选项以逗号分隔的方式添加其他存储库(或在SBT中添加解析程序)。(请注意,在某些情况下,可以在存储库URI中提供受密码保护存储库的凭据,例如https://user:password@host/...
。在提供凭据时要小心。)这些命令可以与pyspark
、spark-shell
和spark-submit
一起使用,以包含Spark Packages。
对于Python,可以使用相应的--py-files
选项将.egg
、.zip
和.py
库分发到执行器。
更多信息
一旦部署了您的应用程序,集群模式概述描述了分布式执行涉及的组件,以及如何监视和调试应用程序。