這篇文章主要介紹了MapReduce主要接口有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出棗陽免費做網(wǎng)站回饋大家。
(1) InputFormat接口
用戶需要實現(xiàn)該接口以指定輸入文件的內(nèi)容格式。該接口有兩個方法
public interface InputFormat
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader
}
其中g(shù)etSplits函數(shù)將所有輸入數(shù)據(jù)分成numSplits個split,每個split交給一個map task處理。getRecordReader函數(shù)提供一個用戶解析split的迭代器對象,它將split中的每個record解析成key/value對。
Hadoop本身提供了一些InputFormat:
TextInputFormat
作為默認(rèn)的文件輸入格式,用于讀取純文本文件,文件被分為一系列以LF或者CR結(jié)束的行,key是每一行的位置偏移量,是LongWritable類型的,value是每一行的內(nèi)容,為Text類型。
KeyValueTextInputFormat
同樣用于讀取文件,如果行被分隔符(缺省是tab)分割為兩部分,第一部分為key,剩下的部分為value;如果沒有分隔符,整行作為 key,value為空。
SequenceFileInputFormat
用于讀取sequence file。 sequence file是Hadoop用于存儲數(shù)據(jù)自定義格式的binary文件。它有兩個子類:SequenceFileAsBinaryInputFormat,將 key和value以BytesWritable的類型讀出;SequenceFileAsTextInputFormat,將key和value以Text類型讀出。
SequenceFileInputFilter
根據(jù)filter從sequence文件中取得部分滿足條件的數(shù)據(jù),通過 setFilterClass指定Filter,內(nèi)置了三種 Filter,RegexFilter取key值滿足指定的正則表達式的記錄;PercentFilter通過指定參數(shù)f,取記錄行數(shù)%f==0的記錄;MD5Filter通過指定參數(shù)f,取MD5(key)%f==0的記錄。
NLineInputFormat
可以將文件以行為單位進行split,比如文件的每一行對應(yīng)一個map。得到的key是每一行的位置偏移量(LongWritable類型),value是每一行的內(nèi)容,Text類型。
MultipleInputs
用于多個數(shù)據(jù)源的join
(2)Mapper接口
用戶需繼承Mapper接口實現(xiàn)自己的Mapper,Mapper中必須實現(xiàn)的函數(shù)是
Mapper有setup(),map(),cleanup()和run()四個方法。其中setup()一般是用來進行一些map()前的準(zhǔn)備工作,map()則一般承擔(dān)主要的處理工作,cleanup()則是收尾工作如關(guān)閉文件或者執(zhí)行map()后的K-V分發(fā)等。run()方法提供了setup->map->cleanup()的執(zhí)行模板。
(3)Partitioner接口
用戶需繼承該接口實現(xiàn)自己的Partitioner以指定map task產(chǎn)生的key/value對交給哪個reduce task處理,好的Partitioner能讓每個reduce task處理的數(shù)據(jù)相近,從而達到負(fù)載均衡。Partitioner中需實現(xiàn)的函數(shù)是
getPartition( K2 key, V2 value, int numPartitions)
該函數(shù)返回
用戶如果不提供Partitioner,Hadoop會使用默認(rèn)的(實際上是個hash函數(shù))。
Partitioner如何使用
?實現(xiàn)Partitioner接口覆蓋getPartition()方法
?Partitioner示例
public static class MyPartitioner extends Partitioner
@Override
public int getPartition(Text key, Text value, int numPartitions) {
}
}
Partitioner需求示例
?需求描述
?數(shù)據(jù)文件中含有省份
?需要相同的省份送到相同的Reduce里
?從而產(chǎn)生不同的文件
?步驟
?實現(xiàn)Partitioner,覆蓋getPartition
?根據(jù)省份字段進行切分
(4)Combiner
combine函數(shù)把一個map函數(shù)產(chǎn)生的
什么情況下可以使用Combiner
?可以對記錄進行匯總統(tǒng)計的場景,如求和。
?求平均數(shù)的場景就不可以使用了
Combiner執(zhí)行時機
?運行combiner函數(shù)的時機有可能會是merge完成之前,或者之后,這個時機可以由一個參數(shù)控制,即 min.num.spill.for.combine(default 3)
?當(dāng)job中設(shè)定了combiner,并且spill數(shù)最少有3個的時候,那么combiner函數(shù)就會在merge產(chǎn)生結(jié)果文件之前運行
?通過這樣的方式,就可以在spill非常多需要merge,并且很多數(shù)據(jù)需要做conbine的時候,減少寫入到磁盤文件的數(shù)據(jù)數(shù)量,同樣是為了減少對磁盤的讀寫頻率,有可能達到優(yōu)化作業(yè)的目的。
?Combiner也有可能不執(zhí)行, Combiner會考慮當(dāng)時集群的負(fù)載情況。
Combiner如何使用
?繼承Reducer類
public static class Combiner extends Reducer
public void reduce(Text key, Iterator
OutputCollector
throws IOException {
}
}
(5)Reducer接口
實現(xiàn)自己的Reducer,必須實現(xiàn)reduce函數(shù)
(6)OutputFormat
用戶通過OutputFormat指定輸出文件的內(nèi)容格式,不過它沒有split。每個reduce task將其數(shù)據(jù)寫入自己的文件,文件名為part-nnnnn,其中nnnnn為reduce task的ID。
public abstract class OutputFormat
/**
* 創(chuàng)建一個記錄寫入器
*/
public abstract RecordWriter
/**
* 檢查結(jié)果輸出的存儲空間是否有效
*/
public abstract void checkOutputSpecs(JobContext context) throws IOException, InterruptedException;
/**
* 創(chuàng)建一個任務(wù)提交器
*/
public abstract OutputCommitter getOutputCommitter(TaskAttemptContext context) throws IOException, InterruptedException;
}
TextOutputFormat,輸出到純文本文件,格式為 key + " " + value。
NullOutputFormat,hadoop中的/dev/null,將輸出送進黑洞。
SequenceFileOutputFormat, 輸出到sequence file格式文件。
MultipleSequenceFileOutputFormat, MultipleTextOutputFormat,根據(jù)key將記錄輸出到不同的文件。
DBInputFormat和DBOutputFormat,從DB讀取,輸出到DB。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“MapReduce主要接口有哪些”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!