前言:之前的工作中,关于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。
如果你的代码依赖其它的项目,为了发布到集群中,你需要为你的应用打包它们。 这样来做: 创建一个装配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。
一旦打包好,就可以使用bin/spark-submit脚本启动应用了. 这个脚本负责设置spark使用的classpath和依赖,支持不同类型的集群管理器和发布模式:
./bin/spark-submit \
--class <main-class>
--master \
--deploy-mode \
--conf = \
... # other options
\
[application-arguments]
一些常用的选项有:
一个通用发布策略是从一个网管机器提交你的应用, 这台机器物理的和你的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 | 意义 |
---|---|
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文件:
对于python, t等价的–py-files参数可以用来发布.egg, .zip 和 .py 库到executor.
一旦你发布了你的应用,集群模式概述描述了分布执行的组件,以及如何监控和调试应用.