龙空技术网

「每日一道大数据面试题系列」spark如何调优

飞哥大数据 208

前言:

现在姐妹们对“spark shuffle并行度”可能比较注重,朋友们都需要学习一些“spark shuffle并行度”的相关资讯。那么小编也在网上网罗了一些关于“spark shuffle并行度””的相关知识,希望看官们能喜欢,姐妹们一起来学习一下吧!

如果面试时被问到spark任务如何调优,我们该如何回答呢?

下面我们从四大方面回答这个问题,保证吊打面试官。

一、spark性能调优

1、分配更多的资源

比如增加执行器个数(num_executor)、增加执行器个数(executor_cores)、增加执行器内存(executor_memory)

2、调节并行度

spark.default.parallelism

3、重构RDD架构以及RDD持久化

尽量去复用RDD,差不多的RDD可以抽取成一个共同的RDD,公共RDD一定要实现持久化

4、广播变量

SparkContext.broadcast方法创建一个对象,通过value方法访问

5、使用kryo序列化

SparkConf中设置属性:spark.serializer: org.apache.spark.serializer.kryoSerializer

6、使用fastutil优化数据格式(代替java中的Array、List、Set、Map)

7、调节数据本地化等待时长

调节参数: spark.locality.wait

二、JVM调优

降低cache操作的内存占比 1.6版本之前使用的是静态内存管理

spark中堆内存被划分为两块:

一块是专门来给RDD作cache\persist持久化的 StorageMemory,另一块是给spark算子函数运行使用的,存放函数中自己创建的对象。

1.6版本之后采用统一内存管理机制

storage和execution各占50%,若己方不足对方空余可占用对方空间

可尝试调节executor堆外内存

spark.yarn.executor.memoryOverhead = 2048m

调节连接等待时长

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

三、shuffle数据倾斜调优

1、预聚合源数据,对hive源表提前进行聚合操作,在hive聚合之后,spark任务再去读取

2、检查倾斜的key是否是脏数据,可以提前过滤

3、提高shuffle操作reduce的并行度

4、使用随机key实现双重聚合

5、将reduce端 join转换成map端 join

6、sample采样倾斜key,单独进行join后在union

7、使用随机数以及扩容表进行join

四、算子调优

1、使用mapPartition提升map类操作的性能

2、filter过后使用coalesce减少分区数量

3、使用foreachPartition优化写数据性能

4、使用repartition解决sparkSql低并行度的性能问题

5、reduceByKey替换groupByKey实现map读预聚合

关注【飞哥大数据】,私信回复666 获取2022年100+公司面试真题,以及spark与flink面试题汇总

标签: #spark shuffle并行度