spark优化(一):合理分配资源

分配更多资源:性能调优的王道,就是增加和分配更多的资源,性能和速度上的提升,是显而易见的;基本上,在一定范围之内,增加资源与性能的提升,是成正比的;写完了一个复杂的spark作业之后,进行性能调优的时候,首先第一步,我觉得,就是要来调节最优的资源配置;在这个基础之上,如果说你的spark作业,能够分配的资源达到了你的能力范围的顶端之后,无法再分配更多的资源了,公司资源有限;那么才是考虑去做后面的这些性能调优的点。

问题:
1、分配哪些资源?
2、在哪里分配这些资源?
3、为什么多分配了这些资源以后,性能会得到提升?

答案:
1、分配哪些资源?executor、cpu per executor、memory per executor、driver memory
2、在哪里分配这些资源?在我们在生产环境中,提交spark作业时,用的spark-submit shell脚本,里面调整对应的参数

/usr/local/spark/bin/spark-submit \
--class cn.spark.sparktest.core.WordCountCluster \
--num-executors 3 \  配置executor的数量
--driver-memory 100m \  配置driver的内存(影响不大)
--executor-memory 100m \  配置每个executor的内存大小
--executor-cores 3 \  配置每个executor的cpu core数量
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \

3、调节到多大,算是最大呢?

第一种,Spark Standalone,公司集群上,搭建了一套Spark集群,你心里应该清楚每台机器还能够给你使用的,大概有多少内存,多少cpu core;那么,设置的时候,就根据这个实际的情况,去调节每个spark作业的资源分配。比如说你的每台机器能够给你使用8G内存,4个cpu core;10台机器;executor数可设置20;平均每个executor分配4G内存,2个cpu。

第二种,Yarn。资源队列。资源调度。应该去查看,你的spark作业,要提交到的资源队列,大概有多少资源?500G内存,100个cpu core;executor数50;平均每个executor分配10G内存,2个cpu。

一个原则,你能使用的资源有多大,就尽量去调节到最大的大小(executor的数量,几十个到上百个不等;executor内存;executor cpu core)

4、为什么调节了资源以后,性能可以提升?

4.1、增加executor:
    如果executor数量比较少,那么,能够并行执行的task数量就比较少,就意味着,我们的Application的并行执行的   能力就很弱。
    比如有3个executor,每个executor有2个cpu core,那么同时能够并行执行的task,就是6个。6个执行完以后,再换下一批6个task。
    增加了executor数量以后,那么,就意味着,能够并行执行的task数量,也就变多了。比如原先是6个,现在可能可以并行执行10个,甚至20个,100个。那么并行能力就比之前提升了数倍,数十倍。
    相应的,性能(执行的速度),也能提升数倍~数十倍。

4.2、增加每个executor的cpu core,也是增加了执行的并行能力。原本20个executor,每个才2个cpu core。能够并行执行的task数量,就是40个task。
    现在每个executor的cpu core,增加到了5个。能够并行执行的task数量,就是100个task。
    执行的速度,提升了2.5倍。

4.3、增加每个executor的内存量。增加了内存量以后,对性能的提升,有两点:
    如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘。减少了磁盘IO。
    对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据,需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能。
    对于task的执行,可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了,然后频繁GC,垃圾回收,minor GC和full GC。(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,避免了速度变慢,速度变快了。

时间: 2024-08-02 06:44:08

spark优化(一):合理分配资源的相关文章

Spark记录-Spark性能优化(开发、资源、数据、shuffle)

开发调优篇 原则一:避免创建重复的RDD 通常来说,我们在开发一个Spark作业时,首先是基于某个数据源(比如Hive表或HDFS文件)创建一个初始的RDD:接着对这个RDD执行某个算子操作,然后得到下一个RDD:以此类推,循环往复,直到计算出最终我们需要的结果.在这个过程中,多个RDD会通过不同的算子操作(比如map.reduce等)串起来,这个"RDD串",就是RDD lineage,也就是"RDD的血缘关系链". 我们在开发过程中要注意:对于同一份数据,只应该

spark作业调优(一)-------合理分配资源

原理: spark作业sparkcontext.DAGDAGSchedler.taskSchulder.会将编写算子.切割成大量的task,会提交到application的excutor上执行如何资源设置cup core和excutor较少,就会造成能并行处理的task数量较少,从而就会增加task的运行时间,所以根据资源配置分配资源是很有必要的会很大程度的提高task的运行时间. 例子: 设置参数: 原文地址:https://www.cnblogs.com/SupperMan/p/903544

spark性能调优之资源调优

转https://tech.meituan.com/spark-tuning-basic.html spark作业原理 使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程.根据你使用的部署模式(deploy-mode)不同,Driver进程可能在本地启动,也可能在集群中某个工作节点上启动.Driver进程本身会根据我们设置的参数,占有一定数量的内存和CPU core.而Driver进程要做的第一件事情,就是向集群管理器(可以是Spark Stand

Spark On YARN内存分配

本文转自:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool 此文解决了Spark yarn-cluster模式运行时,内存不足的问题. Spark yarn-cluster模式运行时,注意yarn.app.mapreduce.am.resource.mb的设置.默认为1G Spark On YARN内存分配 本文主要了解Spark On YARN部署模式下的内存分配情况,因为没有

Spark优化一则 - 减少Shuffle

Spark优化一则 - 减少Shuffle 看了Spark Summit 2014的A Deeper Understanding of Spark Internals,视频(要科学上网)详细讲解了Spark的工作原理,Slides的45页给原始算法和优化算法. 破砂锅用自己3节点的Spark集群试验了这个优化算法,并进一步找到更快的算法.测试数据是Sogou实验室的日志文件前10000000条数据.目标是对日志第2列数据,按照第一个字母合并,得到每个首字母有几条记录. 所有的方案都重新启动Spa

【总结】Spark优化-多Job并发执行

Spark程序中一个Job的触发是通过一个Action算子,比如count(), saveAsTextFile()等 在这次Spark优化测试中,从Hive中读取数据,将其另外保存四份,其中两个Job采用串行方式,另外两个Job采用并行方式.将任务提交到Yarn中执行.能够明显看出串行与兵线处理的性能. 每个Job执行时间: JobID 开始时间 结束时间 耗时 Job 0 16:59:45 17:00:34 49s Job 1 17:00:34 17:01:13 39s Job 2 17:01

Project:如何为项目中的任务合理分配资源

Blog 地址:https://blog.51cto.com/13969817 一个完整的项目除了包含不同阶段的细分的任务之外,还需要项目负责人\经理为每个任务分配所需要的资源,不限于人力资源,成本或者设备等资源,以此来衡量该项目资源储备是否充足,预算是否超过预期标准,设备是否满足项目需求,在Project中,资源分配包含: 给一个任务分配一个资源 给一个任务分配多个资源 给多个任务分配多个资源 给一个任务分配一个资源: 在实际的项目管理中,为了方便日后统计每个任务的进展情况以及每个参与项目的人

spark优化

优化一般考虑资源优化 一.资源优化 I 集群方面的:driver的内存,worker内存,核数 方法 1.配置文件:spark-env.sh(配置worker的信息) SPARK_WORKER_CORE 每个worker的使用总核数 SPARK_WORKER_MEMORY 每个worker所使用的内存数(shuffer阶段利用netty 传输文件还会使用到的executor堆外内存也在其中) SPARK_WORKER_INSTANCE 每台节点上启动的worker数量(standalone集群上

spark on yarn container分配极端倾斜

环境:CDH5.13.3  spark2.3 在提交任务之后,发现executor运行少量几台nodemanager,而其他nodemanager没有executor分配. 通过spark-shell模拟如下: 第一次尝试分配6个exeutor,具体如下 spark2-shell --driver-memory 1G --executor-memory 2G --num-executors 6 --executor-cores 3 第二次尝试分配20个executor,具体如下 spark2-s