Spark 提交应用

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark 提交应用相关的知识,希望对你有一定的参考价值。

Submitting Applications

http://spark.apache.org/docs/latest/submitting-applications.html

Spark 的 bin 目录中的 spark-submit 脚本用于启动集群上的应用程序。 它可以通过统一的界面使用所有 Spark 支持的 集群管理器,因此您无需配置您的应用程序尤其适用于每个应用程序。

Bundling Your Application’s Dependencies

如果您的代码依赖于其他项目,则需要将它们与您的应用程序一起打包,以便将代码分发到Spark集群。 为此,请创建一个包含代码及其依赖项的程序集 jar(或“uber”jar)。 sbtMaven 都有组装插件。 创建汇编jar时,将Spark和Hadoop列为provided依赖项; 这些不需要捆绑,因为它们是由集群管理器在运行时提供的。 一旦你有了一个组装好的 jar,你就可以在传递你的 jar 时调用 bin/spark-submit 脚本,如下所示。

对于 Python,你可以使用 spark-submit--py-files 参数来添加 .py.zip.egg 文件以与你的应用程序一起分发。 如果您依赖于多个 Python 文件,我们建议将它们打包成 .zip.egg

Launching Applications with 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: 您的应用程序的入口点 (e.g. org.apache.spark.examples.SparkPi)
  • --master: 集群的 master URL (e.g. spark://23.195.26.187:7077)
  • --deploy-mode: 是将driver部署在工作节点(cluster)上还是本地作为外部客户端(client)(默认值:client
  • --conf: key=value 格式的任意 Spark 配置属性。 对于包含空格的值,将“key=value”用引号括起来(如图所示)。 多个配置应作为单独的参数传递。 (例如--conf <key>=<value> --conf <key2>=<value2>
  • application-jar: 包含您的应用程序和所有依赖项的捆绑 jar 的路径。 URL 必须在集群内全局可见,例如,所有节点上都存在的 hdfs:// 路径或 file:// 路径。
  • application-arguments:传递给主类的 main 方法的参数(如果有)

一个常见的部署策略是从物理上与您的工作机器位于同一位置的网关机器(例如独立 EC2 集群中的主节点)提交您的应用程序。 在这个设置中,client 模式是合适的。 在client 模式下,驱动程序直接在spark-submit 进程中启动,该进程充当集群的客户端。 应用程序的输入和输出附加到控制台。 因此,这种模式特别适用于涉及 REPL 的应用程序(例如 Spark shell)。

或者,如果您的应用程序是从远离工作机器的机器提交的(例如在您的笔记本电脑本地),通常使用“集群”模式来最小化驱动程序和执行程序之间的网络延迟。 目前,独立模式不支持 Python 应用程序的集群模式。

有一些特定于正在使用的 集群管理器 的可用选项。 例如,对于具有 cluster 部署模式的 Spark Standalone cluster,您还可以指定 --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

# Run on a Kubernetes cluster in cluster deploy mode
./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

Master URLs

传递给 Spark 的主 URL 可以采用以下格式之一:

Master URLMeaning
local使用一个工作线程在本地运行 Spark(即根本没有并行性)。
local[K]使用 K 个工作线程在本地运行 Spark(理想情况下,将其设置为您机器上的内核数)。
local[K,F]使用 K 个工作线程和 F maxFailures 在本地运行 Spark(有关此变量的解释,请参阅 spark.task.maxFailures
local[*]使用与机器上的逻辑内核一样多的工作线程在本地运行 Spark。
local[*,F]使用与机器上的逻辑内核和 F maxFailures 一样多的工作线程在本地运行 Spark。
spark://HOST:PORT连接到给定的 Spark 独立集群 master。 端口必须是您的主机配置使用的任何一个,默认为 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根据 --deploy-mode 的值,以 clientcluster 模式连接到 YARN集群 . 集群位置将根据 HADOOP_CONF_DIRYARN_CONF_DIR 变量找到。
k8s://HOST:PORT根据 --deploy-mode 的值,以 clientcluster 模式连接到 Kubernetes 集群. HOSTPORT 指的是 Kubernetes API Server。 默认情况下,它使用 TLS 进行连接。 为了强制它使用不安全的连接,你可以使用 k8s://http://HOST:PORT

Loading Configuration from a File

spark-submit 脚本可以从属性文件加载默认的 Spark 配置值 并将它们传递给您的应用程序。 默认情况下,它会从 Spark 目录中的 conf/spark-defaults.conf 读取选项。 有关更多详细信息,请参阅有关加载默认配置 的部分。

以这种方式加载默认的 Spark 配置可以消除对“spark-submit”的某些标志的需要。 例如,如果设置了 spark.master 属性,你可以安全地从 spark-submit 中省略 --master 标志。 通常,在 SparkConf 上显式设置的配置值具有最高优先级,然后是标志传递给 spark-submit,然后是默认文件中的值。

如果你不清楚配置选项的来源,你可以通过运行带有 --verbose 选项的 spark-submit 打印出细粒度的调试信息。

Advanced Dependency Management

使用 spark-submit 时,应用程序 jar 以及包含在 --jars 选项中的任何 jar 将自动传输到集群。 --jars 之后提供的 URL 必须用逗号分隔。该列表包含在驱动程序和执行程序类路径中。目录扩展不适用于 --jars

Spark 使用以下 URL 方案来允许使用不同的策略来传播 jars:

  • file: - 绝对路径和 file:/ URI 由驱动程序的 HTTP 文件服务器提供服务,每个执行程序从驱动程序 HTTP 服务器拉取文件。
  • hdfs:, http:, https:, ftp: - 这些按照预期从 URI 中下拉文件和 JAR
  • local: - 以 local:/ 开头的 URI 预期作为每个工作节点上的本地文件存在。这意味着不会产生网络 IO,并且适用于推送到每个工作人员或通过 NFS、GlusterFS 等共享的大文件/JAR。

请注意,JAR 和文件被复制到执行器节点上每个 SparkContext 的工作目录中。随着时间的推移,这可能会占用大量空间,需要清理。使用 YARN,清理是自动处理的,而对于独立 Spark,可以使用 spark.worker.cleanup.appDataTtl 属性配置自动清理。

用户还可以通过使用--packages提供以逗号分隔的 Maven 坐标列表来包含任何其他依赖项。使用此命令时,将处理所有传递依赖项。可以使用标志--repositories 以逗号分隔的方式添加其他存储库(或 SBT 中的解析器)。 (请注意,在某些情况下,可以在存储库 URI 中提供受密码保护的存储库的凭据,例如在“https://user:password@host/…”中。以这种方式提供凭据时要小心。)这些命令可以与 pysparkspark-shellspark-submit 一起使用以包含 Spark 包。

对于 Python,等效的 --py-files 选项可用于将 .egg.zip.py 库分发给执行程序。

More Information

部署应用程序后,集群模式概述 描述了分布式执行中涉及的组件,以及如何监视和调试应用程序。

以上是关于Spark 提交应用的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java应用中提交Spark任务?

python+spark程序代码片段

spark使用idea以client模式提交应用到standalone集群

独立运行spark应用程序与spark提交/spark启动器之间的区别?

4. Spark 提交应用

Spark提交应用程序之Spark-Submit分析