Spark调优

Spark调优,第1张

Spark调优

文章目录

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
2. Spark调优之参数调优
    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

参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合 *** 作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该 *** 作。
参数调优建议:如果Spark作业中的RDD持久化 *** 作较少,shuffle *** 作较多时,建议降低持久化 *** 作的内存占比,提高shuffle *** 作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。

3. 数据倾斜

导致数据倾斜的原因:

    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 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5700264.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存