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库分发到执行器。
更多信息
一旦部署了您的应用程序,集群模式概述描述了分布式执行涉及的组件,以及如何监视和调试应用程序。
338

被折叠的 条评论
为什么被折叠?



