欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)之剖析Hadoop和Spark的Shuffle過程差異

2019-04-29 15:04:43 4110瀏覽

今天扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)老師給大家分享一篇關(guān)于Hadoop和Spark的Shuffle過程差異的詳細(xì)介紹,首先Hadoop和Spark的Shuffle過程,并對比兩者Shuffle的差異。Shuffle描述的是數(shù)據(jù)從Map端到Reduce端的過程,大致分為排序(sort)、溢寫(spill)、合并(merge)、拉取拷貝(Copy)、合并排序(mergesort)這幾個(gè)過程。



對于基于MapReduce編程范式的分布式計(jì)算來說,本質(zhì)上而言,就是在計(jì)算數(shù)據(jù)的交、并、差、聚合、排序等過程。而分布式計(jì)算分而治之的思想,讓每個(gè)節(jié)點(diǎn)只計(jì)算部分?jǐn)?shù)據(jù),也就是只處理一個(gè)分片,那么要想求得某個(gè)key對應(yīng)的全量數(shù)據(jù),那就必須把相同key的數(shù)據(jù)匯集到同一個(gè)Reduce任務(wù)節(jié)點(diǎn)來處理,那么Mapreduce范式定義了一個(gè)叫做Shuffle的過程來實(shí)現(xiàn)這個(gè)效果。

一、編寫本文的目的

本文旨在剖析Hadoop和Spark的Shuffle過程,并對比兩者Shuffle的差異。

二、Hadoop的Shuffle過程

Shuffle描述的是數(shù)據(jù)從Map端到Reduce端的過程,大致分為排序(sort)、溢寫(spill)、合并(merge)、拉取拷貝(Copy)、合并排序(mergesort)這幾個(gè)過程,大體流程如下:

![image](https://yqfile.alicdn.com/e4ccedfb6ccaaa0d3c0ad5b3b7ab83d96dd9fed2.png) 

上圖的Map的輸出的文件被分片為紅綠藍(lán)三個(gè)分片,這個(gè)分片的就是根據(jù)Key為條件來分片的,分片算法可以自己實(shí)現(xiàn),例如Hash、Range等,最終Reduce任務(wù)只拉取對應(yīng)顏色的數(shù)據(jù)來進(jìn)行處理,就實(shí)現(xiàn)把相同的Key拉取到相同的Reduce節(jié)點(diǎn)處理的功能。下面分開來說Shuffle的的各個(gè)過程。

三、Map端做了下圖所示的操作:

1、Map端sort

Map端的輸出數(shù)據(jù),先寫環(huán)形緩存區(qū)kvbuffer,當(dāng)環(huán)形緩沖區(qū)到達(dá)一個(gè)閥值(可以通過配置文件設(shè)置,默認(rèn)80),便要開始溢寫,但溢寫之前會(huì)有一個(gè)sort操作,這個(gè)sort操作先把Kvbuffer中的數(shù)據(jù)按照partition值和key兩個(gè)關(guān)鍵字來排序,移動(dòng)的只是索引數(shù)據(jù),排序結(jié)果是Kvmeta中數(shù)據(jù)按照partition為單位聚集在一起,同一partition內(nèi)的按照key有序。

2、spill(溢寫)

當(dāng)排序完成,便開始把數(shù)據(jù)刷到磁盤,刷磁盤的過程以分區(qū)為單位,一個(gè)分區(qū)寫完,寫下一個(gè)分區(qū),分區(qū)內(nèi)數(shù)據(jù)有序,最終實(shí)際上會(huì)多次溢寫,然后生成多個(gè)文件

3、merge(合并)

spill會(huì)生成多個(gè)小文件,對于Reduce端拉取數(shù)據(jù)是相當(dāng)?shù)托У?,那么這時(shí)候就有了merge的過程,合并的過程也是同分片的合并成一個(gè)片段(segment),最終所有的segment組裝成一個(gè)最終文件,那么合并過程就完成了,如下圖所示


至此,Map的操作就已經(jīng)完成,Reduce端操作即將登場

四、Reduce操作

總體過程如下圖的紅框處:

![image](https://yqfile.alicdn.com/71a52ed4799d3dbbde4552028f3aea05bc1c98c0.png) 

1、拉取拷貝(fetchcopy)

Reduce任務(wù)通過向各個(gè)Map任務(wù)拉取對應(yīng)分片。這個(gè)過程都是以Http協(xié)議完成,每個(gè)Map節(jié)點(diǎn)都會(huì)啟動(dòng)一個(gè)常駐的HTTPserver服務(wù),Reduce節(jié)點(diǎn)會(huì)請求這個(gè)HttpServer拉取數(shù)據(jù),這個(gè)過程完全通過網(wǎng)絡(luò)傳輸,所以是一個(gè)非常重量級(jí)的操作。

2、合并排序

Reduce端,拉取到各個(gè)Map節(jié)點(diǎn)對應(yīng)分片的數(shù)據(jù)之后,會(huì)進(jìn)行再次排序,排序完成,結(jié)果丟給Reduce函數(shù)進(jìn)行計(jì)算。

五、總結(jié)

至此整個(gè)shuffle過程完成,最后總結(jié)幾點(diǎn):

shuffle過程就是為了對key進(jìn)行全局聚合

排序操作伴隨著整個(gè)shuffle過程,所以Hadoop的shuffle是sort-based的

Sparkshuffle相對來說更簡單,因?yàn)椴灰笕钟行颍詻]有那么多排序合并的操作。Sparkshuffle分為write和read兩個(gè)過程。我們先來看shufflewrite。

1、shufflewrite

shufflewrite的處理邏輯會(huì)放到該ShuffleMapStage的最后(因?yàn)閟park以shuffle發(fā)生與否來劃分stage,也就是寬依賴),finalRDD的每一條記錄都會(huì)寫到對應(yīng)的分區(qū)緩存區(qū)bucket,如下圖所示:


說明:

上圖有2個(gè)CPU,可以同時(shí)運(yùn)行兩個(gè)ShuffleMapTask

每個(gè)task將寫一個(gè)buket緩沖區(qū),緩沖區(qū)的數(shù)量和reduce任務(wù)的數(shù)量相等

每個(gè)buket緩沖區(qū)會(huì)生成一個(gè)對應(yīng)ShuffleBlockFile

ShuffleMapTask如何決定數(shù)據(jù)被寫到哪個(gè)緩沖區(qū)呢?這個(gè)就是跟partition算法有關(guān)系,這個(gè)分區(qū)算法可以是hash的,也可以是range的

最終產(chǎn)生的ShuffleBlockFile會(huì)有多少呢?就是ShuffleMapTask數(shù)量乘以reduce的數(shù)量,這個(gè)是非常巨大的

那么有沒有辦法解決生成文件過多的問題呢?有,開啟FileConsolidation即可,開啟FileConsolidation之后的shuffle過程如下:


在同一核CPU執(zhí)行先后執(zhí)行的ShuffleMapTask可以共用一個(gè)bucket緩沖區(qū),然后寫到同一份ShuffleFile里去,上圖所示的ShuffleFile實(shí)際上是用多個(gè)ShuffleBlock構(gòu)成,那么,那么每個(gè)worker最終生成的文件數(shù)量,變成了cpu核數(shù)乘以reduce任務(wù)的數(shù)量,大大縮減了文件量。

2、Shuffleread

Shufflewrite過程將數(shù)據(jù)分片寫到對應(yīng)的分片文件,這時(shí)候萬事具備,只差去拉取對應(yīng)的數(shù)據(jù)過來計(jì)算了。

那么ShuffleRead發(fā)送的時(shí)機(jī)是什么?是要等所有ShuffleMapTask執(zhí)行完,再去fetch數(shù)據(jù)嗎?理論上,只要有一個(gè)ShuffleMapTask執(zhí)行完,就可以開始fetch數(shù)據(jù)了,實(shí)際上,spark必須等到父stage執(zhí)行完,才能執(zhí)行子stage,所以,必須等到所有ShuffleMapTask執(zhí)行完畢,才去fetch數(shù)據(jù)。fetch過來的數(shù)據(jù),先存入一個(gè)Buffer緩沖區(qū),所以這里一次性fetch的FileSegment不能太大,當(dāng)然如果fetch過來的數(shù)據(jù)大于每一個(gè)閥值,也是會(huì)spill到磁盤的。

fetch的過程過來一個(gè)buffer的數(shù)據(jù),就可以開始聚合了,這里就遇到一個(gè)問題,每次fetch部分?jǐn)?shù)據(jù),怎么能實(shí)現(xiàn)全局聚合呢?以wordcount的reduceByKey(《SparkRDD操作之ReduceByKey》)為例,假設(shè)單詞hello有十個(gè),但是一次fetch只拉取了2個(gè),那么怎么全局聚合呢?Spark的做法是用HashMap,聚合操作實(shí)際上是map.put(key,map.get(key)+1),將map中的聚合過的數(shù)據(jù)get出來相加,然后put回去,等到所有數(shù)據(jù)fetch完,也就完成了全局聚合。

六、總結(jié)

Hadoop的MapReduceShuffle和SparkShuffle差別總結(jié)如下:

Hadoop的有一個(gè)Map完成,Reduce便可以去fetch數(shù)據(jù)了,不必等到所有Map任務(wù)完成,而Spark的必須等到父stage完成,也就是父stage的map操作全部完成才能去fetch數(shù)據(jù)。

Hadoop的Shuffle是sort-base的,那么不管是Map的輸出,還是Reduce的輸出,都是partion內(nèi)有序的,而spark不要求這一點(diǎn)。

Hadoop的Reduce要等到fetch完全部數(shù)據(jù),才將數(shù)據(jù)傳入reduce函數(shù)進(jìn)行聚合,而spark是一邊f(xié)etch一邊聚合。

以上就是關(guān)于扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)之剖析Hadoop和Spark的Shuffle過程差異的全部內(nèi)容,想要學(xué)好大數(shù)據(jù)開發(fā)小編給大家推薦口碑良好的扣丁學(xué)堂,扣丁學(xué)堂有專業(yè)老師制定的大數(shù)據(jù)學(xué)習(xí)路線圖輔助學(xué)員學(xué)習(xí),此外還有與時(shí)俱進(jìn)的大數(shù)據(jù)課程體系和大數(shù)據(jù)視頻教程供大家學(xué)習(xí),想要學(xué)好大數(shù)據(jù)開發(fā)技術(shù)的小伙伴快快行動(dòng)吧??鄱W(xué)堂大數(shù)據(jù)學(xué)習(xí)群:209080834。


扣丁學(xué)堂微信公眾號(hào)                                 HTML5前端開發(fā)VIP免費(fèi)公開課


     【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】           【掃碼進(jìn)入HTML5前端開發(fā)VIP免費(fèi)公開課



查看更多關(guān)于“大數(shù)據(jù)培訓(xùn)資訊”的相關(guān)文章>

標(biāo)簽: 大數(shù)據(jù)培訓(xùn) 大數(shù)據(jù)視頻教程 大數(shù)據(jù)分析培訓(xùn) 大數(shù)據(jù)學(xué)習(xí)視頻 Hadoop生態(tài)圈

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部