spark的bin目录中的spark submit脚本用于在集群上启动应用程序。它可以通过一个统一的接口使用Spark支持的所有集群管理器,这样您就不必特别为每个集群管理器配置应用程序。
如果代码依赖于其他项目,则需要将它们与应用程序一起打包,以便将代码分发到Spark集群。为此,创建一个包含代码及其依赖项的程序集jar(或“uber”jar)。sbt和Maven都有汇编插件。创建程序集jar时,将Spark和Hadoop列为提供的依赖项;这些依赖项不需要绑定,因为它们是由集群管理器在运行时提供的。一旦有了一个组装好的jar,就可以在传递jar时调用bin/spark提交脚本,如图所示。
对于Python,可以使用spark-submit的
--py-files
参数增加.py、
.zip
或.egg
文件与应用程序一块被分发。如果依赖多个Python文件,建议将它们打包到.zip
或中.egg
。
捆绑用户应用程序后,可以使用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]
在将项目打包之后,可能需要将其提交到大数据平台上去跑,这个时候就涉及到脚本处理。这里主要是有关spark的运行任务…一些常用的提交参数配置如下所示:
参数名 | 简介 |
class | spark程序的主类,仅针对 java 或 scala 应用,注意用 全包名+类名 |
name | 应用程序的名称 |
master | 与deploy-mode合起来表名程序提交到哪个资源管理框架,以何种方式部署。 表示要连接的集群管理器,可 以 是 spark://host:port、mesos://host:port、yarn、yarn-cluster、yarn-client、local。其中local和local[K].这种是本地run的模式,不会提交到YARN,便于测试使用。这两者之间的区别,带K的是多K个线程,不带K的是单个线程。如果是*的话就是尽可能多的线程数。 |
deploy-mode | 在本地 (client) 启动 driver 或在 cluster 上启动,默认是client。client是指driver在提交任务的服务器上执行,cluster是driver和exectutor都在集群内执行 |
conf | 指定 spark 配置属性的值 |
executor-memory | 每个执行器(executor)的内存 ,以字节为单位。可以使用后缀指定更大的单位,比如“512m”(512MB),或“15g”(15GB)。默认是1G,最大不超过30G,yarn模式下其内存加上container要使用的内存(默认值是1G)不要超过NM可用内存,不然分配不到container来运行executor |
executor-cores | 每个执行器(executor)的核数 ,即单个executor能并发执行task数,根据job设置。在yarn或者standalone下使用。Spark on Yarn 默认为 1,推荐值2-16;standalone 默认为 worker 上所有可用的 core |
Executor-memoryOverheadM | 设置执行器的堆外内存 ,具体的设置方法可以看之后的spark调优方法.执行器的内存=executor-memory+Executor-overheadMemory |
driver-memory | 驱动器(Driver)进程使用的内存量 (例如:1000M,5G)。以字节为单位。可以使用后缀指定更大的单位,比如“512m”(512MB),或“15g”(15GB)。默认是1G,推荐值2-6G,不宜太大 |
driver-cores | 驱动器(Driver)的核数 ,默认是1。在 yarn 或者 standalone 下使用 |
driver-memoryOverheadM | 设置driver的堆外内存 ,具体的设置方法可以看之后的spark提交参数详解。driver的内存=driver-memory+driver-overheadMemory |
num-executors | 设置执行器(executor)的数量;默认为2。在 yarn 下使用。但是目前CDH和FusionInsight都支持动态分配(dynamic allocat)模式。在这种模式下,无论怎么设置num-executors其实都会被忽略的, |
queue | 执行队列池;通常生产环境都会为特定的租户分配资源池。这个参数便是用于指定跑批租户资源池名称的。 |
Jars | 用逗号分隔的本地 jar 包,指定本次程序(Driver 和 executor)依赖的jar包。需要上传并放到应用的CLASSPATH中的JAR包的列表。如果应用依赖于少量第三方JAR包,可以把他们放在这个参数里,有两种方式: 1、把依赖包打入执行程序包,这样会造成包体较大,每次打包上传耗时间表达; 2、不打入依赖包,把依赖包提前传到服务器,再通过jars指令指出依赖包的文件路径 |
一种常见的部署方法是从与worker节点物理位置相同的网关机提交应用程序。在此设置中,客户端模式是合适的。在客户端模式下,驱动程序直接在spark submit进程中启动,spark submit进程充当集群的客户端。应用程序的输入和输出连接到控制台。因此,该模式特别适用于涉及REPL的应用(例如Spark shell)。
或者,如果您的应用程序是从远离部署worker节点机器的机器上提交(例如,在本地笔记本电脑上),则通常使用cluster模式来最小化驱动程序和执行程序之间的网络延迟。目前,在独立集群模式中,不支持Python应用程序的cluster模式。
对于Python应用程序,只需在<application jar>而不是jar的位置传递一个.py文件,然后使用 --py-files参数
将Python.zip、.egg或.py文件添加到搜索路径。
# 本地运行应用程序,8核
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# 在Spark独立群集上以客户端部署模式运行
./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
# 在Spark独立集群上以集群部署模式运行
./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
# 在YARN上以cluster模式运行
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # can be client for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# 在Spark独立集群上运行python脚本
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
# 以集群部署模式在Mesos集群上运行
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master mesos://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
http://path/to/examples.jar \
1000
# 以集群部署模式在Kubernetes集群上运行
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master k8s://xx.yy.zz.ww:443 \
--deploy-mode cluster \
--executor-memory 20G \
--num-executors 50 \
http://path/to/examples.jar \
1000
Yarn是hadoop自带的集群管理器,默认情况下不用手动启动。与Spark支持的其他集群管理器(其中在--master
参数中指定了主服务器的地址)不同,在YARN模式下,ResourceManager的地址是从Hadoop配置中提取的。因此,--master
参数为yarn
。另外Spark on YARN又分为client模式和cluster模式。
具体两者之间区别见另一片文章:spark几种集群管理器总结
这两种模式,最关键的是Spark Application运行时Driver所在的节点不同。
./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]
./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
examples/jars/spark-examples*.jar \
10
如果要在client模式下启动Spark应用程序,基本类似,但需要将cluster替换为client。下面显示如何在client模式下运行spark shell:
./bin/spark-shell \
--master yarn \
--deploy-mode client
在cluster模式下,驱动程序运行在与客户端不同的计算机上,因此SparkContext.addJar文件对于客户端本地的文件,将无法开箱即用,为了使客户端上的文件可供SparkContext.addJar使用,在launch命令中需要包含--jars选项。
./bin/spark-submit --class my.main.Class \
--master yarn \
--deploy-mode cluster \
--jars my-other-jar.jar,my-other-other-jar.jar \
my-main-jar.jar \
app_arg1 app_arg2
## yarn、client
spark-submit \
--master yarn \
--deploy-mode client \
/home/hadoop/test.py
## yarn、cluster、输入参数
spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 2 \
--queue prod \
--jars /home/hadoop/mysql-connector-java-8.0.21.jar,/home/hadoop/elasticsearch-spark-20_2.11-6.4.1.jar \
/home/hadoop/test2.py 202012 dd_dksr_hz_test IS_SUC
参考: