提交任务
Spark-submit是bin目录下的用来在集群上启动应用程序的方法。它可以使Spark使用统一的接口管理ClusterManager,使得你不必为每一个程序进行单独部署
打包应用的依赖
如果你的代码依赖于其他的项目,你将需要把应用程序分发到集群上面,为此,创建一个打包文件(或者更高级的“JAR”文件)包含代码和它所依赖的。使用SBT或者Maven进行加载。创建打包文件的时候,Spark和Hadoop的文件不需要打包,因为这些是在ClusterManager上面的设置。一旦你拥有了一个包文件,你可以调用bin/spark脚本来运行它。
Python,你可以使用--.py文件参数作为Spark的补充,.py.zip.egg等文件都可以在你的程序中进行使用。如果你有多个.py文件,我们建议包装秤.zip或者.egg
使用Spark-submit提交申请
一旦应用程序捆绑在了一起,可以使用bin/spark-submit脚本提交,这个脚本会为Spark设置classpath和它的依赖,可以支持不同的ClusterManager以及他们对Spark的管理。
./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:你的部署是在工作节点(cluster)还是外部节点(client)默认client*
--conf:键值对模式的任意属性,值包含空格引用"key=value"
application-jar:jar包和你的程序依赖的地址,这个地址必须在集群上面可见的,比如hdfs://path或者file://path(当前节点)
application-argument:主要方法的参数,如果有的话
*一个部署策略是提交你的程序到一个作为入口的物理机器(比如Ec2集群的Master)在这种安装模式下,客户端模式是很合适的。在客户端模式下,driver直接在spark-submit过程中发送,与输入输出直接连接到控制台应用,涉及到REPL(读取-求值-输出循环,例如Spark Shell)
另外,如果你的应用程序从远离工作机器(例如在你的笔记本电脑上)它是常见的使用集群模式以减少drivers和执行者之间的网络延迟。请注意集群模式当前不支持standaloneclusters,Mesos cluster或者Python applications
对于python应用程序,只需要在<application-jar>中添加一个py文件,jar文件,或者egg文件即可,py文件的搜索路径是--py-files
几个例子
#本地运行程序在8核上面
./bin/spark-submit \
--classorg.apache.spark.example.SparkPi \
--master local[8] \
/path/to/example.jar
100
#运行在spark 独立集群
./bin/spark-submit \
--classorg.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077\
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/example.jar \
1000
#运行在Yarn集群
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--classorg.apache.spark.example.SparkPi \
--master yarn-cluster \#可以使用yarn-client启用client模式
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
#运行在集群的Python程序上
./bin/spark-submit \
--master spark://207.184.161.138:7077\
examples/src/main/python/pi.py \
1000
Master地址
SparkMasterURL有以下几个选择形式
Local | 本地一个工作者的线程运行(不并行运行) |
Local[k] | 局部K个工作者运行Spark(理想状态下,设置为你机器的核数) |
Local[*] | 以尽可能多的工作者线程运行,作为核心逻辑运行在机器上 |
spark://HOST:PORT | 连接到特定独立集群的主机,端口默认是7077 |
mesos://HOST:PORT | 连接特定的mesos集群,端口必须配置为特定的,默认是5050或者,为使用zookeeper,采用mesos://zk://.... |
yarn-client | 使用客户端模式连接到Yarn集群,集群位置将从HADOOP_CONF_DIR变量中寻找 |
Yarn-cluster | 使用集群端模式连接到Yarn集群,集群位置将从HADOOP_CONF_DIR变量中寻找 |
从文件中加载配置
使用spark-submit脚本可以加载默认的Spark配置,从属性文件中传递给你的应用,默认情况下,它会在Spark目录中conf/spark-default.conf中。更多信息,参考Sparkconfiguration
http://spark.apache.org/docs/latest/configuration.html#loading-default-configurations
加载默认配置,这样可以避免Spark提交一部分确认的属性,例如,如果spark-master设置了一个属性,你可以安全的把它忽略。在一般情况下,SparkConf拥有最高的优先级,然后提交spark-submit补充一些缺省的文件。
如果有不清楚的配置选项,可以使用Spark的调试信息--verbose选项
先进的依赖性管理
使用spark-submit程序jar文件以及--jars包含的选项将自动转移到集群,Spark使用以下的url方式允许不同形式的文件传播
file:绝对的路径 file:/URI是由driver的HTTP文件服务器的服务,每一个执行者吧文件从driver拖动到HTTP服务器上面。
HDFS:HTTP:HTTPS:FTP:这些文件同样是从URI拖下文件
local:local:从本地运行,默认每个文件作为工作节点的本地文件存在,这意味着没有网络IO会发生,以及大的文件或者包,push到每个工作者,或者通过NFS共享,GlusterFS等。
请注意,包和文件为每个sparkcontext的复制到工作目录中的各执行器节点,这样可以使用大量空间,随着时间的推移,需要清理。Mesos是自动清理,并与Spark独立自动清理,可以配置spark.worker.cleanup.appDataTtl属性
Python等效,.py文件可以用来分发,.egg.zip和.py库用于执行
更多的信息
一旦你部署你的应用,集群模式概述介绍参与分布式执行的组件,以及如何监控和调试应用程序。