Spark Submitting Applications浅析

Submitting Applications提交应用程序

在spark的bin目录下spark-submit脚本被用于在集群中启动应用程序。它可以通过一个统一的接口来使用Spark支持的所有集群管理器(目前Spark支持的集群模式有自带的Standalone、Apache Mesos、Hadoop YARN、Kubernetes),因此你不必为每个集群模式特意配置你的应用程序。

Bundling Your Application's Dependencies捆绑应用程序的依赖项

如果你的代码依赖其他项目,你需要将它们和你的应用程序一起打包,以便将代码分发到Spark集群。为了完成这个,需要创建一个包含你的代码和它的依赖项的assembly jar包(或者 “uber” jar)。sbt和Maven都有assembly插件。当创建assembly jars时,将Spark和Hadoop列为provided的依赖项;这意味着不需要捆绑它们因为集群管理器在运行时已经提供了这些依赖项。一旦你有assembled jar包,当使用你的jar时可以调用bin/spark-submit脚本。

对于Python,你可以使用spark-submit--py-files参数去添加.py.zip或者.egg 文件去分发你的应用程序。如果你依赖多个Python文件,我们要求把它们打包进一个.zip或者.egg文件。

Launching Applications with spark-submit通过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]

一些通用的选项有:

参数名称 说明
--master MASTER_URL 集群的master URL,可以是spark://host:port、mesos://host:port、yarn、yarn-cluster、yarn-client、local
--deploy-mode DEPLOY_MODE Driver程序运行的方式,Client或者Cluster,默认值是Client
--class CLASS_NAME 应用程序的入口点,主类名称,含包名(e.g. org.apache.spark.examples.SparkPi)
--name NAME Spark Application的名称
--jars JARS 加入到Driver和Executor的ClassPath中的jar包列表,以逗号分隔
--py-files PY_FILES 用逗号隔开的放置在Python应用程序PYTHONPATH上的.zip、.egg、.py文件列表
--files FILES 用逗号隔开的每个Executor运行时需要的配置文件列表
--conf 以key-value格式的任意Spark配置属性。对于包含空格的值,在引号中包含"key=value"
--properties-file FILE 设置应用程序属性的文件路径,默认时$SPARK_HOME/conf/spark-defaults.conf
--driver-memory MEM Driver程序运行时使用的内存大小,默认为512MB
--driver-java-options Driver程序运行时的一些Java配置选项,比如GC相关信息,新生代大小设置等
--driver-library-path Driver程序依赖的第三方jar包
--driver-class-path Driver程序的类路径
--driver-cores NUM Driver程序的使用CPU个数,仅限于Standalone模式,默认为1个
--executor-memory MEM Executor运行时使用的内存大小,默认为1GB
--total-executor-cores NUM executor使用的总核数,仅限于Standalone、Spark on Mesos模式
--executor-cores NUM 每个Executor使用的内核数,默认为1,仅限于Spark on Yarn模式
--num-executors NUM 启动的Executor数量,默认是2个,仅限于Spark on Yarn模式
--supervise 失败后是否重启Driver,仅限于Standalone模式
--queue QUEUE_NAME 提交应用程序给哪个Yarn的队列,默认是default队列,仅限于Spark on Yarn模式
--archives ARCHIVES 逗号分隔的归档文件列表,会被解压到每个Executor的工作目录中,仅限于Spark on Yarn模式
application-jar 一个包含应用程序和全部依赖项的捆绑jar的路径。URL必须在集群中全局可见,例如,hdfs://路径或者在所有节点上都存在的file://路径。
application-arguments 传递给main类的main方法的参数(如果有的话)


常见的部署策略是从与工作计算机物理上位于同一位置的网关计算机(例如,独立EC2集群中的主节点)提交应用程序。
在这一设置中,clien模式是适用的。在client模式下,在集群中扮演client的spark-submit进程中直接启动驱动程序driver。应用程序的输入输出附加到控制台。因此,这模式特别适用于设计REPL的应用程序(例如Spark shell)。

或者,如果你的应用程序从远离工作计算机的计算机提交的(例如,在笔记本电脑上本地提交的),则通常使用cluster模式去最小化驱动程序drivers和执行程序executors之间的网络延迟。当前,standalone模式不支持Python应用程序的集群模式。

对于Python应用程序,只需传递一个.py文件替代<application-jar>而不是JAR,并使用--py-files将Python .zip,.egg或.py文件添加到搜索路径中。

有一些特定于正在使用的集群管理器的可用选项。例如,对于具有cluster部署模式的Spark standalone集群,你也可以指定--supervise去确保驱动程序driver在失败且退出代码为非零时自动重启。要枚举所有可用与spark-submit的选项,请使用--help运行它。

# Run application locally on 8 cores 用8个核本地运行应用程序
./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 在client部署模式下运行Spark standalone集群
./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在具有supervise的cluster部署模式运行Spark standalone
./bin/spark-submit \
   --class org.apache.spark.examples.SparkPi \
   --master spark://207.184.138:7077 \
   --deploy-mode cluster \
   --supervise \
   --executor-memory 20G \
   --total-executor-cores 100 \
   /path/to/examples.jar \
   1000

# Run on a YARN cluster 在Yarn集群上运行
export HADOOP_CONF_DIR=xxx
./bin/spark-submit \
   --class org.apache.spark.examples.SparkPi \
   --master yarn \
   --deploy-mode cluster \ #可以是client模式的client
   --executor-memory 20G
   --num-executors 50 \
   /path/to/examples.jar \
   1000

# Run a Python application on a Spark standalone cluster在spark的standalone上部署Python应用程序
./bin/spark-submit \
   --master spark:207.184.161.138:7077 \
   examples/src/main/python/pi.py

# Run on a Mesos cluster in cluster deploy mode with supervise在具有supervise的cluster部署模式运行Mesos cluster
./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

# Run on a Kubernetes cluster in cluster deploy mode在cluster部署模式上运行Kubernetes
./bin/spark-submit \
  --class org.apache.spark.example.SparkPi \
  --master k8s://xx.yy.zz.ww:443
  --deploy-mode cluster
  --num-executors 50
  http://path/to/examples.jar \
  1000

Master URLS

传递给Spark的主URLs可以采用如下格式之一:

Master URL Meaning
local 使用一个工作线程在本地运行Spark(i.e. 根本没有并行)。
local[K] 使用K个工作线程在本地运行Spark(理想的,把它设置成你机器的核数)
local[K, F] 使用K个工作线程和F最大错误在本地运行Spark。
local[*] 使用与计算机上的逻辑核心一样多的工作线程在本地运行Spark。
local[*, F] 使用与计算机上的逻辑核心一样多的工作线程和F最大错误在本地运行Spark。
spark://HOST:PORT 连接到给定的Spark standalone cluster模式主服务器。端口必须是你的主服务器配置使用的那个,默认7077。
spark://HOST1:PORT1,HOST2:PORT2 连接到给定的Spark standalone  cluster模式,其带有zookeeper的备用主服务器。该列表必须具有使用Zookeeper设置的高可用集群中的所有主机hosts。端口必须是每个主服务器配置使用的那个,默认7077。
mesos://HOST:PORT 连接到给定的Mesos集群。端口必须是你配置使用的那个,默认5050。或者,对于使用zookeeper的Mesos集群,使用mesos://zk://...。使用deploy-mode cluster提交,HOST:PORT应该配置去连接MesosClusterDispatcher。
yarn 根据--deploy-mode的值,以客户端或集群模式连接到YARN集群。集群位置将根据HADOOP_CONF_DIR或YARN_CONF_DIR变量找到。
k8s://HOST:PORT 以cluster模式连接到Kubernetes集群。client模式当前不支持,将会在将来的版本支持。HOST和PORT参考[Kubernetes API服务器](https://kubernetes.io/docs/reference/generated/kube-apiserver/)。默认使用TLS连接。为了强制它使用不安全的连接,你可以使用k8s://http://HOST:PORT。

Loading Configuration from a File从文件加载配置

spark-submit脚步可以从一个属性文件加载默认的Spark配置值,并将它们传递到你的应用程序。默认它将会从Spark目录下的conf/spark-defaults.conf读取选项。更多详情,在loading default configurations上查看节点。

以这种方式加载默认的Spark配置可以避免某些标志需要Spark-submit。例如,如果设置spark.master属性,你可以安全地从spark-submit中省略--master标志。通常,在SparkConf上显式设置的配置值采用最高优先级,然后是传递给spark-submit的标志,然后是默认文件中的值。

如果你不清楚配置选项的来源,可以通过使用--verbose选项运行spark-submit来打印出细粒度的调试信息。

Advanced Dependency Management更高级的依赖管理

当使用spark-submit,应用程序jar以及--jars选项中包含的任何jar都将自动传输到集群。在--jars之后提供的URL必须用逗号分隔。该列表包含在驱动程序driver和执行程序executor类路径中。目录扩展不适用于--jars

Spark使用以下的URL方案来允许传播jar的不同策略:

  • file:-绝对路径和file:/ URIs由驱动程序driver的HTTP文件服务器提供服务,每个执行程序executor从驱动程序driver HTTP服务器提取文件。
  • hdfs:, http:, https:, ftp: -这些按预期从URI中下拉文件和JAR。
  • local: -以local:/开头的URI应该作为每个工作节点上的本地文件存在。这意味着不会产生任何网络IO,并且适用于推送给每个工作者或通过NFS,GlusterFS等共享的大型文件/JARs。

注意:JARs和文件将复制到执行程序节点上的每个SparkContext的工作目录。随着时间的推移,这会占用大量空间,需要进行清理。使用YARN,可以自动清理;使用Spark standalone,可以使用spark.cleanup.appDataTtl属性来配置清理。

用户还可以通过使用--packages提供以逗号分隔的Maven坐标列表来包含任何其他依赖项。 使用此命令时将处理所有传递依赖项。 可以使用标志--repositories以逗号分隔的方式添加其他存储库(或SBT中的解析程序)。 (请注意,在某些情况下,可以在存储库URI中提供受密码保护的存储库的凭据,例如在https:// user:password @ host / ....以这种方式提供凭据时要小心。)这些命令可以是 与pyspark,spark-shell和spark-submit一起使用以包含Spark Packages。

对于Python,可以使用等效的--py-files选项将.egg,.zip和.py库分发给执行程序。

More Information更多消息

部署应用程序后,集群模式概述描述了分布式执行中涉及的组件,以及如何监视和调试应用程序。

posted @ 2018-07-03 19:16  牧梦者  阅读(3920)  评论(0编辑  收藏  举报