基础调优
1、提交参数
可以设置executor数量,每个executor的内存/CPU核数,在资源允许的情况下越大越好
,没有什么是加一台服务器解决不了的
原则:根据业务数据量,集群物理配置,任务优先级进行配置,遇到计算瓶颈,加服务器,花钱一般都能搞定
2、并行度设置(分区数设置)
原则:尽量和cpu核数保持一致,为了充分压榨CPU的计算资源,可以设置为CPU核数的2-3倍
3、cache/persist+checkpoint
sc.setCheckpointDir('HDFS')
rdd.cache/persisit(memory_and_disk)
rdd.checkpoint
4、使用广播变量
val 广播变量名= sc.broadcast(会被各个Task用到的变量,即需要广播的变量)
广播变量名.value//获取广播变量
5、Kryo序列化(重要)
注意:在spark2.0之后,简单数据类型,数组,String组成的RDD,默认使用的就是Kryo序列化,如果自定义的对象要使用Kryo序列化,需要实现接口并配置参数
6、数据本地化读取等待时间
RDD算子优化
1、RDD复用
2、尽早filter
3、读取大量小 文件用wholeTextFiles
4、mapPartition和foreachPartition
5、repartition调节并行度,也可以通过conf参数配置
7、本地预聚合,能用reduceBykey,就不用了groupBykey
shuflle优化
1、当数据量更多的时候,把map和reduce端的缓冲区大小调大,reduce端重试和等待时间间隔调大
2、bypass机制开启阈值
数据倾斜优化
自定义分区器
JVM参数调优
1、调节cache内存百分比
val conf = new SparkConf().set("spark.storage.memoryFraction", "0.4")
2、设置对外内存直接使用操作系统的内存
–conf spark.yarn.executor.memoryOverhead=2048
3、设置连接等待时长
–conf spark.core.connection.ack.wait.timeout=300