草庐IT

【Spark】spark-submit作业提交及参数设定

山顶夕景 2023-04-07 原文

note

文章目录

一、Spark的常用启动方式

1.1 local本地模式

spark单机运行,开发测试,可以local[N]来设置使用N个线程,每个线程有一个core。spark-submit默认是spark-submit --master local,spark-shell默认是spark-shell --master local。

注:
(1)只需要把Spark的安装包解压后,改一些常用的配置即可使用,而不用启动Spark的Master、Worker守护进程,也不用启动Hadoop的各服务(除非需要用到HDFS)。
(2)SparkSubmit进程既是客户提交任务的Client进程、又是Spark的driver程序、还充当着Spark执行Task的Executor角色。

1.2 Standalone模式

1.3 Spark on Yarn模式

Yarn 模式是把资源统一交给 Yarn 集群来管理,其优点在于实现了 application 的多样性,如 MapReduce 程序、HBase 集群、Storm 集群、spark 集群等;

Yarn 模式有两种运行模式:client 和 cluster,区别在于

  • client 模式的 Driver 运行在 client 端,而 client 端可能是 spark 集群内节点,也可以不是,一般来说不是集群内节点,这就需要在客户端节点上安装程序运行所需环境,以支持 spark 的正常执行;
  • cluster 模式的 Driver 运行在 spark 集群中的某个 NodeManager 上,而且不确定到底是哪个 NodeManager 上,这由 spark 的调度策略决定,

如果知道了在哪个节点,在该节点上安装程序运行所需环境即可,

但是事实是哪个节点都有可能,这意味着需要在所有节点上安装程序运行所需环境,显然这不是个好办法;

随着 application 的增加,需要不断安装新的包,而且不同 application 可能存在版本问题,这对于 client 模式来说或许还可以接受,但 cluster 模式肯定不行的,如果集群很大,装环境会很麻烦。

一句通俗的话描述 Pyspark On Yarn:Driver 从本地电脑获取环境后分发给 Container 来执行

二、spark-submit 详细参数说明

–master

master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local

MASTER_URL:设置集群的主URL,用于决定任务提交到何处执行。

常见的选项有

local:提交到本地服务器执行,并分配单个线程
local[k]:提交到本地服务器执行,并分配k个线程
spark://HOST:PORT:提交到standalone模式部署的spark集群中,并指定主节点的IP与端口
mesos://HOST:PORT:提交到mesos模式部署的集群中,并指定主节点的IP与端口
yarn:提交到yarn模式部署的集群中

–deploy-mode

在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client

DEPLOY_MODE:设置driver启动的位置,可选项如下,默认为client
client:在客户端上启动driver,这样逻辑运算在client上执行,任务执行在cluster上
cluster:逻辑运算与任务执行均在cluster上,cluster模式暂时不支持于Mesos集群或Python应用程序

–class

应用程序的主类,仅针对 java 或 scala 应用

CLASS_NAME:指定应用程序的类入口,即主类,仅针对java、scala程序,不作用于python程序

–name

应用程序的名称

–jars

用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下

–packages

包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标

–exclude-packages

为了避免冲突 ,指定的参数–package中不包含的jars包

–repositories

远程 repository

附加的远程资源库(包含jars包)等,可以通过maven坐标进行搜索

–py-files

PY_FILES:逗号隔开的的.zip、.egg、.py文件,这些文件会放置在PYTHONPATH下,该参数仅针对python应用程序

–files

FILES:逗号隔开的文件列表,这些文件将存放于每一个工作节点进程目录下

–conf PROP=VALUE

指定spark配置属性的值,格式为PROP=VALUE, 例如 --conf spark.executor.extraJavaOptions=“-XX:MaxPermSize=256m”

–properties-file

指定需要额外加载的配置文件,用逗号分隔,如果不指定,默认为 conf/spark-defaults.conf

–driver-memory

Driver内存,默认 1G

–driver-java-options

传给 driver 的额外的 Java 选项

–driver-library-path

传给 driver 的额外的库路径

–driver-class-path

传给 driver 的额外的类路径,用–jars 添加的jar包会自动包含在类路径里

–driver-cores

Driver 的核数,默认是1。在 yarn 或者 standalone 下使用

–executor-memory

每个 executor 的内存,默认是1G

–total-executor-cores

所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用

–num-executors

启动的 executor 数量。默认为2。在 yarn 下使用

–executor-core

每个 executor 的核数。在yarn或者standalone下使用

参数设置

当–master参数设置为Standalone,–deploy-mode参数设置为cluster时,如下选项可以设置:

–driver-cores NUM:driver使用的内核数,默认为1

当–master参数设置为Standalone或者Mesos,–deploy-mode参数设置为cluster时,如下选项可以设置:

–supervise:如果设置了该参数,driver失败是会重启
–kill SUBMISSION_ID:如果设置了该参数,则会杀死指定SUBMISSION_ID的driver进程
–status SUBMISSION_ID:如果设置了该参数,则请求返回指定SUBMISSION_ID的driver的状态

当–master参数设置为Standalone或者Mesos时,如下选项可以设置:

–total-executor-cores NUM:设置集群中所有工作节点上executor使用的内核总数

当–master参数设置为Standalone或者YARN时,如下选项可以设置:

–executor-cores NUM:每个executor使用的核数

当–master参数设置为YARN时,如下选项可以设置:

–driver-cores NUM :当–deploy-mode为cluster时,driver使用的内核数,默认为1
–queue QUEUE_NAME :将任务提交给哪个YARN队列,默认为YARN的默认队列
–num-executors NUM:设置启动的executor数量,默认为2
–archives ARCHIVES :被每个executor提取到工作目录的档案列表,用逗号隔开

三、模块依赖问题

  1. Driver 负责把本地的资源分发给 Container

  2. 在 client 模式下,Driver 就找在 Client 端,可以把 client 端的资源分发,而 cluster 模式下,Driver 可在集群任一节点,该节点是没有资源的

  3. 如果是 普通依赖:

在 client 模式下,Driver 可能自动收集资源,分发,无需上传依赖;

在 cluster 模式下,Driver 无法收集资源,必须上传依赖;

  1. 如果是 复杂依赖:

在 client 模式 和 cluster 模式下,都需要通过 虚拟环境 上传依赖

  1. 在工业环境中,使用的多是 cluster 模式,cluster 模式必须上传依赖

  2. 在调试环节,多使用 client 模式,client 只需上传复杂依赖即可

Reference

[0] 官方文档spark-submit说明
[1] spark-submit提交任务及参数说明
[2] Pyspark On Yarn 的模块依赖问题
[3] Pyspark学习笔记(二)— spark-submit命令
[4] 搞懂spark-submit参数及应用程序提交(详细)
[5] PySpark on Yarn 的 Python 环境与包依赖解决方式
[6] Spark常用启动方式(三种)
[7] 算法工程师应知应会-部署spark任务提交

有关【Spark】spark-submit作业提交及参数设定的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  5. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  10. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

随机推荐