Spark map side join 關聯優化

2021-07-10 10:17:45 字數 2580 閱讀 4865



將多份資料進行關聯是資料處理過程中非常普遍的用法,不過在分布式計算系統中,這個問題往往會變的非常麻煩,因為框架提供的 join 操作一般會將所有資料根據 key 傳送到所有的 reduce 分割槽中去,也就是 shuffle 的過程。造成大量的網路以及磁碟io消耗,執行效率極其低下,這個過程一般被稱為 reduce-side-join。

如果其中有張表較小的話,我們則可以自己實現在 map 端實現資料關聯,跳過大量資料進行 shuffle 的過程,執行時間得到大量縮短,根據不同資料可能會有幾倍到數十倍的效能提公升。

下文將會以乙個 demo 對優化過程進行說明。

以前寫過一篇關於spark-sql中利用broadcast join進行優化的文章,原理與那篇文章相同,這裡重新畫了圖。

reduce-side-join 的缺陷在於會將key相同的資料傳送到同乙個partition中進行運算,大資料集的傳輸需要長時間的io,同時任務併發度收到限制,還可能造成資料傾斜。

reduce-side-join 執行圖如下

map-side-join 執行圖如下

資料1(個別人口資訊):

身份證 姓名 ...

110 lsw

222 yyy

資料2(全國學生資訊):

身份證 學校名稱 學號 ...         

110 s1 211

111 s2 222

112 s3 233

113 s2 244

期望得到的資料 :

身份證 姓名 學校名稱

110 lsw s1

將少量的資料轉化為map進行廣播,廣播會將此 map 傳送到每個節點中,如果不進行廣播,每個task執行時都會去獲取該map資料,造成了效能浪費。

val people_info = sc.parallelize(array(("110","lsw"),("222","yyy"))).collectasmap()

val people_bc = sc.broadcast(people_info)

val stumap = people_bc.value

val arraybuffer = arraybuffer[(string,string,string)]()

iter.foreach

}}arraybuffer.iterator})

也可以使用 for 的守衛機制來實現上述**

val stumap = people_bc.value

for yield (idcard, stumap.getorelse(idcard,""),school)

})

import org.apache.spark.

import scala.collection.mutable.arraybuffer

object

jointest

extends

val sc = new sparkcontext(conf)

/*** map-side-join

* 取出小表中出現的使用者與大表關聯後取出所需要的資訊

* */

//部分人資訊(身份證,姓名)

val people_info = sc.parallelize(array(("110","lsw"),("222","yyy"))).collectasmap()

//全國的學生詳細資訊(身份證,學校名稱,學號...)

val student_all = sc.parallelize(array(("110","s1","211"),

("111","s2","222"),

("112","s3","233"),

("113","s2","244")))

//將需要關聯的小表進行關聯

val people_bc = sc.broadcast(people_info)

/*** 同時匹配不到的資料也不需要返回()

* */

val stumap = people_bc.value

val arraybuffer = arraybuffer[(string,string,string)]()

iter.foreach

}}arraybuffer.iterator

})/**

* 使用另一種方式實現

* 使用for的守衛

* */

val stumap = people_bc.value

for yield (idcard, stumap.getorelse(idcard,""),school)

})res.foreach(println)

Spark map side join 關聯優化

將多份資料進行關聯是資料處理過程中非常普遍的用法,不過在分布式計算系統中,這個問題往往會變的非常麻煩,因為框架提供的 join 操作一般會將所有資料根據 key 傳送到所有的 reduce 分割槽中去,也就是 shuffle 的過程。造成大量的網路以及磁碟io消耗,執行效率極其低下,這個過程一般被稱...

Spark map side join 關聯優化

將多份資料進行關聯是資料處理過程中非常普遍的用法,不過在分布式計算系統中,這個問題往往會變的非常麻煩,因為框架提供的 join 操作一般會將所有資料根據 key 傳送到所有的 reduce 分割槽中去,也就是 shuffle 的過程。造成大量的網路以及磁碟io消耗,執行效率極其低下,這個過程一般被稱...

MySQL千萬級多表關聯SQL語句調優

本文不涉及複雜的底層資料結構,通過explain解釋sql,並根據可能出現的情況,來做具體的優化,使千萬級表關聯查詢第一頁結果能在2秒內完成 真實業務告警系統優化結果 需要優化的查詢 使用explain 出現了using temporary 有分頁時出現了using filesort則表示使用不了索...