提交申请
Spark的
bin
目录中的
spark-submit
脚本用于在集群上启动应用程序。
它可以通过统一的接口使用所有Spark支持的
集群管理器
,因此您无需为每一个特定地配置您的应用程序。
打包您的应用程序依赖项
如果您的代码依赖于其他项目,您需要将它们与您的应用程序一起打包,以便将代码分发到Spark集群。为此,创建一个包含您的代码及其依赖项的assembly jar(或“uber” jar)。
sbt
和
Maven
都有assembly插件。创建assembly jar时,将Spark和Hadoop列为
provided
依赖项;它们无需打包,因为它们在运行时由集群管理器提供。一旦您有了一个组合的jar,您可以调用
bin/spark-submit
脚本,如下所示,同时传递您的jar。
对于Python,您可以使用
--py-files
选项在
spark-submit
中添加
.py
、
.zip
或
.egg
文件,以便与您的应用程序一起分发。如果您依赖多个Python文件,我们建议将它们打包成
.zip
或
.egg
。有关第三方Python依赖项,请参见
Python包管理
。
使用spark-submit启动应用程序
一旦用户应用程序被打包,可以使用
bin/spark-submit
脚本来启动它。
该脚本负责设置 Spark 及其依赖项的 classpath,并支持 Spark 支持的不同集群管理器和部署模式:
./bin/spark-submit \
--class <主类> \
--master <主节点网址> \
--deploy-mode <部署模式> \
--conf <键>=<值> \
... # 其他选项
<应用程序-jar> \
[应用程序-参数]
一些常用的选项包括:
-
--class: 你的应用程序的入口点 (例如org.apache.spark.examples.SparkPi) -
--master: 集群的 master URL (例如spark://23.195.26.187:7077) -
--deploy-mode: 是否将你的驱动程序部署在工作节点上 (cluster) 或作为外部客户端本地部署 (client) (默认:client) † -
--conf: 任意 Spark 配置属性,格式为 key=value。如果值中包含空格,请将 “key=value” 用引号括起来 (如所示)。多个配置应作为单独的参数传递。(例如--conf)= --conf = -
application-jar: 包含你的应用程序和所有依赖项的打包 jar 的路径。该 URL 必须在你的集群内全局可见,例如,一个hdfs://路径或在所有节点上存在的file://路径。 -
application-arguments: 传递给你主类的主方法的参数(如果有的话)
†
一种常见的部署策略是从一个与工作机器物理上位于同一地点的网关机器提交你的应用程序(例如,独立 EC2 集群中的主节点)。在这种设置中,
client
模式是合适的。在
client
模式下,驱动程序直接在
spark-submit
进程中启动,该进程作为集群的
客户机
。应用程序的输入和输出与控制台关联。因此,这种模式特别适合涉及 REPL 的应用程序(例如,Spark shell)。
或者,如果您的应用程序是从远离工作机器的机器上提交的(例如,您本地的笔记本电脑),通常会使用
cluster
模式来最小化驱动程序与执行器之间的网络延迟。目前,独立模式不支持 Python 应用程序的集群模式。
对于Python应用程序,只需将一个
.py
文件放在
的位置,并使用
--py-files
将Python
.zip
、
.egg
或
.py
文件添加到搜索路径中。
有一些特定于正在使用的
集群管理器
的选项可用。
例如,使用
Spark 独立集群
和
cluster
部署模式,
您还可以指定
--supervise
,以确保如果驱动程序因非零退出代码失败,则会自动重启。要列出所有可用于
spark-submit
的选项,
请使用
--help
运行它。以下是一些常见选项的示例:
# 在本地使用8个核心运行应用程序
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# 在客户端部署模式下运行Spark独立集群
./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独立集群
./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集群的集群部署模式下以监督方式运行
./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集群的集群部署模式下运行
./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]
|
在本地使用 K 个工作线程运行 Spark(理想情况下,将此设置为机器上的核心数)。 |
local[K,F]
|
在本地使用 K 个工作线程和 F 个最大失败次数运行 Spark(有关此变量的解释,请参见 spark.task.maxFailures )。 |
local[*]
|
在本地使用与机器上的逻辑核心数相同数量的工作线程运行 Spark。 |
local[*,F]
|
在本地使用与机器上的逻辑核心数相同数量的工作线程和 F 个最大失败次数运行 Spark。 |
local-cluster[N,C,M]
|
本地集群模式仅用于单元测试。它在单个 JVM 中模拟具有 N 个工作节点、每个工作节点 C 个核心和每个工作节点 M MiB 的内存的分布式集群。 |
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
集群,在
client
或
cluster
模式下,具体取决于
--deploy-mode
的值。
集群位置将根据
HADOOP_CONF_DIR
或
YARN_CONF_DIR
变量找到。
|
k8s://HOST:PORT
|
连接到一个
Kubernetes
集群,在
client
或
cluster
模式下,具体取决于
--deploy-mode
的值。
HOST
和
PORT
指的是
Kubernetes API 服务器
。
默认情况下,它使用 TLS 进行连接。如需强制使用不安全的连接,可以使用
k8s://http://HOST:PORT
。
|
从文件加载配置
这个
spark-submit
脚本可以从属性文件加载默认的
Spark 配置值
并传递给您的应用程序。默认情况下,它将从 Spark 目录中的
conf/spark-defaults.conf
中读取选项。有关更多细节,请参阅
加载默认配置
部分。
以这种方式加载默认的 Spark 配置可以消除某些标志对于
spark-submit
的需求。例如,如果设置了
spark.master
属性,您可以安全地从
spark-submit
中省略
--master
标志。通常,显式设置在
SparkConf
上的配置值优先级最高,其次是传递给
spark-submit
的标志,然后是默认文件中的值。
如果您不清楚配置选项来源于何处,可以通过运行
spark-submit
并使用
--verbose
选项来打印出详细的调试信息。
高级依赖管理
使用
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 预计在每个工作节点上作为本地文件存在。这意味着不会产生网络输入输出,并且对于被推送到每个工作节点的大文件/JAR,或者通过 NFS、GlusterFS 等共享的文件效果良好。
注意,对于每个 SparkContext,JAR 文件和文件被复制到执行节点的工作目录中。随着时间的推移,这可能会占用大量空间,并且需要进行清理。使用 YARN 时,清理会自动处理,而使用 Spark 独立模式时,可以通过
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
库
到执行器。
更多信息
一旦您部署了应用程序, 集群模式概述 描述了参与分布式执行的组件,以及如何监控和调试应用程序。