溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MapReduce主要接口有哪些

發(fā)布時間:2021-12-10 13:55:25 來源:億速云 閱讀:374 作者:小新 欄目:云計算

這篇文章主要介紹了MapReduce主要接口有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

(1) InputFormat接口

用戶需要實現(xiàn)該接口以指定輸入文件的內(nèi)容格式。該接口有兩個方法

public interface InputFormat<K, V> {
 
     InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
 
     RecordReader<K, V> getRecordReader(InputSplit split,JobConf job,Reporter reporter) throws IOException;
 
}

其中getSplits函數(shù)將所有輸入數(shù)據(jù)分成numSplits個split,每個split交給一個map task處理。getRecordReader函數(shù)提供一個用戶解析split的迭代器對象,它將split中的每個record解析成key/value對。

Hadoop本身提供了一些InputFormat:

TextInputFormat
作為默認的文件輸入格式,用于讀取純文本文件,文件被分為一系列以LF或者CR結束的行,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,比如文件的每一行對應一個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()前的準備工作,map()則一般承擔主要的處理工作,cleanup()則是收尾工作如關閉文件或者執(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ù)相近,從而達到負載均衡。Partitioner中需實現(xiàn)的函數(shù)是
getPartition(  K2   key, V2 value, int numPartitions)
該函數(shù)返回<K2 V2>對應的reduce task ID。
用戶如果不提供Partitioner,Hadoop會使用默認的(實際上是個hash函數(shù))。

Partitioner如何使用
?實現(xiàn)Partitioner接口覆蓋getPartition()方法
?Partitioner示例
        public static class MyPartitioner extends Partitioner<Text, Text> {
          
         @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)生的<key,value>對(多個key, value)合并成一個新的<key2,value2>. 將新的<key2,value2>作為輸入到reduce函數(shù)中,其格式與reduce函數(shù)相同。Combiner使得map task與reduce task之間的數(shù)據(jù)傳輸量大大減小,可明顯提高性能。大多數(shù)情況下,Combiner與Reducer相同。

什么情況下可以使用Combiner
?可以對記錄進行匯總統(tǒng)計的場景,如求和。
?求平均數(shù)的場景就不可以使用了
Combiner執(zhí)行時機
?運行combiner函數(shù)的時機有可能會是merge完成之前,或者之后,這個時機可以由一個參數(shù)控制,即 min.num.spill.for.combine(default 3)
?當job中設定了combiner,并且spill數(shù)最少有3個的時候,那么combiner函數(shù)就會在merge產(chǎn)生結果文件之前運行
?通過這樣的方式,就可以在spill非常多需要merge,并且很多數(shù)據(jù)需要做conbine的時候,減少寫入到磁盤文件的數(shù)據(jù)數(shù)量,同樣是為了減少對磁盤的讀寫頻率,有可能達到優(yōu)化作業(yè)的目的。
?Combiner也有可能不執(zhí)行, Combiner會考慮當時集群的負載情況。

Combiner如何使用
?繼承Reducer類

public static class Combiner extends Reducer<Text, Text, Text, Text> {
       public void reduce(Text key, Iterator<Text> values,
               OutputCollector<Text, Text> output, Reporter reporter)
               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<K, V> {  
  /** 
   * 創(chuàng)建一個記錄寫入器
   */ 
  public abstract RecordWriter<K, V> getRecordWriter(TaskAttemptContext context) throws IOException, InterruptedException;   
  /** 
   * 檢查結果輸出的存儲空間是否有效
   */ 
  public abstract void checkOutputSpecs(JobContext context) throws IOException, InterruptedException;  
  /**
   * 創(chuàng)建一個任務提交器
   */ 
  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。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MapReduce主要接口有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI