一些工作中遇到的spark优化问题分享

一些函数:
1.append和overwrite:
append 在原有分区上进行追加数据操作,overwrite在原有分区上进行全量刷新操作
2.coalesce和repartition
coalesce和repartiton都用于改变分区
coalesce 不进行shuffle,多用于减少分区,在了解源码中,coalesce可传参数,选择是否进行shuffle。
repartiton 必shuffle,多用于增加分区,提高并行度,
源码中两者都是调用repartition方法
coalesce相当于repartition的一种特殊情况
分区一般设置为cpu的2-2.5倍左右
3.select
当业务需求只取DataFrame的某几列时可以使用select方法来获取其中几列DataFrame.select(“字段1”,“字段2”,“字段3”) 方法返回值为Dataframe
4.DataFrame join的两种方式
普通join和join(table,seq())
seq会去重
5.withColum
对DataFrame新增列
6.排序函数加开窗
RANK() 排序相同时会重复,总数不会变 1,2,2,4
DENSE_RANK() 排序相同时会重复,总数会减少 1,2,2,3
ROW_NUMBER() 会根据顺序计算 1,2,3,4
开窗:Window.partitionBy()
注意:使用函数时先导functions包
参数调优
1.cache级别
DISK_ONLY:只缓存到磁盘没有副本
DISK_ONLY_2:只缓存到磁盘有2份副本
MEMORY_ONLY:只缓存到内存没有副本
MEMORY_ONLY_2:只缓存到内存有2份副本
MEMORY_ONLY_SER:只缓存到内存并且序列化没有副本
MEMORY_ONLY_SER_2:只缓存到内存并且序列化有2份副本
MEMORY_AND_DISK:缓存到内存和磁盘没有副本,如果内存放不下溢写到磁盘
MEMORY_AND_DISK_2:缓存到内存和磁盘有2份副本,如果内存放不下溢写到磁盘
MEMORY_AND_DISK_SER:缓存到内存和磁盘并且序列化,如果内存放不下溢写到磁盘
MEMORY_ADN_DISK_SER_2:缓存到内存和磁盘并且序列化有2份副本,如果内存放不下溢写到磁盘
OFF_HEAP:缓存到堆外内存
DataFrame的cache默认采用MEMORY_AND_DISK 这和RDD 的默认方式不一样RDD cache 默认采用MEMORY_ONLY在这里插入图片描述
缓存:dataFrame.cache,释放缓存:dataFrame.unpersist
2.Spark Sql默认并行度
Spark sql默认shuffle并行度为200 可对spark.sql.shuffle.partitions参数进行修改
3.Kryo序列化
spark默认序列化是java序列化
根据官网描述 kryo序列化比java序列化更快更紧凑,但spark默认的序列化是java序列化并不是spark序列化,因为spark并不支持所有序列化类型,而且每次使用都必须进行注册。
那么在使用kryo序列化后再使用序列化缓存能够非常大的减小内存所使用的大小。
在这里插入图片描述
使用kryo序列化需先注册
在这里插入图片描述
persist(StorageLevel.MEMORY_ONLY_SER)

在集群资源绝对充足的情况下推荐直接使用cache
在集群内存资源十分紧张的情况推荐下使用kryo序列化
4. BroadCast join(广播join)
spark默认join方式:SortMerage join 排序合并join
表与表之间进行join涉及到分区与分区之间的数据传输,会进行shuffle。在大表join小表的时候我们可以用广播join来进行优化避免shuffle,从而提高效率。广播join的实现原理为,将小表查出先聚合到driver端,再由driver广播到每个executor上。
broadcast(spark.table(“name1”)).join(spark.table(“name2”), “key”).show()
广播join小表默认值 10MB,可以通过spark.sql.autoBroadcastJoinThread 参数去设置
在这里插入图片描述
注意:当大表join大表时,网络传输时间大于shuffle时间的情况下就没有必要去使用broadcast join
所以参数值依据实际生产表的大小决定,通过多次测试调优选取
5.控制Spark reduce缓冲 调优shuffle
spark.reducer.maxSizeInFilght
此参数为reduce task能够拉取多少数据量的一个参数默认48MB,当集群资源足够时,增大此参数可减少reduce拉取数据量的次数,从而达到优化shuffle的效果,一般调大为96MB,资源够大可继续往上调。
spark.shuffle.file.buffer 此参数为每个shuffle文件输出流的内存缓冲区大小,调大此参数可以减少在创建shuffle文件时进行磁盘搜索和系统调用的次数,默认参数为32k 一般调大为64k。
我工作中测试这两个参数,大概可以提高4-6%。

本文基本依照官网进行调优。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值