Spark(22)——spark调优
Posted Java学习基地Java毕设定制
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark(22)——spark调优相关的知识,希望对你有一定的参考价值。
在当前的大数据时代,Spark作为一款快入闪电⚡️的计算引擎普遍为大家所熟知和使用,在使用Spark的时候难免会遇到各种各样的问题,其中大部分原因是数据倾斜,但是我们在对整个Spark进行调优时,最开始可以调整Spark中各种各样的参数设置和分配,如果大部分参数调试好之后还不能满足自己的需求,这时候主要考虑的一定是优化自己的代码,这是非常重要的!!!
常用的参数:
num-executors:
这个参数设置了Spark运行时需要多少个Executor进程来执行,当程序放在Yarn上运行时,会启动相应数量的Executor,这个参数如果不设置,默认的情况下Executor的数量比较少,可以适当的进行调高,但不要过高。平常接触的业务中最大设置过80,我那时候已经觉得自己很不要脸了~
executor-memory:
该参数设置了每个Executor的内存,这个参数的设置会直接影响到许多程序的运行,常见的OOM异常会跟该参数有直接的关系,这个的设置就要取决于自己的内存的大小,量力而行,可以用上面的参数*该参数,这个乘积是不能超过最大内存的,个人建议设置成最大内存的一半左右,如果还有其他人与你一起共用该内存,设置过大会影响他人的性能。
driver-memory:
这个参数表示dirver的内存大小,默认是1,可以根据情况进行适当的调高,个人建议设置到10-20左右,避免发生OOM。
executor-cores:
这个是Spark中核心配置之一,设置每个Executor的核心CPU的数量,一个Executor的CPU同时只能运行一个任务,这个平常设置都是1-4个,最大的时候是4。
driver-cores:
这个是driver程序的CPU内核数量,默认为1,本人一直都在使用默认,没有调过,大家可以尝试下适当调高,之前看别人的文章可以调到8-16。
default-paralleism:
这个参数用来设置每个stage的task数量,在官方中给出的建议是设置在num-executor和executor-cores的乘积的2-3倍左右,我一般设置的数量大概是200-500之间,可以根据num-executor和executor-cores进行适当的调整。
Tips:上面说了一些常用的参数,如果作出适当的调整后还没有满足需要,就应该考虑修改自己的业务逻辑了!!!
数据倾斜
大家都知道在Spark任务中,使用了某些算子,可能会存在Shuffle过程,一但存在Shuffle过程,那就代表会出现数据倾斜的可能,所以数据倾斜指的一般都是在Shuffle过程中的数据倾斜。
产生的原因:
在执行到Shuffle过程中,由于我们的数据中Key的数据量相差较大,导致其中每个Task处理的数据量不同0哦那个,某些任务执行的很快,某些任务执行的很慢甚至是OOM,这就是数据倾斜。其中还有一个概念是数据过量,这两个概念并不相同,倾斜只是某些key中的数据量很大,过量时全部的Key的数据量都很大。
代码部分优化处理
在读数据的时候,应适当的给数据进行一些分类。
1.需要读到很多不同位置的数据,保证每个数据的RDD只有一个,在第二次使用时,直接使用该RDD,不要重新读。
2.对于一些大批量的数据,可以使用Spark中广播变量的功能,将该数据通过广播的形式通知到各个Executor中。
3.对于频繁使用的数据,在读取转成RDD后应当选择一种合适的持久化策略进行持久化,Spark它非常看不起磁盘,觉得它特别垃圾,在默认的持久化策略中使用的是MEMORY_ONLY。Spark中的持久化策略有12种,其中名称带2的方式都是将持久化的数据进行复制一份副本,把副本保存在不同的节点上,以便容错。
val NONE = new StorageLevel(false, false , false , false )
val DISK_ONLY = new StorageLevel(true, false , false , false )
val DISK_ONLY_2 = new StorageLevel(true, false , false , false , 2 )
val MEMORY_ONLY = new StorageLevel(false, true , false , true )
val MEMORY_ONLY_2 = new StorageLevel(false, true , false , true , 2 )
val MEMORY_ONLY_SER = new StorageLevel(false, true , false , false )
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true , false , false , 2 )
val MEMORY_AND_DISK = new StorageLevel(true, true , false , true )
val MEMORY_AND_DISK_2 = new StorageLevel(true, true , false , true , 2 )
val MEMORY_AND_DISK_SER = new StorageLevel(true, true , false , false )
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true , false , false , 2 )
val OFF_HEAP = new StorageLevel(true, true , true , false , 1 )
以上是关于Spark(22)——spark调优的主要内容,如果未能解决你的问题,请参考以下文章