spark - 提交app

应用提交

spark-submit命令的作用是在集群上启动应用,它可以通过统一的界面使用所有 Spark 支持的集群管理器,因此您不必特别为每个应用程序配置。

绑定应用程序的依赖

如果应用依赖于其他项目,则需要将它们与应用程序一起打包,以便将代码分发到 Spark 集群。

为此,需要创建一个包含代码及其依赖项的程序集 jar(或“uber”jar),sbtMaven 都有程序集插件。创建程序集 jar 时,将 Spark 和 Hadoop 列为提供的依赖项;这些不需要捆绑,因为它们是由集群管理器在运行时提供的,一旦你有了一个组装好的 jar,你就可以在传递你的 jar 时调用 bin/spark-submit 脚本,如下所示。

对于 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> \
  ... # other options
  <application-jar> \
  [application-arguments]

一些常用的选项:

  • --class: 程序的入口点,如(org.apache.spark.examples.SparkPi)
  • --master: 集群的master url,如(e.g. spark://23.195.26.187:7077)
  • --deploy-mode: driver程序部署在工作节点(cluster)上 or 本地作为外部客户端(client)(默认:客户端)
  • --conf: key=value 格式的任意 Spark 配置属性,对于包含空格的值,将“key=value”用引号括起来(如图所示)。
  • application-jar: 包含您的应用程序和所有依赖项的捆绑 jar 的路径,URL 必须在集群内全局可见,例如,存在于所有节点上的 hdfs:// 路径或 file:// 路径。
  • application-arguments: 传递给主类的 main 方法的参数(如果有)

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

client模式下,driver程序直接在作为集群clientspark-submit进程中启动

或者,如果您的应用程序是从远离工作机器的机器提交的(例如在您的笔记本电脑本地),通常使用cluster模式来最小化driver程序和executor程序之间的网络延迟。 目前,standalone不支持 Python 应用程序的cluster模式。

对于 Python 应用程序,只需在 <application-jar> 的位置传递一个 .py 文件,然后使用 --py-files 将 Python .zip、.egg 或 .py 文件添加到搜索路径。

有几个特定于正在使用的集群管理器的可用选项。例如,对于具有cluster部署模式的 Spark standalone cluster,您还可以指定--supervise以确保driver在失败并出现非零退出代码时自动重新启动。

以下是一些常用的公共参数:

# Run application locally on 8 cores
./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
./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
./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

# 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 50 \
  /path/to/examples.jar \
  1000

# 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 \
  1000

# 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 100 \
  http://path/to/examples.jar \
  1000


# Run on a Kubernetes cluster in cluster deploy mode
./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

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

master urlmeaning
local使用一个工作线程在本地运行 Spark(即根本没有并行性)
local[K]使用 K 个工作线程在本地运行 Spark(理想情况下,将其设置为您机器上的内核数)
local[K,F]使用 K 个工作线程和 F maxFailures 在本地运行 Spark(有关此变量的解释,请参阅 spark.task.maxFailures
local[*]使用与机器上的逻辑核心一样多的工作线程在本地运行 Spark
local[*,F]使用与机器上的逻辑核心和 F maxFailures 一样多的工作线程在本地运行 Spark
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根据 --deploy-mode 的值,以客户端或集群模式连接到 YARN 集群。 将根据 HADOOP_CONF_DIRYARN_CONF_DIR 变量找到集群位置
k8s://HOST:PORT根据 --deploy-mode 的值,以客户端或集群模式连接到 Kubernetes 集群。HOST 和 PORT 指的是 Kubernetes API 服务器。默认情况下,它使用 TLS 进行连接。 为了强制它使用不安全的连接,你可以使用 k8s://http://HOST:PORT

从文件中加载配置

Spark config page

Load default config

spark-submit 脚本可以从属性文件加载默认的 Spark 配置值并将它们传递给您的应用程序。默认情况下,它会从 Spark 目录中的 conf/spark-defaults.conf 读取选项。

以这种方式加载默认 Spark 配置可以避免对某些标志进行 spark-submit,例如,如果设置了 spark.master 属性,您可以安全地从 spark-submit 中省略 --master 标志。

spark配置的优先级:

  • 传入的配置文件
  • 传递给spark-submit的配置值
  • 默认配置文件中的值

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

高级依赖管理

使用 spark-submit 时,应用程序 jar 以及 --jars 选项中包含的任何 jar 将自动传输到集群。通过--jars参数传递的jar包必须通过逗号隔开,该列表包含在driverexecutor类路径中。目录扩展不适用于 --jars

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

  • file: 绝对路径和 file:/ URIdriver的 HTTP 文件服务器提供服务,每个executordriver 的HTTP 服务器拉取文件
  • hdfs:, http:, https:, ftp: 从 URI 中下拉文件和 JAR
  • local: 以 local:/ 开头,希望每个工作节点上的本地文件存在这个文件,这意味着不会产生网络IO,这种方式适用于被推送到每个worker的大文件或jar包,或者通过NFSGlusterFS共享的文件

请注意,JAR 和文件被复制到执行器节点上每个 SparkContext 的工作目录中。随着时间的推移,这可能会占用大量空间,需要清理。

  • 使用 YARN,自动处理清理
  • 使用 Spark standalone,可以使用 spark.worker.cleanup.appDataTtl 属性配置自动清理

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值