Spark 应用提交指南

目录 [−]

  1. 绑定应用的依赖
  2. 使用spark-submit启动应用
  3. Master URL
  4. 从文件中加载配置
  5. 先进的依赖管理
  6. 更多信息

Spark bin文件夹下的spark-submit脚本用来启动集群中的应用。 它使用统一的提交接口支持各种类型的集群服务器, 这样你你就不必为每种类型都配置自己的应用.

绑定应用的依赖

如果你的代码依赖其它的项目,为了发布到集群中,你需要为你的应用打包它们。 这样来做: 创建一个装配assembly jar (或者 “uber” jar) 来包含你的代码和依赖. sbtMaven都有assembly 插件. 当用插件创建assembly jar时,需要将Spark 和 Hadoop设置为provided依赖; 不需要将它们打包进你的jar, 这是因为集群管理器在运行时会提供它们. 一旦你打包好,你可以调用bin/spark-submit脚本, 将你的jar作为参数.

如果使用Python, 你可以使用--py-files参数增加 .py, .zip 或者 .egg 文件. 如果你依赖多个Python文件, 我们推荐你将它们打包成一个.zip 或者 .egg.

使用spark-submit启动应用

一旦打包好,就可以使用bin/spark-submit脚本启动应用了. 这个脚本负责设置spark使用的classpath和依赖,支持不同类型的集群管理器和发布模式:

1
2
3
4
5
6
7
8
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]

一些常用选项:

  • --class: 你的应用的启动类 (如 org.apache.spark.examples.SparkPi)
  • --master: 集群的master URL (如 spark://23.195.26.187:7077)
  • --deploy-mode: 是否发布你的驱动到worker节点(cluster) 或者作为一个本地客户端 (client) (default: client)*
  • --conf: 任意的Spark配置属性, 格式key=value. 如果值包含空格,可以加引号“key=value”.
  • application-jar: 打包好的应用jar,包含依赖. 这个URL在集群中全局可见。 比如hdfs:// 共享存储系统, 如果是 file:// path, 那么所有的节点的path都包含同样的jar.
  • application-arguments: 传给main()方法的参数

一个通用发布策略是从一个网管机器提交你的应用, 这台机器物理的和你的worker机器在一起(比如在一个独立EC2集群中的Master节点). 在这种部署模式下, 适合采用client mode模式. 如果设置client模式, 驱动直接在spark-submit进程中启动,输入输出都可以显示在控制台. 所以这种模式特别适合REPL(读取-求值-输出循环), 比如Spark shell.

另外一种情况, 如果你的应用从离worker机器很远的机器提交,比如你本地笔记本,通常采用集群模式减小驱动和executor之间网络延迟。注意集群模式当前并不支持standalone clusters, Mesos clusters, 或者 python应用.

对于Python应用, 简单把.py文件取代的JAR, 并将Python .zip, .egg 或者 .py 文件增加到搜索路径中(--py-files).

使用--help列出所有的选项. 这里有一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 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
./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 YARN cluster
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn-cluster \ # can also be `yarn-client` for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# Run a Python application on a cluster
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000

Master URL

master URL可以是以下格式:

Master URL意义
local本地以一个worker线程运行(例如非并行的情况).
local[K]本地以K worker 线程 (理想情况下, K设置为你机器的CPU核数).
local[*]本地以本机同样核数的线程运行.
spark://HOST:PORT连接到指定的Spark standalone cluster master. 端口是你的master集群配置的端口,缺省值为7077.
mesos://HOST:PORT连接到指定的Mesos 集群. Port是你配置的mesos端口, 缺省是5050. 或者如果Mesos使用ZOoKeeper,格式为 mesos://zk://....
yarn-client以client模式连接到YARN cluster. 集群的位置基于HADOOP_CONF_DIR 变量找到.
yarn-cluster以cluster模式连接到YARN cluster. 集群的位置基于HADOOP_CONF_DIR 变量找到.

从文件中加载配置

spark-submit脚本可以从一个属性文件中加载缺省的Spark配置, 并把它们传给你的应用. 在默认情况下它会从Spark文件夹的conf/spark-defaults.conf读取参数,更多细节请看 加载默认配置

加载缺省配置可以避免在spark-submit设置部分参数. 举例来讲, 如果配置了spark.master, 你就可以不用在调用spark-submit脚本时设置--master参数. 通常SparkConf配置值具有最高的优先级, 然后是spark-submit的参数, 其次才是缺省文件中的值.

如果你不清楚配置项来自哪里,你可以使用--verbose打印详细的调试信息。

先进的依赖管理

当使用spark-submit, 你的应用jar以及其它通过--jars包含的jar文件将自动传送给集群。 Spark使用下面的URL scheme 为不同的策略分发jar文件:

  • file: -绝对路径和 file:/ URIs 由驱动的HTTP文件服务器提供。 每个executor从驱动的http服务器拉取文件.
  • hdfs:, http:, https:, ftp: - 从期望URI地址拉取文件
  • local: - local:/ 期望存在所有的worker节点的本地文件系统中. 这意味着没有网络I/O发生,适合已经发布到各worker节点的大的文件/jar, 或者共享的文件系统 NFS, GlusterFS等.

注意JAR和文件被复制到每个executor节点的相应的SparkContext的工作文件夹下。 长期运行会占用大量的磁盘空间,需要清理。YARN会自动清理, 而Spark standalone通过设置spark.worker.cleanup.appDataTtl来配置自动清理.

对于python, t等价的--py-files参数可以用来发布.egg, .zip 和 .py 库到executor.

更多信息

一旦你发布了你的应用,集群模式概述描述了分布执行的组件,以及如何监控和调试应用.

翻译自 Submitting Applications