將多份資料進行關聯是資料處理過程中非常普遍的用法,不過在分布式計算系統中,這個問題往往會變的非常麻煩,因為框架提供的 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則表示使用不了索...