对于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中数据量减少了很多,此时可以考虑减少分区的数目