spark学习-Spark性能调优手段

Spark性能调优手段:

判断内存消耗:设置RDD并行度,将RDD cache到内存,通过BlockManagerMasterActor添加RDD到memory中的日志查看每个partition占了多少内存,最后乘以partition数量,即是RDD内存占用量。

1.Shuffle调优(核心)

a.consolidation机制,使shuffleMapTask端写磁盘的文件数量减少,resultTask拉取数据磁盘IO也变少,只需拉取cpu core数量的磁盘文件。

b.spark.shuffle.file.buffer:shuffleMapTask的写磁盘bucket缓存,默认32K,加大后溢出到磁盘的次数变少。

c.spark.reducer.maxSizeInFlight:reduce task的拉取缓存默认48M,可以加大缓存,拉取次数减少。

d.reduce task拉取数据时,map task的jvm正在full gc(时间过长导致数据丢失),工作线程暂停,数据拉取不到,设置重试次数和间隔。

e.reduce task的executor有一部分内存用来汇聚拉取的数据,放入map。调整比例,防止频繁溢写到磁盘。


2.对多次使用的RDD进行持久化/checkpoint

a.通过cache和persist将RDD数据持久化存储到BlockManager,如果数据丢失,第二次计算该RDD时,会先尝试读取checkPoint数据,读取不出来就只能重新计算RDD。(cache只有一个默认的缓存级别MEMORY_ONLY,而persist可以根据情况设置其他的缓存级别)

b.要求高性能就在第一次计算RDD后,对RDD进行checkpoint操作。


3.使用序列化的持久化级别

a.将RDD序列化之后,RDD的每个partition的数据就序列化为一个巨大的字节数组,再持久化,可以大大减小对内存的消耗,同时数据量小了之后,如果要写入磁盘,那么磁盘IO性能消耗也比较小。缺点是反序列化时会增大cpu性能开销。


4.提高并行度

a.推荐设置集群总CPU数量的两倍~三倍的并行度,这样每个cpu core可能分配到并发运行2~3个task线程。那么集群资源就不会空闲,连续运转发挥最大功效。(spark.default.parallelism设置统一的并行度)


5.数据本地化

a.PROCESS_LOCAL,进程本地化,rdd的partition和task进入一个Executor中,速度快。

b.NODE_LOCAL,rdd的partition和task,不在一个executor,不在一个进程,在一个worker。

c.NO_PREF,无所谓本地化级别,数据在哪性能都一样。

d.RACK_LOCAL,机架本地化。

e.ANY,任意的本地化级别。

spark.locality.wait、spark.locality.wait.nade、spark.locality.waitprocess等参数设置数据本地化等待时间


6.使用高性能序列化类库

a.默认使用java序列化机制,速度比较慢,占用内存空间大

b.kryo序列化速度快,占用内存空间小,但是并不一定对所有类型进行序列化。需要对序列化的自定义类型进行注册(避免保存对象全类名),根据对象大小优化缓存大小。


7.优化数据结构

a.优先使用数组以及字符串,少用集合类。String拼接成特殊格式的字符串。如id:name,address|id:name,address。

b.避免使用多层嵌套的对象结构。可以采用json字符串。

c.尽量使用int替代String。id不要用uuid,用自增的int类型id。


8.广播共享数据

a.默认情况算子函数使用到的外部数据,会被拷贝到每一个task中。

b.通过使用外部大数据进行Broadcast广播,让其在每一个节点上就一份副本,而不是每个task一份副本,减少内存占用空间和网络传输消耗。


9.reduceBykey和groupBykey的合理使用

a.reduceBykey适合key对应的values聚合为一个值的场景,会先在shuffleMapTask写入本地磁盘文件进行本地聚合,导致传输到resultTask时网络传输数据量减小。

b.groupByKey不会进行本地聚合,把ShuffleMapTask的输出拉取到ResultTask内存中,网络传输开销大。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值