Spark Submit提交应用程序
英文标题:Submitting Applications
英文原址:http://spark.apache.org/docs/latest/submitting-applications.html
Spark Version:1.3.0
Spark根目录的bin目录下spark-submit脚本用于在集群上启动应用程序,它通过统一接口使用Spark所支持的所有集群管理器,因此无需特殊配置每一个应用程序。
1,绑定应用程序依赖
如果代码依赖于其它项目,为了将代码分发到Spark集群,就需要将这些依赖一起打包到应用程序中去。sbt和Maven都有装配插件,在创建装配的jar时,要列出Spark和Hadoop作为规定的依赖,如果Spark和Hadoop在集群管理器的运行时中提供了,就无需将其绑定到应用程序中去。一旦装配好jar包,就可以调用bin/spark-submit脚本执行了。
针对Python,可以使用spark-submit的—py-files参数添加.py,.zip,.egg文件和应用程序一起进行分发,如果应用程序依赖于多个Python文件,建议将它们打包成.zip或.egg文件。
2,用spark-submit启动应用程序
如果绑定了应用程序,就可以使用bin/spark-submit脚本启动应用程序了,这个脚本主要是进行Spark和应用程序依赖包的类路径(classpath)设置,并且可以支持不同的集群管理器和Spark支持的部署模式。提交任务后,无论时Standalone模式还是Spark on Yarn模式,都可以通过Web地址http://<driver-node>:4040来查看当前运行状态。
./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://localhost:7077)
--deploy-mode:将driver部署到worker节点(cluster模式)或者作为外部客户端部署到本地(client模式),默认情况下是client模式
--conf:用key=value格式强制指定Spark配置属性,用引号括起来
--application-jar:包含应用程序和所有依赖的jar包的路径,路径必须是在集群中是全局可见的,例如,hdfs://路径或者file://路径
--application-arguments:传递给主类中main函数的参数
一般的部署策略是在一个网关机器上提交应用程序,这个机器和Worker机器部署在一个网络中(例如,Standalone模式的EC2集群中的Master节点)。在此部署策略中,client模式更为合适,client模式中的driver直接跟spark-submit进程一起启动,spark-submit进程在此扮演集群中一个client的角色。应用程序的输入输出依赖于控制台,如此一来,这种模式就特别适合关于REPL(例如,Spark shell)的应用程序。
另一种部署策略是,应用程序通过一台远离Worker节点的机器提交(例如,本地或者便携设备),这种情况下,一般使用cluster模式最小化drivers和executors之间的网络延时。注意,cluster模式暂时不支持于Mesos集群或Python应用程序。Python应用程序中,简单地在application-jar处传递一个.py文件而不是JAR文件,然后用--py-files添加Python.zip,.egg或者.py文件到搜索路径。
还有一些集群管理器正在使用的可选项。例如,对于Spark Standalone的cluster部署模式,也可以使用--supervise以确定driver在遇到非0(non-zero)退出码的错误时进行自动重启。可运行spark-submit带上--help列出所有的可选项。以下是一些常用选项的例子:
# Run application locally on 8 cores
./bin/spark-submit \
--classorg.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# Run on a Spark Standalone cluster in clientdeploy mode
./bin/spark-submit \
--classorg.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 clusterdeploy mode with supervise
./bin/spark-submit \
--classorg.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 \
--classorg.apache.spark.examples.SparkPi \
--masteryarn-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 SparkStandalone cluster
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
3,Master URLs
传递给Spark的master url可以是以下任意格式之一:
master URL |
意义 |
local |
使用1个worker线程本地运行Spark(即完全没有并行化) |
local[K] |
使用K个worker线程本地运行Spark(最好将K设置为机器的CPU核数) |
local[*] |
根据机器的CPU逻辑核数,尽可能多地使用Worker线程 |
spark://HOST:PORT |
连接到给定的Spark Standalone集群的Master,此端口必须是Master配置的端口,默认为7077 |
mesos://HOST:PORT |
连接到给定的Mesos集群的Master,此端口必须是Master配置的端口,默认为5050。若Mesos集群使用ZooKeeper,则master URL使用mesos://zk://…… |
yarn-client |
以client模式连接到YARN集群,集群位置将通过HADOOP_CONF_DIR环境变量获得 |
yarn-cluster |
以cluster模式连接到YARN集群,集群位置将通过HADOOP_CONF_DIR环境变量获得 |
4,从文件中加载配置
spark-submit脚本可以通过属性文件加载默认的Spark配置值并将其传递给应用程序。默认情况下会读取Spark目录中conf/spark-default.conf文件中的各配置项,详细信息参考“加载默认配置”。
加载默认配置可以取消spark-submit命令的某些参数选项。例如,如果设置了spark.master属性,那么可以直接省略 --master选项。一般情况下,直接使用SparkConf设置的属性值具有最高的优先级,然后是spark-submit命令中传递的选项,最后才是默认配置文件中的值。如果你不清楚配置选项是来自于哪里,可以运行spark-submit --verbose打印处更细粒度的调试信息。
5,高级依赖管理
使用spark-submit时,应用程序的jar包以及通过—jars选项包含的任意jar文件都会被自动传到集群中。Spark使用了下面的URL格式允许不同的jar包分发策略。
file:,绝对路径且file:/URIs是作为driver的HTTP文件服务器,且每个executor会从driver的HTTP服务器拉取文件;
hdfs:,http:,https:,ftp:,从这些给定的URI中拉取文件和JAR包;
local:,以local:/开始的URI应该是每个worker节点的本定文件,这意味着没有网络IO开销,并且推送或通过NFS/GlusterFS等共享到每个worker大文件/JAR文件或能很好的工作。
注意,每个SparkContext的JAR包和文件都会被复制到executor节点的工作目录下,这将用掉大量的空间,然后还需要清理干净。在YARN下,清理是自动进行的。在Spark Standalone下,自动清理可以通过配置spark.worker.cleanup.appDataTtl属性做到,此配置属性的默认值是7*24*3600。
用户可以用--packages选项提供一个以逗号分隔的maven清单来包含任意其他依赖。其它的库(或SBT中的resolvers)可以用--repositories选项添加(同样用逗号分隔),这些命令都可以用在pyspark,spark-shell和spark-submit中来包含一些Spark包。对Python而言,--py-files选项可以用来向executors分发.egg,.zip和.py库。
附:集群模式概况描述了在分布式执行下时所涉及的组件,以及如何监控和调试应用程序。