【Spark】性能优化:RDD优化

1、对于RDD中某些函数使用注意

(1)能不使用groupByKey函数就不使用,除非不得已
redcueByKey(combiner) = groupBy+ map(变量值相加)
redcueByKey可以先进行本地聚合操作
(2)尽量使用XXPartition函数代替XX函数
xx:map/foreach/zip
def foreach(f: T => Unit): Unit
f:针对RDD中每个元素进行的操作处理的
def foreachPartition(f: Iterator[T] => Unit): Unit
f:针对RDD中每个分区的元素进行操作处理的
比如RDD中2个分区,100条数据,现将数据报道MYSQL表中
foreach
item ->mysql
connection ->创建100次
foreachPartition
对每个分区中数据
只要获取2个连接即可
(3)适当的降低或者增加RDD分区数目
RDD的分区对应一个Task处理数据
def repartition(numPartitions: Int) -产生shuffle
def coalesce(numPartitions: Int, shuffle: Boolean = false)
一开始的时候,数据量比较多,可以加到RDD分分区数,增加并行度(在集群资源充足的情况下)
当数据预处理之后(尤其过滤清洗之后)。RDD中数据量减少了很多,此时可以考虑减少分区的数目

2、RDD的复用以及RDD持久化

对有可能多次使用的RDD,我们可以把他进行持久化
避免创建重复的RDD
尽可能复用同一个RDD
对多次使用的RDD进行持久化
def persist(newLevel: StorageLevel)
def unpersist(blocking: Boolean = true)

class StorageLevel private(
private var _useDisk: Boolean, //磁盘
private var _useMemory: Boolean, //内存
//JVM内存中tachyon(基于内存的分布式文件系统)
private var _useOffHeap: Boolean, /
private var _deserialized: Boolean, 反序列化
private var _replication: Int = 1) //副本个数
extends Externalizable
什么情况下,RDD数据需要进行持久化呢???
(1)某个RDD数据,被多次使用
重复RDD
(2)某个RDD数据来自不易,使用超过1次
经过复杂的处理得到RDD
(3)通常选择的策略
MEMORY_ONLY_2 -如果内存足够
MEMORY_AND_DISK_SER_2 -如果内存不够,先内存后磁盘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值