spark shuffle和Hadoop shuffle區(qū)別

本文來源于知乎上一大牛的回答作者:Lijie Xu

1. 是否需要對key提前進(jìn)行排序。

從邏輯角度來講,Shuffle 過程就是一個 GroupByKey 的過程,兩者沒有本質(zhì)區(qū)別。只是 MapReduce 為了方便 GroupBy 存在于不同 partition 中的 key/value records,就提前對 key 進(jìn)行排序。Spark 認(rèn)為很多應(yīng)用不需要對 key 排序,就默認(rèn)沒有在 GroupBy 的過程中對 key 排序。

2.DAG數(shù)據(jù)流的優(yōu)勢。

從數(shù)據(jù)流角度講,兩者有差別。MapReduce 只能從一個 Map Stage shuffle 數(shù)據(jù),Spark 可以從多個 Map Stages shuffle 數(shù)據(jù)(這是 DAG 型數(shù)據(jù)流的優(yōu)勢,可以表達(dá)復(fù)雜的數(shù)據(jù)流操作,參見 CoGroup(), join() 等操作的數(shù)據(jù)流圖 SparkInternals/4-shuffleDetails.md at master · JerryLead/SparkInternals · GitHub**

3. Shuffle write/read 實(shí)現(xiàn)上有一些區(qū)別。

以前對 shuffle write/read 的分類是 sort-based 和 hash-based。MapReduce 可以說是 sort-based,shuffle write 和 shuffle read 過程都是基于key sorting 的 (buffering records + in-memory sort + on-disk external sorting)。早期的 Spark 是 hash-based,shuffle write 和 shuffle read 都使用 HashMap-like 的數(shù)據(jù)結(jié)構(gòu)進(jìn)行 aggregate (without key sorting)。但目前的 Spark 是兩者的結(jié)合體,shuffle write 可以是 sort-based (only sort partition id, without key sorting),shuffle read 階段可以是 hash-based。因此,目前 sort-based 和 hash-based 已經(jīng)“你中有我,我中有你”,界限已經(jīng)不那么清晰。

4. 從數(shù)據(jù) fetch 與數(shù)據(jù)計算的重疊粒度來講,兩者有細(xì)微區(qū)別。

MapReduce 是粗粒度,reducer fetch 到的 records 先被放到 shuffle buffer 中休息,當(dāng) shuffle buffer 快滿時,才對它們進(jìn)行 combine()。而 Spark 是細(xì)粒度,可以即時將 fetch 到的 record 與 HashMap 中相同 key 的 record 進(jìn)行 aggregate。

5. 從性能優(yōu)化角度來講,Spark考慮的更全面。

MapReduce 的 shuffle 方式單一。Spark 針對不同類型的操作、不同類型的參數(shù),會使用不同的 shuffle write 方式。比如 Shuffle write 有三種實(shí)現(xiàn)方式:



其中 Serialized sorting 方式既可以使用堆內(nèi)內(nèi)存,也可以使用堆外內(nèi)存。更多的細(xì)節(jié)就不詳述了,感興趣可以看相關(guān)的實(shí)現(xiàn)類。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容