提交申请

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> \
[应用程序-参数]

一些常用的选项包括:

一种常见的部署策略是从一个与工作机器物理上位于同一地点的网关机器提交你的应用程序(例如,独立 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文件:

注意,对于每个 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 库 到执行器。

更多信息

一旦您部署了应用程序, 集群模式概述 描述了参与分布式执行的组件,以及如何监控和调试应用程序。