Spark 2.3.1 Submit Applications

Submitting Applications

Spark的bin目录下的spark-submit脚本用于在一个集群上启动一个应用。通过一个统一的接口,它可以使用所有Spark支持的集群管理器,因此你不需要针对每种集群管理器来单独配置你的应用。

Bunding Your Application’s Dependencies

如果你的代码依赖其他项目,那么你需要将它们和你的应用一并打包,以便分发代码到一个spark集群。要完成这些,需要创建一个assembly jar(uber jar)来包含你的代码和代码的依赖。sbt和Maven都有assembly插件。当创建assembly jar时,排除Spark和Hadoop提供的依赖,因为这些不需要绑定,因为这些将由集群管理器在运行时提供。一旦你弄好了assembly jar,你就可以如下所示在调用 bin/spark-submit脚本是传递你的jar。
对于Python,你可以使用spark-submit的–py-files参数来添加.py、.zip或.egg文件,让他们和你的应用一起分发。如果你依赖多个python文件,我们推荐将他们打到一个.zip或.egg包中。

Launching Applications with spark-submit

一旦一个用户应用被绑定,就可以使用bin/spark-submit脚本来启动这个应用。这个脚本负责设置Spark的classpath和它依赖,而且脚本支持由Spark支持的不同的集群管理器和部署模式。

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.example.SparkPi)
–master:集群的master URL(如:spark://23.195.26.187:7077)
–deploy-mode:在worker节点(cluster)上部署你的driver还是在本地作为一个额外的客户端(client)来部署。默认是client。
–conf:以key=velue格式配置的任意的Spark配置属性。对于包含空格的值,使用双引号包含起来,如”key=value”。
application-jar:指向你的应用程序和它依赖的jar的路径。这个URL必须是你集群内部全局可见,例如,一个hdfs://路径或一个在所有节点上都存在的file://路径。
application-arguments:任何需要传递给你的主类的主方法的参数。

常见的部署策略是,在一个与你的worker机位置相同的gateway机器上提交你的应用。在这种设置中,client模式是合适的,driver在spark-submit进程中被直接启动,这种方式像是集群的一个client。这个应用的输入和输出被打印到控制台。因此这种模式特别适合那些涉及REPL的应用。

此外,如果你的应用是用一个远离worker机器的机器上提交的,通常使用cluster模式来降低drivers和executors之间的网络传输。目前,standalone模式还不能够为Python应用提供cluster模式。

对于Python应用,在处传递一个.py来代替一个jar,在–py-files中添加.zip、.egg或.py,作为搜索目录。

这里有一些选项可用,用来指定使用的集群管理器。例如,对于cluster部署模式的standalone管理器管理的Saprk集群,你可以指定 –supervise 来保证在非0退出代码时,driver被自动重启。要枚举spark-submit所有可用的选项,使用–help运行spark-submit。这里有些常用的选项:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 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的master URL可以是下面格式中的一个:

Master URL Meaning
local 使用单个线程以本地模式运行Spark
local[K] 使用K个线程以本地模式运行Spark
local[K, F] 使用K个线程以本地模式运行Spark,允许最多F个失败
local[*] 使用与你机器逻辑核数相同的线程,以本地模式运行Spark
local[*, F] 使用于你机器逻辑核数相同的香橙,以本地模式运行Spark,允许最多F个失败
spark://HOST:PORT 连接到给定的以standalone模式运行的集群的Master。端口必须是你的master所配置使用的,默认为7077
spark://HOST1:PORT1,HOST2:PORT2 连接到使用了Zookeeper以standalone模式运行的带有standby master的集群。这个列表必须包含了使用Zookeeper配置的高可用集群的所有master的host。端口必须是你的master所配置使用的,默认为7077。
mesos://HOST:PORT 连接到给定的以MESOS模式运行的集群。端口必须是你的配置中使用的,默认为5050。或者,对于使用了Zookeeper的Mesos集群,使用mesos://zk://…配合–deploy-mode cluster来提交,HOST:PORT应该被配置为连接到MesosClusterDispatcher。
yarn 以cluster或client模式连接到yarn集群,连接模式通过 –deploy-mode来指定。这个集群的位置将基于HADOOP_CONF_DIR或YARN_CONF_DIR变量来找到。
k8s://HOST:PORT 以cluster模式连接到Kubernetes集群。Client模式当前还不支持,将会在未来被支持。HOST和PORT指向[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的值,最后是默认文件里的值。

如果你无法确认配置项的值来自哪里,你可以在运行spark-submit是使用-verbose选项,将细粒度的调试信息打印出来。

Advanced Dependency Management

在使用spark-submit的时候,应用程序jar以及使用–jars选项包含的人和jar将会自动传输到集群。–jars后面提供的URLs必须以逗号分隔。那个列表被包含在driver和executor的classpath中。目录范围在–jars中不起作用。
Spark使用如下的URL模式来允许不同的策略传递jar:

file: 绝对路径,并且file:/ URLs由driver的HTTP文件服务提供服务,每个executor从driver的HTTP服务拉取文件。
hdfs:、http:、https:、ftp: 这些按照期望的那样从URI拉取文件和Jars。
local: 一个以local:/开头的URI,希望作为每个worker节点上的本地文件而存在。这意味着将不会发生网络IO。这种适用于将较大文件或jar推送到每个worker或通过NFS、GlusterFS等共享较大文件或Jar的方式。

注意,JARs和文件会为每个运行在executor节点上的SparkContext拷贝一份到工作目录。随着时间的推移,这将耗费大量的空间,因此需要清理。对于使用YARN的方式,清理将会自动方式;对于使用standalone方式的,自动清理工作可以通过spark.worker.cleanup.appDataTtl属性配置。

用户还可以通过使用-packages提供以逗号分隔的Maven坐标列表来包含任何其他依赖。使用此命令时,所有传递的依赖都将被处理。另外,使用–repositories选项,还可以用来添加maven库。多个库之间使用逗号分隔。这些命令可以被pyspark、spark-shell以及spark-submit来使用来包含Saprk包。
对于Python,–py-files选项可以被用来分发.egg、.zip以及.py文件到executors。

More Information

一旦你部署了你的应用,cluster mode overview 描述了分布式执行中的各个组件,以及如何监控和调试应用。