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支持的不同的集群管理器和部署模式。
一些常用的选项:
–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应用,在
这里有一些选项可用,用来指定使用的集群管理器。例如,对于cluster部署模式的standalone管理器管理的Saprk集群,你可以指定 –supervise 来保证在非0退出代码时,driver被自动重启。要枚举spark-submit所有可用的选项,使用–help运行spark-submit。这里有些常用的选项:
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 描述了分布式执行中的各个组件,以及如何监控和调试应用。