1. 程式人生 > >Spark 效能調優 Rdd 之 reduceByKey 本地聚合(也就是map端聚合運算元)

Spark 效能調優 Rdd 之 reduceByKey 本地聚合(也就是map端聚合運算元)

簡單程式碼

val lines = sc.textFile("hdfs://")
val words = lines.flatMap(_.split(" "))
val pairs = words.map((_, 1))
val counts = pairs.reduceByKey(_ + _)
counts.collect()

示意圖

在這裡插入圖片描述

ReduceByKey

reduceByKey,相較於普通的shuffle操作(比如groupByKey),它的一個特點,就是說,會進行map端的本地聚合。
對map端給下個stage每個task建立的輸出檔案中,寫資料之前,就會進行本地的combiner操作,也就是說對每一個key,對應的values,都會執行你的運算元函式() + _)

優點

1、在本地進行聚合以後,在map端的資料量就變少了,減少磁碟IO。而且可以減少磁碟空間的佔用。

2、下一個stage,拉取資料的量,也就變少了。減少網路的資料傳輸的效能消耗。

3、在reduce端進行資料快取的記憶體佔用變少了。

4、reduce端,要進行聚合的資料量也變少了。

使用場景

1、非常普通的,比如說,就是要實現類似於wordcount程式一樣的,對每個key對應的值,進行某種資料公式或者演算法的計算(累加、類乘)

2、對於一些類似於要對每個key進行一些字串拼接的這種較為複雜的操作,可以自己衡量一下,其實有時,也是可以使用reduceByKey來實現的。但是不太好實現。如果真能夠實現出來,對效能絕對是有幫助的。(shuffle基本上就佔了整個spark作業的90%以上的效能消耗,主要能對shuffle進行一定的調優,都是有價值的)