1. Spark调优之性能调优2. Spark调优之参数调优3. 数据倾斜
1. Spark调优之性能调优- 避免创建重复的RDD尽可能复用同一个RDD对多次使用的RDD进行持久化
默认情况下,性能最高的是 MEMORY_ONLY,但前提是你的内存必须足够足够大, 可以绰绰有余地存放下整个RDD的所有数据。
第二种常用 MEMORY_ONLY_SER级别。该级别会将RDD数据序列化后再保存在内存中,此时每个partition仅仅是一个字节数组而已,大大减少了对象数量,并降低了内存占用。
- 尽量避免使用shuffle类算子使用map-side预聚合的shuffle *** 作使用高性能的算子
使用reduceByKey/aggregateByKey替代groupByKey使用mapPartitions替代普通map Transformation算子使用foreachPartitions替代foreach Action算子使用filter之后进行coalesce *** 作使用repartitionAndSortWithinPartitions替代repartition与sort类 *** 作代码repartition:coalesce(numPartitions,true) 增多分区使用这个coalesce(numPartitions,false) 减少分区 没有shuffle只是合并 partition
- 广播大变量
开发过程中,会遇到需要在算子函数中使用外部变量的场景(尤其是大变量,比如 100M以上的大集合),那么此时就应该使用Spark的广播(Broadcast)功能来提 升性能。如果使用的外部变量比较大,建议使用Spark的广播功能,对该变量进行广播。广播后的变量,会保证每个Executor的内存中,只驻留一份变量副本,而Executor中的 task执行时共享该Executor中的那份变量副本。这样的话,可以大大减少变量副本 的数量,从而减少网络传输的性能开销,并减少对Executor内存的占用开销,降低 GC的频率广播大变量发送方式:Executor一开始并没有广播变量,而是task运行需要用到广 播变量,会找executor的blockManager要,bloackManager找Driver里面的 blockManagerMaster要。
- 使用Kryo优化序列化性能优化数据结构使用高性能的库fastutil
- num-executors
参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。参数调优建议:每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好。
- executor-memory
参数说明:该参数用于设置每个Executor进程的内存。参数调优建议:每个Executor进程的内存设置4G~8G较为合适。但是这只是一个参考值,具体的设置还是得根据不同部门的资源队列来定。如果你是跟团队里其他人共享这个资源队列,那么申请的总内存量最好不要超过资源队列最大总内存的1/3~1/2,避免你自己的Spark作业占用了队列所有的资源,导致别的同学的作业无法运行。
- executor-cores
可以用total-executor-cores总的核数: executor-cores = total-executor-cores / num-executors参数说明:该参数用于设置每个Executor进程的CPU core数量。
参数调优建议:Executor的CPU core数量设置为2~4个较为合适。
同样建议,如果是跟他人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比较合适,也是避免影响其他同学的作业运行。
- driver-memory
参数说明:该参数用于设置Driver进程的内存。
参数调优建议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。
- spark.default.parallelism
参数说明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。
参数调优建议:Spark作业的默认task数量为500~1000个较为合适。
- spark.storage.memoryFraction
参数说明:该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。
参数调优建议:如果Spark作业中,有较多的RDD持久化 *** 作,该参数的值可以适当提高一些,保证持久化的数据能够容纳在内存中。
- spark.shuffle.memoryFraction
3. 数据倾斜参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合 *** 作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该 *** 作。
参数调优建议:如果Spark作业中的RDD持久化 *** 作较少,shuffle *** 作较多时,建议降低持久化 *** 作的内存占比,提高shuffle *** 作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。
导致数据倾斜的原因:
- Key分布不均产生了shuffle
数据倾斜七种解决方案:
使用Hive ETL预处理数据过滤少数导致倾斜的key提高shuffle *** 作的并行度双重聚合将reduce join转为map join采样倾斜key并分拆join *** 作使用随机前缀和扩容RDD进行join
参数调优模板:
spark-submit --class com.shujia.Test --master yarn-client --num-executors 50 --executor-memory 4G --executor-cores 2 --driver-memory 2G --conf spark.storage.memoryFraction=0.6 --conf spark.shuffle.memoryFraction=0.2 --conf spark.locality.wait=10s --conf spark.shuffle.file.buffer=64k --conf spark.yarn.executor.memoryOverhead=2048 --conf spark.core.connection.ack.wait.timeout=300 --conf spark.network.timeout=120s
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)