【Spark床头书系列】Spark提交任务官网权威详解

Spark提交任务官网权威详解


bin目录中的 spark-submit脚本用于在集群上启动应用程序。它可以通过统一接口使用所有支持的 集群管理器,因此您不必为每个管理器单独配置应用程序。

打包应用程序依赖项

如果您的代码依赖于其他项目,您需要将它们与应用程序一起打包,以便将代码分发到Spark集群。为此,请创建一个包含您的代码及其依赖项的汇总JAR文件(也称为“uber” JAR)。sbtMaven都有汇总插件。创建汇总JAR时,请将Spark和Hadoop列为“provided”依赖项;因为它们在运行时由集群管理器提供。一旦您有了汇总的JAR文件,就可以调用bin/spark-submit脚本,并传递您的JAR。

对于Python,您可以使用spark-submit--py-files参数将.py.zip.egg文件添加到应用程序的分发中。如果您依赖于多个Python文件,我们建议将它们打包成一个.zip.egg文件。

使用spark-submit启动应用程序

一旦用户应用程序被打包,就可以使用bin/spark-submit脚本来启动它。该脚本会设置Spark及其依赖项的类路径,并支持Spark支持的不同集群管理器和部署模式:

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

一些常用的选项包括:

  • --class:指定应用程序的入口点(例如org.apache.spark.examples.SparkPi)。
  • --master:指定集群的主节点URL(例如spark://23.195.26.187:7077)。
  • --deploy-mode:指定驱动程序在工作节点上部署时的模式,可以是cluster(默认)或client
  • --conf:以key=value格式指定任意的Spark配置属性。如果值包含空格,请使用引号将"key=value"括起来。
  • application-jar:指定打包的JAR文件路径,包含您的应用程序和所有依赖项。URL必须在集群内的所有节点上都可见,可以是hdfs://路径或所有节点上存在的file://路径。
  • application-arguments:传递给主类的主方法的参数,如果有的话。

--deploy-mode选项有两种常见的部署策略:

  • 如果从与工作节点物理上相邻的网关机器(例如独立EC2集群中的主节点)提交应用程序,则适用于client模式。在client模式下,驱动程序直接在spark-submit进程中启动,spark-submit进程充当集群的客户端。应用程序的输入和输出会附加到控制台。因此,这种模式特别适合涉及REPL(例如Spark shell)的应用程序。
  • 或者,如果应用程序是从远离工作节点的机器(例如本地笔记本电脑)提交的,则通常使用cluster模式以最小化驱动程序和执行器之间的网络延迟。目前,独立模式不支持Python应用程序的集群模式。

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

spark-submit还提供了一些针对所使用的集群管理器的特定选项。例如,在具有cluster部署模式的Spark独立集群中,您还可以使用--supervise选项,确保驱动程序在发生非零退出代码时自动重新启动。要枚举所有可用于spark-submit的此类选项,请运行spark-submit --help命令。

常见示例:

# 在本地使用8个内核线程运行应用程序
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master local[8] \
  /path/to/examples.jar \
  100

# 在Spark独立集群中以client部署模式运行
./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独立集群中以cluster部署模式和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

# 在YARN集群上运行
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode cluster \
  --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集群中以cluster部署模式和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

# 在Kubernetes集群中以cluster部署模式运行
./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

主节点URL

传递给Spark的主节点URL可以采用以下格式:

主节点URL含义
local在本地运行Spark,使用一个工作线程(即没有并行性)。
local[K]在本地运行Spark,使用K个工作线程(理想情况下,设置为您机器上的核心数)。
local[K,F]在本地运行Spark,使用K个工作线程和F个最大失败次数(请参阅spark.task.maxFailures变量的说明)。
local[*]在本地运行Spark,使用与机器上的逻辑核心数相同数量的工作线程。
local[*,F]在本地运行Spark,使用与机器上的逻辑核心数相同数量的工作线程和F个最大失败次数。
spark://HOST:PORT连接到指定的Spark独立集群主节点。端口必须是您的主节点配置的端口,默认为7077。
spark://HOST1:PORT1,HOST2:PORT2连接到具有Zookeeper的指定具有备用主节点的Spark独立集群。列表必须包含使用Zookeeper设置的所有主节点主机。端口必须是每个主节点配置的端口,默认为7077。
mesos://HOST:PORT连接到指定的Mesos集群。端口必须是您配置的端口,默认为5050。或者,对于使用Zookeeper的Mesos集群,使用mesos://zk://...。要以--deploy-mode cluster方式提交,请将HOST:PORT配置为连接到MesosClusterDispatcher的方式。
yarn连接到YARN集群,根据--deploy-mode的值在clientcluster模式下连接。集群位置将基于HADOOP_CONF_DIRYARN_CONF_DIR变量来确定。
k8s://HOST:PORTKubernetes集群中以cluster部署模式连接。当前不支持client模式,但将来版本将支持。HOSTPORTKubernetes API Server的地址。它默认使用TLS进行连接。为了强制使用不安全连接,可以使用k8s://http://HOST:PORT

从文件加载配置

spark-submit脚本可以从属性文件中加载默认的Spark配置值,并将其传递给您的应用程序。默认情况下,它将从Spark目录中的conf/spark-defaults.conf中读取选项。有关更多细节,请参阅有关加载默认配置的部分。

通过这种方式加载默认的Spark配置可以避免对spark-submit的某些标志进行设置。例如,如果设置了spark.master属性,则可以安全地省略spark-submit中的--master标志。一般来说,SparkConf上显式设置的配置值优先级最高,然后是传递给spark-submit的标志,然后是默认文件中的值。

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

高级依赖管理

使用spark-submit时,应用程序JAR文件以及使用--jars选项包含的任何JAR文件都将自动传输到集群。--jars之后提供的URL必须用逗号分隔。这个列表会被包含在驱动程序和执行器的类路径中。目录展开在--jars中不起作用。

Spark使用以下URL方案来实现JAR文件的传播:

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

请注意,JAR文件和文件将复制到执行器节点上每个SparkContext的工作目录中。随着时间的推移,这可能会使用大量的空间,并且需要进行清理。在YARN中,清理是自动处理的;在独立模式下,可以使用spark.worker.cleanup.appDataTtl属性配置自动清理。

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

对于Python,可以使用相应的--py-files选项将.egg.zip.py库分发到执行器。

更多信息

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值