Spark的shuffle和mr的區別?

2021-09-27 02:44:32 字數 2564 閱讀 9653

問題分析:對hadoop和spark的shullfe過程理解不透徹

問題解答:

mr的shuffle

mapshuffle

資料存到hdfs中是以塊進行儲存的,每乙個塊對應乙個分片,maptask就是從分片中獲取資料的

在某個節點上啟動了maptask,maptask讀取是通過k-v來讀取的,讀取的資料會放到環形快取區,這樣做的目的是為了防止io的訪問次數,然後環形快取區的記憶體達到一定的閥值的

時候會把檔案益寫到磁碟,溢位的各種小檔案會合併成乙個大檔案,這個合併的過程中會進行排序,這個排序叫做歸併排序

map階段會涉及到

1.sort排序(預設按字典排序)

2.合併(combiner合併)

3.檔案合併(merage合併總共有三種,預設是記憶體到磁碟)

4.壓縮(設定壓縮就會執行)

reduceshuffle

歸併排序完成後reduce端會拉取map端的資料,拉取的這個過程叫做copy過程,拉取的資料合併成乙個檔案,groupcomparator(預設,這個我們也可以自定義)是專門對資料夾裡面的key進行分組

然後就形成k-list(v1,v2,v3)的形式,然後reduce經過業務處理,最終輸出到hdfs,如果設定壓縮就會執行,不設定則不執行

reduce階段會涉及到:

1.sort排序

2.分組(將相同的key的value放到乙個容器的過程)

3.merage檔案合併

4.壓縮

sparkshuffle的版本一

1.rdd中乙個partition對應乙個shufflemaptask任務,因為某個節點上可以有多個分割槽,所以可以有多個shufflemaptask

2.每乙個shufflemaptask都會為每乙個resulttask建立乙個bucket快取(記憶體),bucket的數量=mxr,當記憶體達到一定值的時候會益寫到shuffleblockfile檔案中

3.shufflemaptask會封裝成乙個叫mapstatus,這個mapstatus,裡面包含了每乙個resulttask拉取資料的大小

如果partitions的數量大於2000,則用highlycompressedmapstatus,否則用compressedmapstatus。

4.每乙個resulttask拉取過來的資料,就會在內部形成乙個rdd,這個rdd叫做shufflerdd,這個rdd的資料優先存放到記憶體中,記憶體中不夠然後存到磁碟裡

sparkshuffle的版本二

版本一的缺點:版本一的shuffle方式中會產生大量的小檔案,

版本二的優點:就是為了減少這麼多小檔案的生成

bucket的數量=cpu*resulttask的個數

版本二設計的原理:乙個shufflemaptask還是會寫入resulttask對應個數的本地檔案,但是當下乙個shufflemaptask執行的時候會直接把資料寫到之前已經建立好的本地檔案,這個檔案可以復用,這種復用機制叫做consolidation機制

我們把這一組的shuffle檔案稱為shufflegroup,每個檔案中都儲存了很多shufflemaptask對應的資料,這個檔案叫做segment,這個時候因為不同的shufflemaptask都是存在乙個檔案中

所以建立索引檔案,來標記shufflemaptask在shuffleblockfile的位置+偏移量,這樣就可以在乙個檔案裡面把不同的shufflemaptask資料分出來

sparkshuffle的版本三

版本三的優點:是通過排序建立索引,相比較於版本二,它只有乙個臨時檔案,不管有多少個resulttask都只有乙個臨時檔案,

缺點:這個排序操作是乙個消耗cpu的操作,代價是會消耗很多的cpu

版本二占用記憶體多,開啟檔案多,但不需排序,速度快。版本三占用記憶體少,開啟檔案少,速度相對慢。實踐證明使用第二種方案的應用場景更多些。

shuffle的讀流程

1.有乙個類blockmanager,封裝了臨時檔案的位置資訊,resulttask先通過blockmanager,就知道我從哪個節點拿資料

如果是遠端,它就是發起一次socket請求,建立乙個socket鏈結。然後發起一次遠端呼叫,告訴遠端的讀取程式,讀取哪些資料。讀到的內容再通過socket傳過來。

2.一條條讀資料和一塊塊讀資料的優缺點?

如果是一條條讀取的話,實時性好,效能低下

一塊塊讀取的話效能高,但是實時性不好

shuffle讀由reduce這邊發起,它需要先到臨時檔案中讀,一般這個臨時檔案和reduce不在一台節點上,它需要跨網路去讀。但也不排除在一台伺服器。不論如何它需要知道臨時檔案的位置,

這個是誰來告訴它的呢?它有乙個blockmanager的類。這裡就知道將來是從本地檔案中讀取,還是需要從遠端伺服器上讀取。

讀進來後再做join或者combine的運算。

這些臨時檔案的位置就在就記錄在map結構中。

可以這樣理解分割槽partition是rdd儲存資料的地方,實際是個邏輯單位,真正要取資料時,它就呼叫blockmanage去讀,它是以資料塊的方式來讀。

比如一次讀取32k還是64k。它不是一條一條讀,一條一條讀肯定效能低。它讀時首先是看本地還是遠端,如果是本地就直接讀這個檔案了,

hadoop和spark的shuffle異同點

spark 裡是shufflemaptask 的輸出進行 partition 不同的 partition 送到不同的 reducer spark 裡reducer 可能是下乙個 stage 裡的shufflemaptask 也可能是 resulttask reducer 以記憶體作緩衝區,邊 shu...

Spark之Shuffle機制和原理

shuffle就是對資料進行重組,由於分布式計算的特性和要求,在實現細節上更加繁瑣和複雜 在mapreduce框架,shuffle是連線map和reduce之間的橋梁,map階段通過shuffle讀取資料並輸出到對應的reduce 而reduce階段負責從map端拉取資料並進行計算。在整個shuff...

Spark的Shuffle過程介紹

spark的shuffle過程介紹 shuffle writer spark豐富了任務型別,有些任務之間資料流轉不需要通過shuffle,但是有些任務之間還是需要通過shuffle來傳遞資料,比如wide dependency的group by key。spark中需要shuffle輸出的map任務...