在 Spark 的 bin 目录中的 spark-submit 脚本用与在集群上启动应用程序。它可以通过一个统一的接口使用所有 Spark 支持的 Cluster Manager,所以您不需要专门的为每个 Cluster Manager 来配置您的应用程序。

打包应用依赖

如果您的代码依赖了其它的项目,为了分发代码到 Spark 集群中您将需要将它们和您的应用程序一起打包。为此,创建一个包含您的代码以及依赖的 assembly jar(或者 “uber” jar)。无论是 sbt 还是 Maven 都有 assembly 插件。在创建 assembly jar 时,列出 Spark 和 Hadoop 提供的依赖。它们不需要被打包,因为在运行时它们已经被 Cluster Manager 提供了。如果您有一个 assembled jar 您就可以调用 bin/spark-submit 脚本(如下所示)来传递您的 jar。

对于 Python 来说,您可以使用 spark-submit 的 --py-files 参数来添加 .py,.zip 和 .egg 文件以与您的应用程序一起分发。如果您依赖了多个 Python 文件我们推荐将它们打包成一个 .zip 或者 .egg 文件。

用 spark-submit 启动应用

如果用户的应用程序被打包好了,它可以使用 bin/spark-submit 脚本来启动。这个脚本负责设置 Spark 和它的依赖的 classpath,并且可以支持 Spark 所支持的不同的 Cluster Manager 以及 deploy mode(部署模式):

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

一些常用的 options(选项)有 :

  • --class : 您的应用程序的入口点(例如。org.apache.spark.examples.SparkPi)。
  • --master : 集群的 Master URL(例如。spark://23.195.26.187:7077)。
  • --deploy-mode : 是在 worker 节点(cluster)上还是在本地作为一个外部的客户端(client)部署您的 driver(默认 : client)†。
  • --conf : 按照 key=value 格式任意的 Spark 配置属性。对于包含空格的 value(值)使用引号包 “key=value” 起来。
  • application-jar : 包括您的应用以及所有依赖的一个打包的 Jar 的路径。该 URL 在您的集群上必须是全局可见的,例如,一个 hdfs:// path 或者一个 file:// path 在所有节点是可见的。
  • application-arguments : 传递到您的 main class 的 main 方法的参数,如果有的话。

† 常见的部署策略是从一台 gateway 机器物理位置与您 worker 在一起的机器(比如,在 standalone EC2 集群中的 Master 节点上)来提交您的应用。在这种设置中,client 模式是合适的。在 client 模式中,driver 直接运行在一个充当集群 client 的 spark-submit 进程内。应用程序的输入和输出直接连到控制台。因此,这个模式特别适合那些设计 REPL(例如,Spark shell)的应用程序。

另外,如果您从一台远离 worker 机器的机器(例如,本地的笔记本电脑上)提交应用程序,通常使用 cluster 模式来降低 driver 和 executor 之间的延迟。目前,Standalone 模式不支持 Cluster 模式的 Python 应用。

对于 Python 应用,在 <application-jar> 的位置简单的传递一个 .py 文件而不是一个 JAR,并且可以用 --py-files 添加 Python .zip,.egg 或者 .py 文件到 search path(搜索路径)。

这里有一些选项可用于特定的 Cluster Manager 中。例如,Spark standalone cluster 用 cluster 部署模式,您也可以指定 --supervise 来确保 driver 在 non-zero exit code 失败时可以自动重启。为了列出所有 spark-submit 可用的选项,用 --help 来运行它。这里是一些常见选项的例子 :

# Run application locally on  cores
./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
./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
./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 \
/path/to/examples.jar \ # Run on a 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 \
/path/to/examples.jar \ # Run a Python application on a Spark standalone cluster
./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
./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 \

Master URL

传递给 Spark 的 master URL 可以使用下列格式中的一种 :

Master URL
Meaning
local

使用一个线程本地运行 Spark(即,没有并行性)。

local[K]

使用 K 个 worker 线程本地运行 Spark(理想情况下,设置这个值的数量为您机器的 core 数量)。

local[*]

使用更多的 worker 线程作为逻辑的 core 在您的机器上来本地的运行 Spark。

spark://HOST:PORT

连接至给定的 Spark standalone cluster master。该 port(端口)必须有一个作为您的 master 配置来使用,默认是 7077.

mesos://HOST:PORT

连接至给定的 Mesos cluster。该 port(端口)必须有一个作为您的配置来使用,默认是 5050。或者,对于使用了 ZooKeeper 的 Mesos cluster 来说,使用 mesos://zk://...。使用 --deploy-mode cluster 来提交,该 HOST:PORT 应该被配置以连接到 MesosClusterDispatcher。

yarn

连接至一个 YARNcluster,部署是在 client 或者 cluster 模式取决于 --deploy-mode 的值。该 cluster 的位置将根据 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 变量来找到。

从文件中加载配置

spark-submit 脚本可以从一个 properties 文件加载默认的 Spark configuration values 并且传递它们到您的应用中去。默认情况下,它将从 Spark 目录下的 conf/spark-defaults.conf 读取配置。

加载默认的 Spark 配置,这种方式可以消除某些标记到 spark-submit 的必要性。例如,如果 spark.master 属性被设置了,您可以在 spark-submit 中安全的省略。一般情况下,明确设置在 SparkConf 上的配置值的优先级最高,然后是传递给 spark-submit 的值,最后才是 default value(默认文件)中的值。

如果您不是很清楚其中的配置设置来自哪里,您可以通过使用 --verbose 选项来运行 spark-submit 打印出细粒度的调试信息。

先进的依赖管理

在使用 spark-submit 时,使用 --jars 选项包括的应用程序的 jar 和任何其它的 jar 都将被自动的传输到集群。在 --jars 后面提供的 URL 必须用逗号分隔。该列表传递到 driver 和 executor 的 classpath 中 --jars 不支持目录的形式。

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

  • file: - 绝对路径和 file:/ URI 通过 driver 的 HTTP file server 提供服务,并且每个 executor 会从 driver 的 HTTP server 拉取这些文件。
  • hdfs:,http:,https:,ftp: - 如预期的一样拉取下载文件和 JAR。
  • local: - 一个用 local:/ 开头的 URL 预期作在每个 worker 节点上作为一个本地文件存在。这样意味着没有网络 IO 发生,并且非常适用于那些通过 NFS,GlusterFS,等推倒每个 worker 或共享大型的 file/JAR。

注意,那些 JAR 和文件被复制到 working directory(工作目录)用于在 executor 节点上的每个 SparkContext。这可以使用最多的空间显著量随着时间的推移,将需要清理。在 Spark On YARN 模式中,自动执行清理操作。在 Spark standalone 模式中,可以通过配置 spark.worker.cleanup.appDataTtl 属性来执行自动清理。

用户也可以通过使用 --packages 来提供一个逗号分隔的 maven coordinates(maven 坐标)以包含任何其它的依赖。在使用这个命令时所有可传递的依赖将被处理。其它的 repository(或者在 SBT 中被解析的)可以使用 --repositoies 该标记添加到一个逗号分隔的样式中。这些命令可以与 pyspark,spark-shell 和 spark-submit 配置会使用以包含 Spark Packages(Spark 包)。

对于 Python 来说,也可以使用 --py-files 选项用于分发 .egg,.zip 和 .py libraries 到 executor 中。

Spark应用提交的更多相关文章

  1. Spark学习(四) -- Spark作业提交

    标签(空格分隔): Spark 作业提交 先回顾一下WordCount的过程: sc.textFile("README.rd").flatMap(line => line.s ...

  2. Spark集群模式&Spark程序提交

    Spark集群模式&Spark程序提交 1. 集群管理器 Spark当前支持三种集群管理方式 Standalone-Spark自带的一种集群管理方式,易于构建集群. Apache Mesos- ...

  3. Spark任务提交底层原理

    Driver的任务提交过程 1.Driver程序的代码运行到action操作,触发了SparkContext的runJob方法.2.SparkContext调用DAGScheduler的runJob函 ...

  4. spark任务提交到yarn上命令总结

    spark任务提交到yarn上命令总结 1. 使用spark-submit提交任务 集群模式执行 SparkPi 任务,指定资源使用,指定eventLog目录 spark-submit --class ...

  5. Spark作业提交至Yarn上执行的 一个异常

    (1)控制台Yarn(Cluster模式)打印的异常日志: client token: N/A         diagnostics: Application application_1584359 ...

  6. 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程

    Spark2.1.1 一 Spark Submit本地解析 1.1 现象 提交命令: spark-submit --master local[10] --driver-memory 30g --cla ...

  7. Spark Standalone 提交模式

    一.Client提交模式 提交命令: ./spark-submit --master spark://node1:7077 --class org.apache.spark.examples.Spar ...

  8. 【Spark-core学习之四】 Spark任务提交

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  9. Spark任务提交jar包依赖解决方案

    转载自:http://blog.csdn.net/wzq294328238/article/details/48054525                    通常我们将Spark任务编写后打包成 ...

  10. Spark程序提交到Yarn集群时所遇异常

    Exception 1:当我们将任务提交给Spark Yarn集群时,大多会出现以下异常,如下: 14/08/09 11:45:32 WARN component.AbstractLifeCycle: ...

随机推荐

  1. JSONObject与JSONArray

    最近在学习过程中用到了稍微复杂点的json数据需要将json数据解析出来,这里就截取一部分作为例子 1.JSONObject介绍 JSONObject-lib包是一个beans,collections ...

  2. 本机添加多个git仓库账号

    我们可能会需要在一台电脑上以不同的github账户去使用git,这时就需要去解决如何管理本机上的多个ssh key的问题了. 生成新ssh key 如果我们电脑上已经存在了一个ssh key,那么我们 ...

  3. div随页面滚动遇顶固定的两种方法(js&jQuery)

    一.遇顶固定的例子 我一直以为是某个div或层随屏幕滚动,遇顶则固定,离开浏览器顶部又还原这样的例子其实不少,其实它的名字叫“层的智能浮动效果”.目前我们在国内的商业网站上就常常看到这样的效果了.例如 ...

  4. php 判断查询结果是否为空

    select count(people) c from people where people='乐乐' 上面这条sql就是原理 php利用代码 <?php $p=$_POST['p']; $c ...

  5. $ -----JavaScript 中美元符号 $ 的作用

    JavaScript 中美元符号 $ 是什么 1.首先可以用来表示变量,比如变量 var s='asdsd'或var $s='asdasd'; 2.在正则表达式中,它可以匹配结尾:/sa$/.test ...

  6. Think Python: How to Think Like a Computer Scientist

    Think Python: How to Think Like a Computer Scientist:http://greenteapress.com/thinkpython/html/index ...

  7. 修改Android 界面颜色

    btnGetCode.setTextColor(getResources().getColor(R.color.dark_white)); Color.parseColor("#1a71d4 ...

  8. hdu 2821(dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 思路:一开始的时候没注意到,必须从map[i][j]==0的位置开始,然后就是dfs了,回溯的时 ...

  9. Spring_day03--Spring的事务管理

    Spring的事务管理 事务概念 1 什么事务 事务是操作中最基本的单元,表示一组操作要么都成功,有一个失败那么所有都失败. 2 事务特性 原子性 一致性 隔离性 持久性 3 不考虑隔离性产生读问题 ...

  10. Python使用函数实现把字符串转换成整数

    需求:假设Python没有提供内置函数int如果使用函数方式实现把一串字符串转换成整数例如把字符串‘12345‘转换成整数12345 思路 1,字符串也是序列可以使用map函数处理分割成一个列表 2, ...