MapReduce中的Shuffle
在MapReduce框架中,shuffle是連接Map和Reduce之間的橋梁跷跪,Map的輸出要用到Reduce中必須經(jīng)過(guò)shuffle這個(gè)環(huán)節(jié),shuffle的性能高低直接影響了整個(gè)程序的性能和吞吐量晚凿。
Shuffle是MapReduce框架中的一個(gè)特定的phase牧抵,介于Map phase和Reduce phase之間,當(dāng)Map的輸出結(jié)果要被Reduce使用時(shí)猬错,輸出結(jié)果需要按key哈希,并且分發(fā)到每一個(gè)Reducer上去茸歧,這個(gè)過(guò)程就是shuffle倦炒。由于shuffle涉及到了磁盤的讀寫和網(wǎng)絡(luò)的傳輸,因此shuffle性能的高低直接影響到了整個(gè)程序的運(yùn)行效率软瞎。
下圖描述了MapReduce算法的整個(gè)流程逢唤,其中shuffle phase是介于Map phase和Reduce phase之間:
在Hadoop, 在mapper端每次當(dāng)memory buffer中的數(shù)據(jù)快滿的時(shí)候, 先將memory中的數(shù)據(jù), 按partition進(jìn)行劃分, 然后各自存成小文件, 這樣當(dāng)buffer不斷的spill的時(shí)候, 就會(huì)產(chǎn)生大量的小文件。
所以Hadoop后面直到reduce之前做的所有的事情其實(shí)就是不斷的merge, 基于文件的多路并歸排序,在map端的將相同partition的merge到一起, 在reduce端, 把從mapper端copy來(lái)的數(shù)據(jù)文件進(jìn)行merge, 以用于最終的reduce
多路歸并排序, 達(dá)到兩個(gè)目的涤浇。
merge, 把相同key的value都放到一個(gè)arraylist里面鳖藕;sort, 最終的結(jié)果是按key排序的。
這個(gè)方案擴(kuò)展性很好, 面對(duì)大數(shù)據(jù)也沒(méi)有問(wèn)題, 當(dāng)然問(wèn)題在效率, 畢竟需要多次進(jìn)行基于文件的多路歸并排序,多輪的和磁盤進(jìn)行數(shù)據(jù)讀寫只锭。
Spark的Shuffle機(jī)制
Spark中的Shuffle是把一組無(wú)規(guī)則的數(shù)據(jù)盡量轉(zhuǎn)換成一組具有一定規(guī)則的數(shù)據(jù)著恩。
Spark計(jì)算模型是在分布式的環(huán)境下計(jì)算的,這就不可能在單進(jìn)程空間中容納所有的計(jì)算數(shù)據(jù)來(lái)進(jìn)行計(jì)算,這樣數(shù)據(jù)就按照Key進(jìn)行分區(qū)喉誊,分配成一塊一塊的小分區(qū)邀摆,打散分布在集群的各個(gè)進(jìn)程的內(nèi)存空間中,并不是所有計(jì)算算子都滿足于按照一種方式分區(qū)進(jìn)行計(jì)算伍茄。
當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行排序存儲(chǔ)時(shí)栋盹,就有了重新按照一定的規(guī)則對(duì)數(shù)據(jù)重新分區(qū)的必要,Shuffle就是包裹在各種需要重分區(qū)的算子之下的一個(gè)對(duì)數(shù)據(jù)進(jìn)行重新組合的過(guò)程敷矫。在邏輯上還可以這樣理解:由于重新分區(qū)需要知道分區(qū)規(guī)則贞盯,而分區(qū)規(guī)則按照數(shù)據(jù)的Key通過(guò)映射函數(shù)(Hash或者Range等)進(jìn)行劃分,由數(shù)據(jù)確定出Key的過(guò)程就是Map過(guò)程沪饺,同時(shí)Map過(guò)程也可以做數(shù)據(jù)處理躏敢,例如,在Join算法中有一個(gè)很經(jīng)典的算法叫Map Side Join整葡,就是確定數(shù)據(jù)該放到哪個(gè)分區(qū)的邏輯定義階段件余。Shuffle將數(shù)據(jù)進(jìn)行收集分配到指定Reduce分區(qū),Reduce階段根據(jù)函數(shù)對(duì)相應(yīng)的分區(qū)做Reduce所需的函數(shù)處理遭居。
文/JasonDing(簡(jiǎn)書作者)
原文鏈接:http://www.reibang.com/p/60bab35bc01e
著作權(quán)歸作者所有啼器,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”俱萍。