Spark 调优


**调优思路:**优先使用参数调优,如果参数调优不能满足我们的业务场景,这里就要涉及到代码调优

一、Spark资源参数调优

num-executors:该作业总共需要多少executor进程执行
– 建议:每个作业运行一般设置50~100个左右较合适
executor-memory:设置每个executor进程的内存, num-executors* num- executors代表作业申请的总内存量(尽量不要超过最大总内存的1/3~1/2)
– 建议:设置4G~8G较合适
executor-cores:每个executor进程的CPU Core数量,该参数决定每个executor进程并行执行task线程的能力, num-executors* executor-cores代表作业申请总CPU core数(不要超过总CPU Core的1/3~1/2 )
– 建议:设置2~4个较合适
driver-memory: – 建议:通常不用设置,一般1G就够了,若出现使用collect算子将RDD数据全部拉取到Driver上处理,就必须确保该值足够大,否则OOM内存溢出
spark.default.parallelism:每个stage的默认task数量
– 建议:设置500~1000较合适,默认一个HDFS的block对应一个task,Spark默认值偏少,这样导致不能充分利用资源
spark.storage.memoryFraction:设置RDD持久化数据在executor内存中能占的比例,默认0.6,即默认executor 60%的内存可以保存持久化RDD数据
– 建议:若有较多的持久化操作,可以设置高些,超出内存的会频繁gc导致运行缓慢
spark.shuffle.memoryFraction:聚合操作占executor内存的比例,默认0.2
– 建议:若持久化操作较少,但shuffle较多时,可以降低持久化内存占比,提高shuffle操作内存占比
注意:使用 mapjoin操作,就会将小表放到driver中,前提:如果数据量不是很大,可以操作
反之,①避免mapjoin操作 ② 增加driver内存
方式一:(脚本中进行设置):
Spark_submit 命令调优实例(脚本中进行设置)
在这里插入图片描述

--master yarn-cluster 执行模式是集群模式
--num-executors 100  100个executor进程执行
--executor-memory 6G 申请的总内存量(进程)内存6G
--executor-cores 4 每个executor进程的CPU Core数量为4
--driver-memory 1G  driver设置1G内存

方式二:代码调优
代码参数调优案例:

val conf = new SparkConf()
  .registerKryoClasses(Array(classOf[JiebaSegmenter]))
  .set("spark.rpc.message.maxSize","800")
val spark = SparkSession
  .builder()
  .appName("Jieba UDF")
  .enableHiveSupport()
  .config(conf) //将conf配置到spark中
  .getOrCreate()
  //注册自定义类交给KryoSerializer序列化处理类进行序列化  .registerKryoClasses(Array(classOf[xxxx]))
  xxxx--->是要进行序列化的类名

二、开发调优

原则一:避免创建重复的RDD
– 对同一份数据,只应该创建一个RDD,不能创建多个RDD来代表同一份数据
– 极大浪费内存
利用RDD1中的tuple中元素来保留RDD2 节省内存
在这里插入图片描述
原则二:尽可能复用同一个RDD
– 比如:一个RDD数据格式是key-value,另一个是单独value类型,这两个RDD的value部分完
全一样,这样可以复用达到减少算子执行次数
在这里插入图片描述
原则三:对多次使用的RDD进行持久化处理
– 每次对一个RDD执行一个算子操作时,都会重新从源头处理计算一遍,计算出那个RDD出来,
然后进一步操作,这种方式性能很差
– 对多次使用的RDD进行持久化,将RDD的数据保存在内存或磁盘中,避免重复劳动
– 借助cache()和persist()方法
在这里插入图片描述
– persist持久化级别
在这里插入图片描述
原则四:避免使用shuffle类算子(现实中不可以避免的)(对性能影响最大的就是shuffle类算子)
– 在spark作业运行过程中,最消耗性能的地方就是shuffle过程
– 将分布在集群中多个节点上的同一个key,拉取到同一个节点上,进行聚合和join处理,比如
groupByKey、reduceByKey、join等算子,都会触发shuffle
重点:shuffle涉及到写磁盘,数据合并,网络数据的传输,因此能避免使用shuffle,就不使用
在这里插入图片描述
原则五:使用map-side预聚合的shuffle操作
– 一定要使用shuffle的,无法用map类算子替代的,那么尽量使用map-site预聚合的算子
– 思想类似MapReduce中的Combiner – 可能的情况下使用reduceByKey或aggregateByKey算子替代groupByKey算子,因为
reduceByKey或aggregateByKey算子会使用用户自定义的函数对每个节点本地相同的key进行
预聚合,而groupByKey算子不会预聚合
在这里插入图片描述
原则六:使用Kryo优化序列化性能
– Kryo是一个序列化类库,来优化序列化和反序列化性能
– Spark默认使用Java序列化机制(ObjectOutputStream/ ObjectInputStream API)进行序列
化和反序列化
– Spark支持使用Kryo序列化库,性能比Java序列化库高很多,10倍左右
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值