详解 Spark 的 Submitting Applications

$SPARK_HOME/bin/spark-submit脚本用于在集群上启动Application。它可以通过统一的接口使用所有Spark支持的集群管理器,因此不必专门为每个集群管理器配置应用程序。


绑定应用程序的依赖项

如果自己的代码依赖于其他项目,则需要将它们与应用程序一起打包,以便将其代码分发到Spark集群
为此,需要创建一个包含自己代码及其依赖项的
jar包(或者是 “uber” jar在创建应用程序的jar包时,将SparkHadoop作为provided的依赖项列出;这些不需要绑定,因为它们是由集群管理器在运行时提供的。

编译好jar包后,可以调用bin/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]

常用的选项:

选项说明
--class应用程序的入口类例如org.apache.spark.examples.SparkPi)
--master集群的Master的URL(例如:spark://207.184.161.138:7077
--deploy-mode

是针对集群而言的,是指应用程序部署的模式。

根据Driver进程放在哪分为两种方式:client和cluster,默认是client

--conf任意spark配置属性,key=value格式。对于包含空格的值,将“key=value”括在引号中。
application-jar应用程序jar包的路径,包括应用程序和其所有依赖项。
URL必须在集群内部全局可见,例如,在所有节点上都存在一个hdfs:// path或一个file:// path
application-arguments参数传递给应用程序main类的main方法参数(如果有的话)

对于Python应用程序,只需在<application-jar>的位置传递一个.py文件而不是jar,然后使用--py-files选项.zip.egg.py文件添加到搜索路径中。以便与应用程序一起分发到Spark集群。如果依赖于多个其他Python文件,建议将它们打包到.zip.egg中。

一种常见的部署策略是,从物理上与集群机器处于同网关下的机器上提交应用程序(例如,独立EC2集群中的主节点)。在此设置中,client模式是合适的。在client模式下,driver直接在spark-submit进程中启动,该进程充当集群的客户端应用程序的输入和输出附加到控制台。因此,这种模式特别适合包含交互(REPL)的应用程序例如Spark shell)
如果应用程序是从远离集群机器的机器上提交的(例如,在自己本地笔记本电脑上),通常使用cluster模式来最小化driver和应用程序之间的网络延迟。
目前,Standalond模式不支持Python应用程序的集群模式。

有几个选项是特定于正在使用的集群管理器的。
例如,对于Standalone、mesos集群下使用cluster部署模式的应用程序,还可以指定--supervise,以确保驱动程序在使用非零退出代码失败时自动重新启动。


通过--help选项可以查看到bin/spark-submit脚本支持的全部选项,以下是一些常见的选择:

# 本地使用8个内核运行应用程序

./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master local[8] \
  /path/to/examples.jar \
  100

# client部署模式在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

# cluster部署模式在Standalone集群上运行应用程序,并使用--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 100 \
  /path/to/examples.jar \
  1000

# 以cluster部署模式在yarn集群上运行应用程序

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

# Standalone集群上运行Python应用程序

./bin/spark-submit \
  --master spark://207.184.161.138:7077 \
  examples/src/main/python/pi.py \
  1000

# cluster部署模式在mesos集群上运行应用程序,并使用--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 100 \
  http://path/to/examples.jar \
  1000

#cluster部署模式在mesos集群上运行应用程序

./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

Master URLs

传递给--master选项的Master的URL可以是以下格式之一:

Master URL

作用

local

使用一个工作线程在本地运行Spark(即完全不并行)

local[K]

使用K个工作线程在本地运行Spark(理想情况下,将其设置为计算机上的内核数量)

local[K,F]

使用K个工作线程和F maxfailure在本地运行Spark

local[*]

在本地运行Spark,在机器上使用与逻辑内核一样多的工作线程。

local[*,F]

在本地运行Spark,在机器上使用与逻辑内核一样多的工作线程和F maxfailure

spark://HOST:PORT

连接到给定的Spark独立集群主服务器。端口必须是您的主服务器配置要使用的端口,默认情况下为7077

spark://HOST1:PORT1,HOST2:PORT2

使用带有Zookeeper的备用主机连接到给定的Spark独立集群。该列表必须使用Zookeeper设置高可用性集群中的所有主机。端口必须是每个主服务器配置使用的端口,默认情况下为7077

yarn

根据--deploy-mode的值clientcluster模式连接到yarn集群。集群位置将基于hadoop_con_diryarn_con_dir变量找到。

从文件中加载配置

bin/spark-submit脚本可以从配置文件加载默认的Spark配置值,并将其传递给应用程序。默认情况下,它将从$SPARK_HOME/conf/Spark-default.conf中读取配置。

通过这种方式加载默认的Spark配置可以避免使用某些选项执行spark-submit。例如,如果设置了spark.master属性,可以安全地从spark-submit中省略--master选项。

SparkConf上显式设置的配置值具有最高的优先级;
其次是通过
spark-submit脚本选项设置的配置;
最后是在
$SPARK_HOME/conf/Spark-default.conf文件中设置值。

如果不清楚配置选项从何而来,可以通过在执行spark-submit脚本时使用--verbose选项,来打印出细粒度的调试信息。

先进的依赖管理

当使用bin/spark-submit脚本提交应用程序时,应用程序jar包以及--jars选项中包含的任何jar包将自动转移到集群中。--jars之后提供的多个url必须用逗号分隔。该列表包含在driver和executor类路径中。目录扩展不能使用--jars

Spark使用以下URL方式,允许使用不同的策略来分发jar包:

方式说明
file: 绝对路径和file://uri由driver的HTTP文件服务器提供,每个executor从driver的HTTP服务器中提取文件。

hdfs:

http:

https:

ftp:

这些将按预期从URI中拉出文件和jar包。
local: local://开头的URI将作为每个工作节点上的本地文件存在。这意味着不会产生网络IO,并且对于推送到每个Worker的大型文件或jar包,或者通过NFSGlusterFS等共享的件或jar包都可以很好地工作。

注意:jar和文件被复制到executor节点上每个SparkContext的工作目录中。随着时间的推移,这会占用大量的空间,需要清理。使用YARN,清理是自动处理的,而使用Standalone,自动清理可以配置spark.worker.cleanup.appDataTtl属性。

用户还可以使用--packages提供以逗号分隔的Maven坐标列表,从而包含任何其他依赖项。使用此命令时将处理所有传递依赖项。对于Python,可以使用等效的--py-files选项将.egg.zip.py库分发给executor。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值