Spark应用提交指南(spark-submit)

前言:之前的工作中,关于spark的使用一直停留在能运行、能完成相关功能的境地下,最近涉及到很多关于spark集群调优等各种细枝末节方面的东西,自此决定恶补大数据相关基础的东西,顺便做个笔记,帮助自己记忆。 关于spark的相关笔记尽力基于spark 2.x版本(其实在我目前使用的情况下,1.x与2.x内容基本别无二致)。使用2.x的原因是之前在使用1.6时踩过坑,换2.x后完美解决,该坑我会在之后的笔记中整理出来。
笔记的内容就从spark-submit开始吧。这边我要提出来的个人观点是,该类技术,第一手资料永远是来自官方文档!。Spark 2.1.0的spark-submit官网地址链接为Submitting Applications

    • 绑定依赖关系
    • 使用submit启动应用程序
    • Master URL
    • 从文件中加载配置
    • 高级依赖管理
    • 更多信息

绑定依赖关系

如果你的代码依赖其它的项目,为了发布到集群中,你需要为你的应用打包它们。 这样来做: 创建一个装配assembly jar (或者 “uber” jar) 来包含你的代码和依赖. sbt 和 Maven都有assembly 插件. 当用插件创建assembly jar时,需要将Spark 和 Hadoop设置为provided依赖; 不需要将它们打包进你的jar, 这是因为集群管理器在运行时会提供它们. 一旦你打包好,你可以调用bin/spark-submit脚本, 将你的jar作为参数。
我通常会自己下载相应的jar包加载在应用程序中,很少会使用Maven和sbt,原因:不会……,这边立个flag,在后续的笔记中整理下Maven和sbt相关的使用方法
如果使用Python, 你可以使用–py-files参数增加 .py, .zip 或者 .egg 文件. 如果你依赖多个Python文件, 我们推荐你将它们打包成一个.zip 或者 .egg。

使用submit启动应用程序

一旦打包好,就可以使用bin/spark-submit脚本启动应用了. 这个脚本负责设置spark使用的classpath和依赖,支持不同类型的集群管理器和发布模式:

./bin/spark-submit \
  --class <main-class>
  --master  \
  --deploy-mode  \
  --conf = \
  ... # other options
   \
  [application-arguments]

一些常用的选项有:

  • 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文件取代 的JAR, 并将Python .zip, .egg 或者 .py 文件增加到搜索路径中(–py-files).

使用–help列出所有的选项. 这里有一个例子,此处的参数根据集群资源的设置详解参考Spark-submit参数说明:

# 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
./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 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 cluster
./bin/spark-submit \
  --master spark://207.184.161.138:7077 \
  examples/src/main/python/pi.py \
  1000

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 变量找到.

从文件中加载配置

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.

更多信息

一旦你发布了你的应用,集群模式概述描述了分布执行的组件,以及如何监控和调试应用.

你可能感兴趣的:(大数据开发)