目录 [−]
Spark bin文件夹下的spark-submit脚本用来启动集群中的应用。 它使用统一的提交接口支持各种类型的集群服务器, 这样你你就不必为每种类型都配置自己的应用.
绑定应用的依赖
如果你的代码依赖其它的项目,为了发布到集群中,你需要为你的应用打包它们。 这样来做: 创建一个装配assembly jar (或者 “uber” jar) 来包含你的代码和依赖. sbt 和 Maven都有assembly 插件. 当用插件创建assembly jar时,需要将Spark 和 Hadoop设置为provided依赖; 不需要将它们打包进你的jar, 这是因为集群管理器在运行时会提供它们. 一旦你打包好,你可以调用bin/spark-submit脚本, 将你的jar作为参数.
如果使用Python, 你可以使用--py-files参数增加 .py, .zip 或者 .egg 文件. 如果你依赖多个Python文件, 我们推荐你将它们打包成一个.zip 或者 .egg.
使用spark-submit启动应用
一旦打包好,就可以使用bin/spark-submit脚本启动应用了. 这个脚本负责设置spark使用的classpath和依赖,支持不同类型的集群管理器和发布模式:
|
|
一些常用选项:
- --class: 你的应用的启动类 (如 org.apache.spark.examples.SparkPi)
- --master: 集群的master URL (如 spark://23.195.26.187:7077)
- --deploy-mode: 是否发布你的驱动到worker节点(cluster) 或者作为一个本地客户端 (client) (default: client)*
- --conf: 任意的Spark配置属性, 格式key=value. 如果值包含空格,可以加引号“key=value”.
- application-jar: 打包好的应用jar,包含依赖. 这个URL在集群中全局可见。 比如hdfs:// 共享存储系统, 如果是 file:// path, 那么所有的节点的path都包含同样的jar.
- application-arguments: 传给main()方法的参数
一个通用发布策略是从一个网管机器提交你的应用, 这台机器物理的和你的worker机器在一起(比如在一个独立EC2集群中的Master节点). 在这种部署模式下, 适合采用client mode模式. 如果设置client模式, 驱动直接在spark-submit进程中启动,输入输出都可以显示在控制台. 所以这种模式特别适合REPL(读取-求值-输出循环), 比如Spark shell.
另外一种情况, 如果你的应用从离worker机器很远的机器提交,比如你本地笔记本,通常采用集群模式减小驱动和executor之间网络延迟。注意集群模式当前并不支持standalone clusters, Mesos clusters, 或者 python应用.
对于Python应用, 简单把.py文件取代
使用--help列出所有的选项. 这里有一个例子:
|
|
Master URL
master URL可以是以下格式:
Master URL | 意义 |
---|---|
local | 本地以一个worker线程运行(例如非并行的情况). |
local[K] | 本地以K worker 线程 (理想情况下, K设置为你机器的CPU核数). |
local[*] | 本地以本机同样核数的线程运行. |
spark://HOST:PORT | 连接到指定的Spark standalone cluster master. 端口是你的master集群配置的端口,缺省值为7077. |
mesos://HOST:PORT | 连接到指定的Mesos 集群. Port是你配置的mesos端口, 缺省是5050. 或者如果Mesos使用ZOoKeeper,格式为 mesos://zk://.... |
yarn-client | 以client模式连接到YARN cluster. 集群的位置基于HADOOP_CONF_DIR 变量找到. |
yarn-cluster | 以cluster模式连接到YARN cluster. 集群的位置基于HADOOP_CONF_DIR 变量找到. |
从文件中加载配置
spark-submit脚本可以从一个属性文件中加载缺省的Spark配置, 并把它们传给你的应用. 在默认情况下它会从Spark文件夹的conf/spark-defaults.conf读取参数,更多细节请看 加载默认配置。
加载缺省配置可以避免在spark-submit设置部分参数. 举例来讲, 如果配置了spark.master, 你就可以不用在调用spark-submit脚本时设置--master参数. 通常SparkConf配置值具有最高的优先级, 然后是spark-submit的参数, 其次才是缺省文件中的值.
如果你不清楚配置项来自哪里,你可以使用--verbose打印详细的调试信息。
先进的依赖管理
当使用spark-submit, 你的应用jar以及其它通过--jars包含的jar文件将自动传送给集群。 Spark使用下面的URL scheme 为不同的策略分发jar文件:
- file: -绝对路径和 file:/ URIs 由驱动的HTTP文件服务器提供。 每个executor从驱动的http服务器拉取文件.
- hdfs:, http:, https:, ftp: - 从期望URI地址拉取文件
- local: - local:/ 期望存在所有的worker节点的本地文件系统中. 这意味着没有网络I/O发生,适合已经发布到各worker节点的大的文件/jar, 或者共享的文件系统 NFS, GlusterFS等.
注意JAR和文件被复制到每个executor节点的相应的SparkContext的工作文件夹下。 长期运行会占用大量的磁盘空间,需要清理。YARN会自动清理, 而Spark standalone通过设置spark.worker.cleanup.appDataTtl来配置自动清理.
对于python, t等价的--py-files参数可以用来发布.egg, .zip 和 .py 库到executor.
更多信息
一旦你发布了你的应用,集群模式概述描述了分布执行的组件,以及如何监控和调试应用.