spark调优(一)【spark参数介绍】

本文介绍了Spark on YARN的两种部署模式——客户端模式和集群模式,并详细解释了它们之间的区别。此外,还列举了一些重要的配置参数,以及如何通过spark-submit脚本提交Spark作业。

1 spark on yarn常用属性介绍

属性名默认值属性说明
spark.yarn.am.memory512m在客户端模式(client mode)下,yarn应用master使用的内存数。在集群模式(cluster mode)下,使用spark.driver.memory代替。
spark.driver.cores1在集群模式(cluster mode)下,driver程序使用的核数。在集群模式(cluster mode)下,driver程序和master运行在同一个jvm中,所以master控制这个核数。在客户端模式(client mode)下,使用spark.yarn.am.cores控制master使用的核。
spark.yarn.am.cores1在客户端模式(client mode)下,yarn应用的master使用的核数。在集群模式下,使用spark.driver.cores代替。
spark.yarn.am.waitTime100ms在集群模式(cluster mode)下,yarn应用master等待SparkContext初始化的时间。在客户端模式(client mode)下,master等待driver连接到它的时间。
spark.yarn.submit.file.replication3文件上传到hdfs上去的replication次数
spark.yarn.preserve.staging.filesfalse设置为true时,在job结束时,保留staged文件;否则删掉这些文件。
spark.yarn.scheduler.heartbeat.interval-ms3000Spark应用masteryarn resourcemanager之间的心跳间隔
spark.yarn.scheduler.initial-allocation.interval200ms当存在挂起的容器分配请求时,spark应用master发送心跳给resourcemanager的间隔时间。它的大小不能大于spark.yarn.scheduler.heartbeat.interval-ms,如果挂起的请求还存在,那么这个时间加倍,直到到达spark.yarn.scheduler.heartbeat.interval-ms大小。
spark.yarn.max.executor.failuresnumExecutors * 2,并且不小于3在失败应用程序之前,executor失败的最大次数。
spark.executor.instances2Executors的个数。这个配置和spark.dynamicAllocation.enabled不兼容。当同时配置这两个配置时,动态分配关闭,spark.executor.instances被使用
spark.yarn.executor.memoryOverheadexecutorMemory * 0.10,并且不小于384m每个executor分配的堆外内存。
spark.yarn.driver.memoryOverheaddriverMemory * 0.10,并且不小于384m在集群模式下,每个driver分配的堆外内存。
spark.yarn.am.memoryOverheadAM memory * 0.10,并且不小于384m在客户端模式下,每个driver分配的堆外内存
spark.yarn.am.port随机Yarn 应用master监听的端口。
spark.yarn.queuedefault应用提交的yarn队列的名称
spark.yarn.jarnoneJar文件存放的地方。默认情况下,spark jar安装在本地,但是jar也可以放在hdfs上,其他机器也可以共享。

2 客户端模式和集群模式的区别

这里我们要区分一下什么是客户端模式(client mode),什么是集群模式(cluster mode)。

我们知道,当在YARN上运行Spark作业时,每个Spark executor作为一个YARN容器(container)运行。Spark可以使得多个Tasks在同一个容器(container)里面运行。
yarn-clusteryarn-client模式的区别其实就是Application Master进程的区别,在yarn-cluster模式下,driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行。然而yarn-cluster模式不适合运行交互类型的作业。
yarn-client模式下,Application Master仅仅向YARN请求executorclient会和请求的container通信来调度他们工作,也就是说Client不能离开。下面的图形象表示了两者的区别。

这里写图片描述


这里写图片描述

2.1 Spark on YARN集群模式分析

2.1.1 客户端操作
  • 1、根据yarnConf来初始化yarnClient,并启动yarnClient

  • 2、创建客户端Application,并获取ApplicationID,进一步判断集群中的资源是否满足executorApplicationMaster申请的资源,如果不满足则抛出IllegalArgumentException

  • 3、设置资源、环境变量:其中包括了设置ApplicationStaging目录、准备本地资源(jar文件、log4j.properties)、设置Application其中的环境变量、创建Container启动的Context等;

  • 4、设置Application提交的Context,包括设置应用的名字、队列、AM的申请的Container、标记该作业的类型为Spark

  • 5、申请Memory,并最终通过yarnClient.submitApplicationResourceManager提交该Application

当作业提交到YARN上之后,客户端就没事了,甚至在终端关掉那个进程也没事,因为整个作业运行在YARN集群上进行,运行的结果将会保存到HDFS或者日志中。

2.1.2 提交到YARN集群,YARN操作
  • 1、运行ApplicationMasterrun方法;

  • 2、设置好相关的环境变量。

  • 3、创建amClient,并启动;

  • 4、在Spark UI启动之前设置Spark UIAmIpFilter

  • 5、在startUserClass函数专门启动了一个线程(名称为Driver的线程)来启动用户提交的Application,也就是启动了Driver。在Driver中将会初始化SparkContext

  • 6、等待SparkContext初始化完成,最多等待spark.yarn.applicationMaster.waitTries次数(默认为10),如果等待了的次数超过了配置的,程序将会退出;否则用SparkContext初始化yarnAllocator

  • 7、当SparkContext、Driver初始化完成的时候,通过amClientResourceManager注册ApplicationMaster;

  • 8、分配并启动Executeors。在启动Executeors之前,先要通过yarnAllocator获取到numExecutorsContainer,然后在Container中启动Executeors
    如果在启动Executeors的过程中失败的次数达到了maxNumExecutorFailures的次数,maxNumExecutorFailures的计算规则如下:

// 默认为numExecutors * 2,最少为3
private val maxNumExecutorFailures = sparkConf.getInt("spark.yarn.max.executor.failures",
    sparkConf.getInt("spark.yarn.max.worker.failures", math.max(args.numExecutors * 2, 3)))

那么这个Application将失败,将Application Status标明为FAILED,并将关闭SparkContext。其实,启动Executeors是通过ExecutorRunnable实现的,而ExecutorRunnable内部是启动CoarseGrainedExecutorBackend的。

  • 9、最后,Task将在CoarseGrainedExecutorBackend里面运行,然后运行状况会通过Akka通知CoarseGrainedScheduler,直到作业运行完成。

2.2 Spark on YARN客户端模式分析

yarn-cluster模式一样,整个程序也是通过spark-submit脚本提交的。但是yarn-client作业程序的运行不需要通过Client类来封装启动,而是直接通过反射机制调用作业的main函数。下面是流程。

  • 1、通过SparkSubmit类的launch的函数直接调用作业的main函数(通过反射机制实现),如果是集群模式就会调用Clientmain函数。

  • 2、而应用程序的main函数一定都有个SparkContent,并对其进行初始化;

  • 3、在SparkContent初始化中将会依次做如下的事情:设置相关的配置、注册MapOutputTracker、BlockManagerMaster、BlockManager,创建taskSchedulerdagScheduler

  • 4、初始化完taskScheduler后,将创建dagScheduler,然后通过taskScheduler.start()启动taskScheduler,而在taskScheduler启动的过程中也会调用SchedulerBackendstart方法。
    SchedulerBackend启动的过程中将会初始化一些参数,封装在ClientArguments中,并将封装好的ClientArguments传进Client类中,并client.runApp()方法获取Application ID

  • 5、client.runApp里面的做的和上章客户端进行操作那节类似,不同的是在里面启动是ExecutorLauncheryarn-cluster模式启动的是ApplicationMaster)。

  • 6、在ExecutorLauncher里面会初始化并启动amClient,然后向ApplicationMaster注册该Application。注册完之后将会等待driver的启动,当driver启动完之后,会创建一个MonitorActor对象用于和CoarseGrainedSchedulerBackend进行通信(只有事件AddWebUIFilter他们之间才通信,Task的运行状况不是通过它和CoarseGrainedSchedulerBackend通信的)。
    然后就是设置addAmIpFilter,当作业完成的时候,ExecutorLauncher将通过amClient设置Application的状态为FinalApplicationStatus.SUCCEEDED

  • 7、分配Executors,这里面的分配逻辑和yarn-cluster里面类似。

  • 8、最后,Task将在CoarseGrainedExecutorBackend里面运行,然后运行状况会通过Akka通知CoarseGrainedScheduler,直到作业运行完成。

  • 9、在作业运行的时候,YarnClientSchedulerBackend会每隔1秒通过client获取到作业的运行状况,并打印出相应的运行信息,当Application的状态是FINISHED、FAILEDKILLED中的一种,那么程序将退出等待。

  • 10、最后有个线程会再次确认Application的状态,当Application的状态是FINISHED、FAILEDKILLED中的一种,程序就运行完成,并停止SparkContext。整个过程就结束了。

3 spark submit 和 spark shell参数介绍

参数名格式参数说明
–masterMASTER_URL如spark://host:port
–deploy-modeDEPLOY_MODEClient或者master,默认是client
–classCLASS_NAME应用程序的主类
–nameNAME应用程序的名称
–jarsJARS逗号分隔的本地jar包,包含在driver和executor的classpath下
–packages包含在driver和executor的classpath下的jar包逗号分隔的”groupId:artifactId:version”列表
–exclude-packages用逗号分隔的”groupId:artifactId”列表
–repositories逗号分隔的远程仓库
–py-filesPY_FILES逗号分隔的”.zip”,”.egg”或者“.py”文件,这些文件放在python app的PYTHONPATH下面
–filesFILES逗号分隔的文件,这些文件放在每个executor的工作目录下面
–confPROP=VALUE固定的spark配置属性
–properties-fileFILE加载额外属性的文件
–driver-memoryMEMDriver内存,默认1G
–driver-java-options传给driver的额外的Java选项
–driver-library-path传给driver的额外的库路径
–driver-class-path传给driver的额外的类路径
–executor-memoryMEM每个executor的内存,默认是1G
–proxy-userNAME模拟提交应用程序的用户
–driver-coresNUMDriver的核数,默认是1。这个参数仅仅在standalone集群deploy模式下使用
–superviseDriver失败时,重启driver。在mesos或者standalone下使用
–verbose打印debug信息
–total-executor-coresNUM所有executor总共的核数。仅仅在mesos或者standalone下使用
–executor-coreNUM每个executor的核数。在yarn或者standalone下使用
–driver-coresNUMDriver的核数,默认是1。在yarn集群模式下使用
–queueQUEUE_NAME队列名称。在yarn下使用
–num-executorsNUM启动的executor数量。默认为2。在yarn下使用

你可以通过spark-submit --help或者spark-shell --help来查看这些参数。

<think>我们正在讨论Spark参数,根据引用内容,用户想了解Spark的相关参数。引用中提到了几种设置参数的方式:代码中设置、spark-submit传递参数、配置文件,以及些具体参数如num-executors, executor-memory, executor-cores, driver-memory等。此外,引用还提到了些配置项如spark.storage.memoryFraction, spark.shuffle.memoryFraction, spark.locality.wait等。 我将围绕Spark参数展开,重点介绍资源参数、内存管理参数、Shuffle参数其他常用参数。同时,我会在回答中自然地标注引用来源。 注意:由于引用内容有限,我会结合我的知识补充些常见的参数,并在适当的地方标注引用。 回答结构: 1. 资源分配参数 2. 内存管理参数 3. Shuffle参数 4. 其他常用参数 5. 参数设置方式 6. 相关问题 注意:引用标记[^1][^2][^3]分别对应三个引用段落。 </think>### Spark核心参数详解 根据引用内容,以下是Spark性能化的关键参数分类及配置建议: --- #### 、**资源分配参数** **1. Executor资源配置** | 参数 | 作用 | 推荐值 | 配置方式示例 | |------|------|--------|--------------| | `num-executors` | Executor数量 | 50~100(集群规模决定) | `--num-executors 50` [^1][^2] | | `executor-cores` | 单Executor并发任务数 | 2~5(避免HDFS IO瓶颈) | `--executor-cores 2` [^2] | | `executor-memory` | Executor堆内存 | 4G~8G(需预留堆外内存) | `--executor-memory 4G` [^2] | **2. Driver资源配置** ```bash --driver-memory 2G # Driver堆内存,处理collect()等操作[^2] ``` --- #### 二、**内存管理参数** **1. 内存分配比例** ```bash --conf spark.storage.memoryFraction=0.6 # 存储RDD缓存的内存占比(默认0.6)[^2] --conf spark.shuffle.memoryFraction=0.2 # Shuffle操作内存占比(默认0.2)[^2] ``` > **化原则**:缓存密集型作业提高`storage.memoryFraction`,Shuffle密集型提高`shuffle.memoryFraction` **2. 堆外内存配置** ```bash --conf spark.yarn.executor.memoryOverhead=2048 # 堆外内存(单位MB)[^2] ``` > 公式: **总内存 = `executor-memory` + `memoryOverhead`** > 堆外内存用于线程栈、JVM元数据等,默认值为`max(384MB, 0.07 × executor-memory)` --- #### 三、**Shuffle参数** | 参数 | 作用 | 推荐值 | |------|------|--------| | `spark.shuffle.file.buffer` | Shuffle写缓冲区大小 | 64K→128K(减少磁盘IO)[^2] | | `spark.shuffle.io.maxRetries` | 拉取数据重试次数 | 60(网络不稳定时高)[^3] | | `spark.shuffle.io.retryWait` | 拉取数据等待间隔 | 5s→10s(高延迟网络)[^3] | | `spark.reducer.maxSizeInFlight` | Reduce拉取数据量 | 48M→96M(提升吞吐量) | --- #### 四、**任务参数** ```bash --conf spark.locality.wait=10s # 数据本地性等待时间[^2] --conf spark.network.timeout=120s # 网络超时阈值(默认120s)[^2] --conf spark.core.connection.ack.wait.timeout=300 # Executor心跳超时[^2] ``` --- #### 五、**参数设置先级** 1. **代码中显式设置**(最高先级) ```scala spark.conf.set("spark.shuffle.io.retryWait", "10s") [^1] ``` 2. **spark-submit传递** ```bash spark-submit --conf spark.executor.cores=4 ... [^1] ``` 3. **配置文件**(`spark-defaults.conf`) 4. **系统默认值**(不建议依赖) > 生产环境建议先使用`spark-submit`动态配置[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值