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  cores 用8个核本地运行应用程序
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[] \
/path/to/examples.jar \ # 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 \
/path/to/examples.jar \ # 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 \
/path/to/examples.jar \ # 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 \
/path/to/examples.jar \ # Run a Python application on a Spark standalone cluster在spark的standalone上部署Python应用程序
./bin/spark-submit \
--master spark:207.184.161.138: \
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 \
http://path/to/examples.jar \ # 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
http://path/to/examples.jar \

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更多消息

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

Spark Submitting Applications浅析的更多相关文章

  1. Apache Spark 2.2.0 中文文档 - Submitting Applications | ApacheCN

    Submitting Applications 在 script in Spark的 bin 目录中的spark-submit 脚本用与在集群上启动应用程序.它可以通过一个统一的接口使用所有 Spar ...

  2. Spark设计思想浅析

    Spark is no rocket science!——博主 了解分布式计算的朋友,一定知道DAG这样一个概念.其实我接触DAG也是在学习MapReduce时了解到的.(具体可查阅<大数据日知 ...

  3. Spark分区器浅析

    分区器作用:决定该数据在哪个分区 概览: 仅仅只有pairRDD才可能持有分区器,普通RDD的分区器为None 在分区器为None时RDD分区一般继承至父RDD分区 初始RDD分区数: 由集合创建,R ...

  4. 搭建Spark的单机版集群

    一.创建用户 # useradd spark # passwd spark 二.下载软件 JDK,Scala,SBT,Maven 版本信息如下: JDK jdk-7u79-linux-x64.gz S ...

  5. 让spark运行在mesos上 -- 分布式计算系统spark学习(五)

    mesos集群部署参见上篇. 运行在mesos上面和 spark standalone模式的区别是: 1)stand alone 需要自己启动spark master 需要自己启动spark slav ...

  6. Spark中的编程模型

    1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...

  7. Spark编程模型及RDD操作

    转载自:http://blog.csdn.net/liuwenbo0920/article/details/45243775 1. Spark中的基本概念 在Spark中,有下面的基本概念.Appli ...

  8. Spark入门学习

    1. Spark Overview(spark概述) Apache spark是一个快速和通用的集群计算系统.它提供了Java,Scala,Python和R的高级APIs,以及支持通用执行图的优化引擎 ...

  9. Spark单机版集群

    一.创建用户 # useradd spark # passwd spark 二.下载软件 JDK,Scala,SBT,Maven 版本信息如下: JDK jdk-7u79-linux-x64.gz S ...

随机推荐

  1. MT【295】线段比的仿射变换

    已知$F_1,F_2$分别为椭圆$\dfrac{x^2}{4}+\dfrac{y^2}{3}=1$的左右焦点.$A,B,C$是椭圆上$x$轴上方的三点,且$AF_1//BO//CF_2$,则$\dfr ...

  2. 【C++】VS2015/VS2017连接Mysql数据库教程

    要给C++程序连接MySQL数据库,分别需要: 安装MySQL Server 下载MySQL Connector/C++ 在IDE中配置依赖 然后就可以在代码中调用API,来连接以及操作数据库. 一. ...

  3. QML 用QSortFilterProxyModel实现搜索功能

    搞了一晚上终于实现了,写个博客纪念一下吧. c++部分的代码: #include <QQmlApplicationEngine> #include <QQmlContext> ...

  4. 栈长这里是生成了一个 Maven 示例项目。

    Spring Cloud 的注册中心可以由 Eureka.Consul.Zookeeper.ETCD 等来实现,这里推荐使用 Spring Cloud Eureka 来实现注册中心,它基于 Netfl ...

  5. 【Hihocoder1413】Rikka with String(后缀自动机)

    [Hihocoder1413]Rikka with String(后缀自动机) 题面 Hihocoder 给定一个小写字母串,回答分别把每个位置上的字符替换为'#'后的本质不同的子串数. 题解 首先横 ...

  6. [2017-7-28]Android Learning Day6

    常用控件 Spinner DatePickerDialog TimePickerDiaog RadioButton CheckBox spinner(下拉菜单) <Spinner android ...

  7. 「SDOI2014」Lis 解题报告

    「SDOI2014」Lis 题目描述 给定序列 \(A\),序列中的每一项 \(A_i\) 有删除代价 \(B_i\) 和附加属性 \(C_i\). 请删除若干项,使得 \(A\) 的最长上升子序列长 ...

  8. 20165223 Linux安装及命令入门

    预备作业3:Linux安装及命令入门 一.VirtualBox和Ubuntu的安装 通过学习实践基于VirtualBox虚拟机安装Ubuntu图文教程,我开始学习虚拟机的安装,根据教程一步步试着安装. ...

  9. Python数据结构之实现队列

    再学习数据结构队列的时候,我不想讲太多!一切言语不如几张图来的实在! 这是第一张图,第二图是讲队列满的情况: 分析了数据结构中的队列是什么之后,我们开始写代码,代码Code如下: #coding:ut ...

  10. poj3630 Phone List

    spy on一下,发现是trie裸题,结果一交就T... 然后把cin改成scanf就A了... trie的空间一定要开足,要不然RE #include <cstdio> #include ...