hadoop中shuffle過(guò)程詳解

先上圖:

shuffle過(guò)程.png

shuffle的過(guò)程大致范圍是:map task開(kāi)始到reduce task開(kāi)始其中分成map端和reduce端

  1. map端shuffle執(zhí)行順序
    maptask 執(zhí)行過(guò)程中會(huì)不斷的產(chǎn)生數(shù)據(jù)。在這些數(shù)據(jù)開(kāi)始產(chǎn)生到最終完成經(jīng)歷的過(guò)程如下:
    1. 分區(qū) partition??梢酝ㄟ^(guò)Partitioner的子類來(lái)自定義分區(qū)行為。默認(rèn)是通過(guò)key的hashcode模除以reduce的任務(wù)數(shù)。分區(qū)的目的是平均reduce的處理任務(wù)
    2. 緩存 buffer。map在內(nèi)存中有一個(gè)環(huán)形緩沖區(qū),默認(rèn)是100M,它有個(gè)溢出比例spill percent可以設(shè)置,默認(rèn)是0.8,也就是說(shuō)80%的容量用來(lái)緩存,當(dāng)這部分容量滿了的時(shí)候會(huì)啟動(dòng)一個(gè)溢出線程進(jìn)行溢出操作,在溢出的過(guò)程中,仍然可以利用剩余的20%對(duì)新生產(chǎn)的數(shù)據(jù)進(jìn)行緩存。
    3. 溢出 spill、排序 sort、combiner。當(dāng)緩存已滿時(shí),溢出線程開(kāi)始啟動(dòng)前,需要對(duì)這80%的數(shù)據(jù)做快速排序。同時(shí)由于可能產(chǎn)生許多相同key的數(shù)據(jù),例如:“aaa 1"、"aaa 1"、"aaa 1",如果job中指定了combiner,則可以先進(jìn)行相同key的合并,得到 ”aaa 3"這樣的結(jié)果,這樣可以對(duì)結(jié)果進(jìn)行優(yōu)化。需要注意的是使用combiner時(shí)必須是reduce的輸入和輸出類型一致,且不會(huì)影響最終結(jié)果。combiner其實(shí)可以看做是一個(gè)map端的reducer。一個(gè)溢出線程完成時(shí)會(huì)產(chǎn)生一個(gè)已經(jīng)排序、combiner優(yōu)化(combiner過(guò)程可選)并且包含分區(qū)信息的臨時(shí)文件。
    4. 合并 merge。當(dāng)map任務(wù)執(zhí)行完后,如果數(shù)據(jù)量不是太小,會(huì)生成多個(gè)臨時(shí)的溢出文件,假設(shè)臨時(shí)文件如下:splill1("aaa 1" "bbb 3")、spill2("aaa 3" "bbb 5")、spill3("aaa 5 "bbb 2")。因?yàn)槊總€(gè)map task生成的最終文件只有一個(gè),因此會(huì)對(duì)這些臨時(shí)文件進(jìn)行merge,這個(gè)過(guò)程中會(huì)使用歸并排序,并且如果指定了combiner,也會(huì)進(jìn)行combiner的操作。merge后的結(jié)果{"aaa",[1,3,5]}、{“bbb",[3,5,2]},如果指定了combiner對(duì)結(jié)果相加的話,那么結(jié)果是{”aaa",9}{"bbb",10}。merge完成會(huì)得到最終的文件
  2. reduce端
    當(dāng)有map task完成后,yarn會(huì)告知reducer拉取(fetch)任務(wù),在所有的map任務(wù)完成之前,reducer都是在重復(fù)的拉取數(shù)據(jù)、merge。過(guò)程如下:
    1. copy過(guò)程。啟動(dòng)copy線程(Fetcher)拉取數(shù)據(jù)
    2. merge階段。和map端的merge類似,只是數(shù)據(jù)的來(lái)源是從不同map端copy過(guò)來(lái)的。copy過(guò)來(lái)的數(shù)據(jù)也會(huì)首先進(jìn)入內(nèi)存緩存,只是這里的內(nèi)存大小要比map端的更靈活,它基于JVM的heap size設(shè)置。當(dāng)copy數(shù)據(jù)過(guò)來(lái)時(shí),就會(huì)進(jìn)入內(nèi)存緩存,內(nèi)存緩存滿了就溢出成臨時(shí)文件,溢出過(guò)程同map端,當(dāng)所有map任務(wù)結(jié)束后,所有的溢出文件merge成最終文件。

至此。shuffle過(guò)程結(jié)束。

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

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

  • MapReduce處理流程圖 圖解wordcount的MapReduce 詳解Shffle Shuffle我們可以...
    忘凈空閱讀 2,921評(píng)論 0 3
  • Shuffle的正常意思是洗牌或弄亂,Hadoop官網(wǎng)提供了下圖來(lái)描述該過(guò)程: 但是實(shí)際過(guò)程比上圖描述的復(fù)雜得多。...
    yannhuang閱讀 767評(píng)論 0 1
  • 思考問(wèn)題 MapReduce總結(jié) MapReduce MapReduce的定義MapReduce是一種編程模型, ...
    Sakura_P閱讀 1,007評(píng)論 0 1
  • MapReduce框架結(jié)構(gòu)## MapReduce是一個(gè)用于大規(guī)模數(shù)據(jù)處理的分布式計(jì)算模型MapReduce模型主...
    Bloo_m閱讀 3,941評(píng)論 0 4
  • 1. mapreduce 的運(yùn)行機(jī)制(Hadoop 2) 首先看下 mapreduce 在 yarn 中的執(zhí)行流程...
    Java旅行者閱讀 716評(píng)論 0 3

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