關于切片
劃分maptask任務她紫,由客戶端(提交job)完成济赎,寫入文件交給mr appmaster渺鹦。這里的任務切片是一個邏輯片恶耽,和hdfs的block是不同的概念。對于大文件决左,切片一般按照block的大小來切愕够,方便后續(xù)執(zhí)行maptask時數(shù)據(jù)的讀取。對于一些小文件佛猛,需要把多個block切成一片惑芭。一個切片對應一個maptask實例。切片由fileinputformat中的getSplit()來完成继找,結果寫入切片規(guī)劃文件遂跟。切片大小(由minsize婴渡,maxsize幻锁,blocksize幾個值決定)的邏輯:Math.max(minSize,Math.min(maxSize,blockSize))。參數(shù)在conf中設置缩搅。關于mapreduce中的序列化
map和reduce的輸出都需要經(jīng)過傳輸和實體化存儲越败,所以都需要讓它實現(xiàn)一個序列化框架,hadoop里面有一個內(nèi)置的序列化框架writable硼瓣。輸出的所有數(shù)據(jù)都需要實現(xiàn)writable接口究飞。如果輸出不是它內(nèi)置的數(shù)據(jù)類型(比如text置谦,longwritable,intwritrable)亿傅,而是我們一個自定義的對象媒峡,就必須去實現(xiàn)writable接口。mapreduce全過程
mapreduce中通過InputFormat組件來讀取數(shù)據(jù)葵擎。我們讀入的數(shù)據(jù)是什么谅阿,后續(xù)處理的數(shù)據(jù)時什么完全取決于這個接口。它把外部的數(shù)據(jù)源與內(nèi)部的處理邏輯完全解耦酬滤。InputFormat默認讀取文本文件的組件是:TextInputformat签餐。maptask讀取數(shù)據(jù)時我們調(diào)用其成員RecordReader的read()方法,取得kv對返回給Mapper中的map()方法盯串。
map()方法中是我們自定義的業(yè)務邏輯氯檐,執(zhí)行完邏輯后context.write(k,v)。把map過后的結果交給Outputcollector体捏。OutputCollector把數(shù)據(jù)寫入環(huán)形緩沖區(qū)(就是一個環(huán)形數(shù)組)冠摄。環(huán)形緩沖區(qū)中有一個保留區(qū)來進行分區(qū)排序。
分區(qū)排序?qū)崿F(xiàn):
默認分區(qū)是:HashPartitioner(hashcode模除以2(這個數(shù)字可以用來調(diào)整分區(qū)數(shù)))几缭。排序:quicksort和外部排序混合使用河泳。Key.compareTo。
緩沖區(qū)中的數(shù)據(jù)積累到一定閾值(如80%)通過spiller溢出(maptask完畢后還會有一次清空溢出)年栓。溢出一次寫一個文件拆挥,這些文件分區(qū)且有序。最后再merge這些文件(mergesort)形成一個maptask的最終文件韵洋。在這個文件中有幾個分區(qū)就會有幾個reducer竿刁,且這個分區(qū)與環(huán)形緩沖區(qū)中分區(qū)相對應黄锤。
maptask結束后搪缨,開始reducetask。reducer到執(zhí)行maptask的機器下載屬于自己分區(qū)的數(shù)據(jù)到其本地磁盤工作目錄鸵熟,有幾個maptask對應下載到幾個文件副编。然后將這幾個文件merge(mergesort)。reducer里自定義的reduce方法流强,對每一組key(相同key即為一組痹届,通過GroupingComparator(k,nextk)組件判斷key是否相同)。reduce(k,v)中一組中第一個傳入的key作為k打月,value是一個可以迭代這一組value的迭代器队腐。執(zhí)行完自定義reduce()的邏輯后context.write(k,v)。然后調(diào)用OutputFormat(默認TextOutputFormat)中的RecordWriter中的write(k,v)方法把結果寫入FileoutputFormat.setoutputpath(file://'xx')中奏篙。不同的reducer寫出不同的文件柴淘,part-r00000迫淹,part-r00001……。
- combiner
在maptask的本地先完成一些類似reduce的操作为严。從環(huán)形緩沖區(qū)溢出時spiller去調(diào)用combiner把相同key的value累加敛熬。在merge溢出文件時也可以調(diào)用combiner累加value。