MapReduce运行原理和过程
一.Map的原理和運(yùn)行流程
?
Map的輸入數(shù)據(jù)源是多種多樣的,我們使用hdfs作為數(shù)據(jù)源。文件在hdfs上是以block(塊,Hdfs上的存儲(chǔ)單元)為單位進(jìn)行存儲(chǔ)的。
?
?
1.分片
?
我們將這一個(gè)個(gè)block劃分成數(shù)據(jù)分片,即Split(分片,邏輯劃分,不包含具體數(shù)據(jù),只包含這些數(shù)據(jù)的位置信息),那么上圖中的第一個(gè)Split則對(duì)應(yīng)兩個(gè)個(gè)文件塊,第二個(gè)Split對(duì)應(yīng)一個(gè)塊。需要注意的是一個(gè)Split只會(huì)包含一個(gè)File的block,不會(huì)跨文件。
?2.?數(shù)據(jù)讀取和處理
當(dāng)我們把數(shù)據(jù)塊分好的時(shí)候,MapReduce(以下簡(jiǎn)稱mr)程序?qū)⑦@些分片以key-value的形式讀取出來(lái),并且將這些數(shù)據(jù)交給用戶自定義的Map函數(shù)處理。
?
3.
?
用戶處理完這些數(shù)據(jù)后同樣以key-value的形式將這些數(shù)據(jù)寫(xiě)出來(lái)交給mr計(jì)算框架。mr框架會(huì)對(duì)這些數(shù)據(jù)進(jìn)行劃分,此處用進(jìn)行表示。不同顏色的partition矩形塊表示為不同的partition,同一種顏色的partition最后會(huì)分配到同一個(gè)reduce節(jié)點(diǎn)上進(jìn)行處理。
Map是如何將這些數(shù)據(jù)進(jìn)行劃分的?
默認(rèn)使用Hash算法對(duì)key值進(jìn)行Hash,這樣既能保證同一個(gè)key值的數(shù)據(jù)劃分到同一個(gè)partition中,又能保證不同partition的數(shù)據(jù)梁是大致相當(dāng)?shù)摹?/p>
?
總結(jié):
1.一個(gè)map指揮處理一個(gè)Split????
2.map處理完的數(shù)據(jù)會(huì)分成不同的partition
3.一類partition對(duì)應(yīng)一個(gè)reduce
那么一個(gè)mr程序中 map的數(shù)量是由split的數(shù)量決定的,reduce的數(shù)量是由partiton的數(shù)量決定的。
?
二.Shuffle
Shuffle,翻譯成中文是混洗。mr沒(méi)有排序是沒(méi)有靈魂的,shuffle是mr中非常重要的一個(gè)過(guò)程。他在Map執(zhí)行完,Reduce執(zhí)行前發(fā)生。
?
?
Map階段的shuffle
數(shù)據(jù)經(jīng)過(guò)用戶自定的map函數(shù)處理完成之后,數(shù)據(jù)會(huì)放入內(nèi)存中的環(huán)形緩沖區(qū)之內(nèi),,他分為兩個(gè)部分,數(shù)據(jù)區(qū)和索引區(qū)。數(shù)據(jù)區(qū)是存放用戶真實(shí)的數(shù)據(jù),索引區(qū)存放數(shù)據(jù)對(duì)應(yīng)的key值,partition和位置信息。當(dāng)環(huán)形緩沖區(qū)數(shù)據(jù)達(dá)到一定的比例后,會(huì)將數(shù)據(jù)溢寫(xiě)到一個(gè)文件之中,即途中的spill(溢寫(xiě))過(guò)程。
在溢寫(xiě)前,會(huì)將數(shù)據(jù)根據(jù)key和partition進(jìn)行排序,排好序之后會(huì)將數(shù)據(jù)區(qū)的數(shù)據(jù)按照順序一個(gè)個(gè)寫(xiě)入文件之中。這樣就能保證文件中數(shù)據(jù)是按照key和parttition進(jìn)行排序的。最后會(huì)將溢寫(xiě)出的一個(gè)個(gè)小文件合并成一個(gè)大的文件,并且保證在每一個(gè)partition
中是按照Key值有序的。
總結(jié):
Reduce階段的shuffle
reduce節(jié)點(diǎn)會(huì)將數(shù)據(jù)拷貝到自己的buffer緩存區(qū)中,當(dāng)緩存區(qū)中的數(shù)據(jù)達(dá)到一定的比例的時(shí)候,同樣會(huì)發(fā)生溢寫(xiě)過(guò)程,我們?nèi)稳灰WC每一個(gè)溢寫(xiě)的文件是有序的。與此同時(shí),后臺(tái)會(huì)啟一個(gè)線程,將這些小文件合并成一個(gè)大文件,經(jīng)過(guò)一輪又一輪的合并,最后將這些文件合并成一個(gè)大的數(shù)據(jù)集。在這個(gè)數(shù)據(jù)集中,數(shù)據(jù)是有序的,相同的key值對(duì)應(yīng)的value值是挨在一起的。最后,將這些數(shù)據(jù)交給reduce程序進(jìn)行聚合處理。
總結(jié):
?
?
三.Reduce運(yùn)行過(guò)程
?
?
在map處理完之后,reduce節(jié)點(diǎn)會(huì)將各個(gè)map節(jié)點(diǎn)上屬于自己的數(shù)據(jù)拷貝到內(nèi)存緩沖區(qū)中,最后將數(shù)據(jù)合并成一個(gè)大的數(shù)據(jù)集,并且按照key值進(jìn)行聚合,把聚合后的value值作為iterable(迭代器)交給用戶使用,這些數(shù)據(jù)經(jīng)過(guò)用戶自定義的reduce函數(shù)進(jìn)行處理之后,同樣會(huì)以key-value的形式輸出出來(lái),默認(rèn)輸出到hdfs上的文件。
四.Combine優(yōu)化
我們說(shuō)mr程序最終是要將數(shù)據(jù)按照key值進(jìn)行聚合,對(duì)value值進(jìn)行計(jì)算,那么我們是不是可以提前對(duì)聚合好的value值進(jìn)行計(jì)算?of course,我們將這個(gè)過(guò)程稱為Combine。哪些場(chǎng)景可以進(jìn)行conbine優(yōu)化。如下。
Map端:
1. 在數(shù)據(jù)排序后,溢寫(xiě)到磁盤(pán)前,運(yùn)行combiner。這個(gè)時(shí)候相同Key值的value值是挨在一起的,可以對(duì)這些value值進(jìn)行一次聚合計(jì)算,比如說(shuō)累加。
2. 溢寫(xiě)出的小文件合并之前,我們也可以執(zhí)行一次combiner,需要注意的是mr程序默認(rèn)至少存在三個(gè)文件才進(jìn)行combiner,否則mr會(huì)認(rèn)為這個(gè)操作是不值得的。當(dāng)然這個(gè)值可以通過(guò)min.num.spills.for.combine設(shè)置。
Reduce端:
?
寫(xiě)在最后
送上整個(gè)MR過(guò)程圖
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zmanzi/p/10836462.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的MapReduce运行原理和过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity初步 基本拼图实现
- 下一篇: python之路day14--列表生成式