Spark性能调优之资源分配

性能优化王道就是给更多资源!机器更多了,CPU更多了,内存更多了,性能和速度上的提升,是显而易见的。基本上,在一定范围之内,增加资源与性能的提升,是成正比的;写完了一个复杂的spark作业之后,

进行性能调优的时候,首先第一步,我觉得,就是要来调节最优的资源配置;在这个基础之上,

如果说你的spark作业,能够分配的资源达到了你的能力范围的顶端之后,无法再分配更多的资源了,

公司资源有限;那么才是考虑去做后面的这些性能调优的点。

大体上这两个方面:core    mem

问题:

1、分配哪些资源?

2、在哪里分配这些资源?

3、为什么多分配了这些资源以后,性能会得到提升?

答案:

1、分配哪些资源?

executor、core 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的数量

--executor-memory 100m \  配置每个executor的内存大小

--executor-cores 3 \  配置每个executor的cpu core数量

--driver-memory 100m \  配置driver的内存(影响很大)

/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \

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

第一种,Spark Standalone,公司集群上,搭建了一套Spark集群,你心里应该清楚每台机器还能够

给你使用的,大概有多少内存,多少cpu core;那么,设置的时候,就根据这个实际的情况,

去调节每个spark作业的资源分配。比如说你的每台机器能够给你使用4G内存,2个cpu core;

20台机器;executor,20;平均每个executor:4G内存,2个cpu core。

第二种,Yarn。资源队列。资源调度。应该去查看,你的spark作业,要提交到的资源队列,  

 hadoop   spark  storm 每一个队列都有各自的资源(cpu mem)

大概有多少资源?500G内存,100个cpu core;executor,50;平均每个executor:10G内存,2个cpu core。

Spark-submit的时候怎么指定资源队列?  --conf spark.yarn.queue default

设置队列名称:spark.yarn.queue default

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

executor内存;executor cpu core)

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

增加executor:

如果executor数量比较少,那么,能够并行执行的task数量就比较少,就意味着,我们的Application的并行执行的能力就很弱。

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

增加每个executor的cpu core:

也是增加了执行的并行能力。原本20个executor,每个才2个cpu core。能够并行执行的task数量,

就是40个task。现在每个executor的cpu core,增加到了5个。能够并行执行的task数量,就是100个task。执行的速度,提升了2倍左右。

 

增加每个executor的内存量:

增加了内存量以后,对性能的提升,有三点:

1、如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘

甚至不写入磁盘。减少了磁盘IO

2、对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据,需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能。

3、对于task的执行可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了,

然后频繁GC,垃圾回收,minor GC和full GC。(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,

避免了速度变慢,性能提升

时间: 2024-12-25 18:22:49

Spark性能调优之资源分配的相关文章

Spark&Spark性能调优实战

Spark特别适用于多次操作特定的数据,分mem-only和mem & disk.其中mem-only:效率高,但占用大量的内存,成本很高;mem & disk:内存用完后,会自动向磁盘迁移,解决了内存不足的问题,却带来了数据的置换的消费.Spark常见的调优工具有nman.Jmeter和Jprofile,以下是Spark调优的一个实例分析: 1.场景:精确客户群 对一个容量为300g的客户信息表在spark上进行查询优化,该大宽表有1800多列,有效使用的有20列. 2.优化达到的效果:

Spark性能调优之JVM调优

Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成                2.Spark的调优为什么会和JVM的调优会有关联?--因为Scala也是基于JVM运行的语言                3.Spark中OOM产生的原因                4.如何在JVM这个层面上来对Spark进行调优 补充:                Spark程序运行时--JVM堆内存分配比例 RDD缓存的数据(0.6)    默认 对象_

spark性能调优 数据倾斜 内存不足 oom解决办法

[重要] Spark性能调优--扩展篇 : http://blog.csdn.net/zdy0_2004/article/details/51705043

Spark性能调优之合理设置并行度

Spark性能调优之合理设置并行度 1.Spark的并行度指的是什么?  spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度! 当分配完所能分配的最大资源了,然后对应资源去调节程序的并行度,如果并行度没有与资源相匹配,那么导致你分配下去的资源都浪费掉了.同时并行运行,还可以让每个task要处理的数量变少(很简单的原理.合理设置并行度,可以充分利用集群资源,减少每个task处理数据量,而增加性能加快运行速度.)   举例: 假如, 现在已经在sp

Spark性能调优之代码方面的优化

Spark性能调优之代码方面的优化 1.避免创建重复的RDD 对性能没有问题,但会造成代码混乱 2.尽可能复用同一个RDD,减少产生RDD的个数   3.对多次使用的RDD进行持久化(cache,persist,checkpoint) 如何选择一种最合适的持久化策略? 默认MEMORY_ONLY, 性能很高, 而且不需要复制一份数据的副本,远程传送到其他节点上(BlockManager中的BlockTransferService),但是这里必须要注意的是,在实际的生产环境中,恐怕能够直接用这种

Spark性能调优之解决数据倾斜

Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据    ? 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hive表中的数据本身很不均匀(比如某个 key对应了100万数据,其他key才对应了10条数据),而且业务场景需要频繁使用Spark对Hive表 执行某个分析操作,那么比较适合使用这种技术方案.    ? 方案实现思路:此时可以评估一下,是否可以通过Hive来进行数据预处理(即通过Hive ETL预先对

[Spark性能调优] Spark Shuffle 中 JVM 内存使用及配置详情

[Spark性能调优]  Spark Shuffle 中 JVM 内存使用及配置详情 本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对

Spark性能调优——扩展篇

本文要解决的问题: 从更深层次考虑,对Spark进行性能调优. 目的 继基础篇分析了开发调优与资源调优之后,本文作为拓展篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 简述 有时候,大家可能会遇到大数据开发过程中一个比较棘手的问题,那就是数据倾斜,此时Spark作业的性能会比预期差很多,数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢.

[Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情

本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对 JVM 是怎么使用,你怎么可以很有信心地或者是完全确定地掌握和控制数据的缓存空间呢,所