您好,登錄后才能下訂單哦!
本篇內容主要講解“MapTask和ReduceTask流程是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MapTask和ReduceTask流程是怎樣的”吧!
map和reduce之間的過程,成為shuffling,官方圖是這樣介紹的.(這樣描述不是很準確)
每個map任務都有一個環形內存緩沖區用于存儲任務的輸出.默認100MB(MRJobConfig.IO_SORT_MB修改)
一旦緩沖達到閾值(MRJobConfig.MAP_SORT_SPILL_PERCENT)0.8,后臺線程將內容spill到硬盤,將緩緩沖區寫到MRJobConfig.JOB_LOCAL_DIR指定目錄.
查看MRJobConfig.JOB_LOCAL_DIR值為mapreduce.job.local.dir,查看org.apache.hadoop.mapreduce包下的mapred-default.xml(hadoop-mapreduce-client-core.2.7.1.jar中)文件搜索local.dir,得到配置
<property> <name>mapreduce.cluster.local.dir</name> <value>${hadoop.tmp.dir}/mapred/local</value> <description>The local directory where MapReduce stores intermediate data files. May be a comma-separated list of directories on different devices in order to spread disk i/o. Directories that do not exist are ignored. </description> </property>
ok,現在從hadoop-common-2.7.1.jar中的core-default.xml中搜索hadoop.tmp.dir
<property> <name>hadoop.tmp.dir</name> <value>/tmp/hadoop-${user.name}</value> <description>A base for other temporary directories.</description></property>
現在我們得到了spill的臨時路徑/tmp/hadoop-${user.name}/mapred/local.
在spill之前,首先進行partition,每個分區進行sort,如果有combiner,它就在排序后,執行combiner。
如果溢出文件超過三個(JobContext.MAP_COMBINE_MIN_SPILLS),將會再次執行combiner
MapTask.MapOutputBuffer中源碼
if (combinerRunner == null || numSpills < minSpillsForCombine) { Merger.writeFile(kvIter, writer, reporter, job); } else { combineCollector.setWriter(writer); combinerRunner.combine(kvIter, combineCollector); }
注: map spill到磁盤時,可以設置壓縮來節省磁盤和網絡IO
設置 MAP_OUTPUT_COMPRESS 為true ,MRJobConfig.MAP_OUTPUT_COMPRESS_CODEC值為codec
例如:
conf.set(MRJobConfig.MAP_OUTPUT_COMPRESS, "true");
conf.set(MRJobConfig.MAP_OUTPUT_COMPRESS_CODEC, "org.apache.hadoop.io.compress.DefaultCodec");
ReduceTask要從各個MapTask上讀取數據,ReduceTask大體流程分為5個階段。
Shuffle
ReduceTask從MapTask上遠程拷貝數據。超過閾值寫道磁盤。
Merge
ReduceTask啟動兩個線程,對內存和硬盤數據進行合并。
Sort
將MapTask的結果歸并排序。
Reduce
用戶自定義Reduce
Write
reduce結果寫到HDFS
到此,相信大家對“MapTask和ReduceTask流程是怎樣的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。