Spark学习笔记(6)性能调优

1.调节并行度

并行度是指各个stage中task的数量。
1)官方推荐,task数量设置成spark application总cpu core数量的2~3倍,比如150个cpu core,基本要设置task数量为300~500。
2)设置并行度

SparkConf conf = new SparkConf().set("spark.default.parallelism", "500")

2.RDD优化

1)复用RDD
2)准确cacheRDD
3)序列化

3.广播大变量

Task在处理变量时,每一Task并行执行回拷贝一份变量副本。如果变量很大则会消耗很多内存。而广播变量时Executor级别的。在Driver中有一份,在Executor中有份副本变量。Task运行时,使用广播变量会先从本地executor对应的blockManager中获取若没有,或者就近从其他blockmanager中获取或者driver。

4.Kryo序列化

默认情况下,Spark内部是使用Java的序列化机制,ObjectOutputStream/ObjectInputStream,对象输入输出流机制,来进行序列化。
优点:处理起来比较方便,只是在算子里面使用的变量,必须是实现Serializable接口的。
缺点:默认的序列化机制的效率不高,序列化的速度比较慢;序列化以后的数据,占用的内存空间相对还是比较大。
Kryo序列化机制,比默认的Java序列化机制,速度要快,序列化后的数据要更小,大概是Java序列化机制的1/10。
Kryo序列化机制,一旦启用以后,会生效的几个地方:

算子函数中使用到的外部变量,使用Kryo后,优化网络传输的性能,可以优化集群中内存的占用和消耗
持久化RDD时进行序列化,StorageLevel.MEMORY_ONLY_SER。持久化RDD占用的内存越少,task执行的时候创建的对象,就不至于频繁的占满内存,频繁发生GC。
shuffle:可以优化网络传输的性能
使用Kryo序列化步骤:

SparkConf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
//注册你使用到的,需要通过Kryo序列化的自定义类。
SparkConf.registerKryoClasses(new Class[{CategorySoryKey.class})

5.调节Executor堆外内存

如果数据量特别大,时不时报错,shuffle file cannot find,executor,task lost,out of memory.可能是Executor堆外内存不太够用。
调节方式:

--conf spark.yarn.executor.memoryOverhead=2048
Spark学习笔记(6)性能调优_第1张图片
image.png

一定要在spark-submit脚本中去设置。到至少1G(1024M),甚至说2G、4G

6.调节连接等待时长

如果一个Executor远程从另一个Executor中拉去数据时,那个Executor正好在gc,那么连接超时是60s,碰到某某file,一串fileid。uuid(sdsad-213asv-sad-asdaf).not found。file lost很有可能是那份数据的Executor在gc。建立不了连接。
调节方式:

--conf spark.core.connection.ack.wait.timeout=300

在spark-submit脚本中设置。

7.基础优化

1.stage 减少shuffle
2.cache lazy执行
3.coalesce(),repartition()

你可能感兴趣的:(Spark学习笔记(6)性能调优)