Spark的bin目录下的spark-submit脚本用来启动集群上的应用程序。通过统一的接口此脚本可以使用Spark的所有支持 集群管理 功能,所以你不需要为每一个应用程序专门进行配置。
捆绑应用程序的依赖项
如果您的代码依赖于其他项目,您需要把它们打包一起以便将应用程序分发到Spark集群。要做到这一点, 创建一个包含代码及其依赖项的组装jar(或“uber”jar)。 sbt 和 Maven 都有组装的插件。 在创建组装jar时,把Spark和Hadoop作为依赖,这些不需要打包,因为它们是在集群管理器的运行时提供的。 一旦你有了一个组装jar,就可以像下面可以看到的那样通过传递组装jar调用 bin/spark-submit脚本。
对于Python, 你可以使用spark-submit的 --py-files 参数添加 .py , .zip或者 .egg 文件来发布您的应用程序。如果有多个Python文件, 建议把这些文件打包成一个.zip 或 .egg。
使用spark-submit启动应用程序
一旦用户应用程序捆绑好了,就可以使用 bin/spark-submit脚本进行启动。这个脚本负责设置Spark类路径以及依赖关系,可以支持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.examples.SparkPi)
· --master : 集群的master URL (如spark://23.195.26.187:7077)
· --deploy-mode :在work节点上部署你的驱动(cluster)或作为一个外部客户端(client)(默认值: client)
· --conf :任意键值对格式的Spark配置属性。对于包含空格值的键值对,需要将键值对用双引号引起来,如“键=值”。
· application-jar : 包括应用程序和所有依赖项的jar包路径。 URL必须是在集群内全局可见的,例如,一个 hdfs:// 路径或一个 file:// 路径。
· application-arguments 传递给主类入口方法的参数
† 一个常见的部署策略是从一个物理上与执行机同一个网关的机器上提交应用程序 (如在一个独立的EC2集群的主节点(master节点))。 在这种情况下, 客户端 模式是合适的。客户端 模式,驱动程序直接作为 集群的客户端在spark-submit进程内启动。 应用程序的输入和输出连接到控制台。 因此,这种模式尤其适合涉及REPL的应用程序(例如Spark shell)。
或者,如果应用程序提交机器远离执行机器(例如自己的笔记本),一般使用 集群 模式,以最小化网络延迟。 但请注意, 集群 模式目前不支持 mesos集群和Python应用程序。
对于Python应用程序, 在 <application-jar>参数项传入 .py文件,而不是jar包, 并且添加Python的 . zip , .egg 或 . py 文件到--py-files参数项。
对于不同的 集群管理器 有一些特定的可用选项。 例如,一个 独立的Spark 集群与 集群 部署模式, 你还可以指定 --supervise 来确保非零退出代码失败应用程序能自动重启。所有这些spark-submit可选项 , 运行spark-submit --help。 下面是一些比较常见的选项的例子:
# 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-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 Spark Standalone cluster
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
Master URL
传递给Spark的Master URL有下列格式:
Master URL |
说明 |
local |
使用一个工作线程在本地运行Spark (即没有并行性)。 |
local[K] |
使用K个工作线程本地运行Spark(理想情况下,设置此K为机器的CPU核数)。 |
local[*] |
根据机器的逻辑核数使用尽可能多的工作线程本地运行Spark。 |
spark://HOST:PORT |
连接到给定的 Spark独立集群 的master。 端口是master配置使用的端口,默认7077。 |
mesos://HOST:PORT |
连接到给定的 Mesos 集群。 端口为机器配置使用的端口,默认5050。 对于使用 ZooKeeper的集群使用 |
yarn-client |
客户端模式连接到一个 yarn 集群。 集群的位置根据HADOOP_CONF_DIR变量获得。 |
yarn-cluster |
集群模式连接到一个 yarn 集群。 集群的位置基于HADOOP_CONF_DIR变量获得。 |
从文件加载配置
spark-submit脚本可以从一个属性文件加载默认 Spark配置值 并将它们传递给应用程序。 默认情况下它会从 Spark目录下的conf/spark-defaults.conf读取选项。 更多细节,请参阅 加载默认配置部分 。
这样加载Spark默认配置可以排除spark-submit某些标志的必要性。例如,如果 spark.master属性设置,那么可以安全地从 spark-submit忽略 --master标识。 一般来说,显式地设置在SparkConf的配置值享有最高的优先级,然后是传递给spark-submit的标识,再然后才是默认文件配置值。
如果你不清楚配置选项来自哪里,可以 给spark-submit加上--verbose标识打印出细粒度运行调试信息。
先进的依赖管理
当使用 spark-submit时,应用程序jar以及任何列在—jars选项中的jar包将自动上传到集群。 Spark使用以下URL格式来分发不同的jar包:
· file: 绝对路径, file:/uri由驱动程序的HTTP文件服务器提供,每一个执行器从驱动程序的HTTP服务器获取文件。
· hdfs: , http: , https: , ftp: 从URI定义的路径获取文件和jar包
· local: 这种格式意味着每个工作节点上存在URI对应的本地文件。 这种方式不会产生网络IO,适用于将大文件/jar包推送到工作节点,或者通过NFS,GlusterFS等等共享。
注意,jar包和文件被复制到每个执行节点SparkContext的工作目录上。 随着时间的推移,这会使用大量的空间,需要进行清理。 对于yarn,清理是自动进行的,而独立的Spark,可以通过配置 spark.worker.cleanup.appDataTtl属性来指定自动清理。
用户可能还包括其他通过—packages标识以逗号分隔列表指定的依赖项,这些依赖项由maven提供。当使用这个命令时,所有指定的依赖项都将被处理。 额外的存储库(在SBT是解析器)可以通过—repositories标识以逗号分隔列表来添加。 这些命令标识配合pyspark , spark-shell , spark-submit 来包含Spark包。
对于Python, --py-files选项有相同的功能,可用来分发 .egg , .zip和.py库到执行器。
更多信息
一旦你的应用程序已经部署, 可以到集群模式概述 看看,这里有分布执行器的组件以及如何监控和调试应用程序的描述。