Hadoop InputFormat介紹

Hadoop InputFormat介紹

1 概述

我們?cè)诰帉慚apReduce程序的時(shí)候,在設(shè)置輸入格式的時(shí)候,會(huì)調(diào)用如下代碼:

job.setInputFormatClass(KeyVakueTextInputFormat.class)

通過上面的代碼來保證輸入的文件是按照我們想要的格式被讀取,所有的輸入格式都繼承于InputFormat,這是一個(gè)抽象類,其子類有專門用于讀取普通文件的FileInputFormatt,用于讀取數(shù)據(jù)庫文件的DBInputFromat,用于讀取HBase的TableInputFormat等等。如下圖是InputFormat的圖譜。

InputFormat類圖

2 InputFormat方法

從類圖中可以看出,InputFormat抽象類僅有兩個(gè)抽象方法:

public abstract List<InputSplit> getSplits(JobContext context)
public abstract RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context)

getSplits()方法是邏輯上拆分作業(yè)的輸入文件集,然后將每個(gè)InputSplit分配給一個(gè)單獨(dú)的Mapper進(jìn)行處理

注意:拆分是按輸入文件的邏輯分割,而輸入文件不會(huì)被物理分割成塊。每個(gè)切片都是一個(gè)<input-file-path,start,offset>的元組,InputFormat并創(chuàng)建相應(yīng)的RecordReader讀取這些切片。

createRecordReader()方法是為給定的切片創(chuàng)建一個(gè)記錄閱讀器。在切片被使用之前先調(diào)用RecordReader.initialize(InputSplit, TaskAttemptContext)方法。

通過InputFormat,MapReduce框架可以做到:

  1. 驗(yàn)證作業(yè)輸入的正確性
  2. 將輸入的文件切割成邏輯分片(InputSplit),一個(gè)InputSplit將會(huì)分配給一個(gè)獨(dú)立的MapTask
  3. 提供RecordReader實(shí)現(xiàn),讀取InputSplit中的Kv對(duì)供Mapper使用。

不同的InputFormat會(huì)各自實(shí)現(xiàn)不同的文件讀取方法以及分片方式,每個(gè)輸入分片會(huì)被單獨(dú)的MapTask作為數(shù)據(jù)源。下面將介紹InputSplit和RecordReader。

3 InputSplit介紹

MapTask的輸入是一個(gè)輸入切片,稱為InputSplit。InputSplit也是一個(gè)抽象類,它在邏輯上包含給處理這個(gè)InputSplit的Mapper的所有KV對(duì)。不同類型的輸入格式對(duì)應(yīng)不同類型的切片,下圖是InputSplit的類圖。

InputSplit

3.1 InputSplit方法

// 獲取切片大小,并且根據(jù)size對(duì)切片排序
public abstract long getLength()
// 獲取存儲(chǔ)該分片的數(shù)據(jù)所在的節(jié)點(diǎn)位置,其中的數(shù)據(jù)是本地的,位置信息不需要序列號(hào)
public abstract String[] getLocations()
// 獲取有關(guān)切片在那個(gè)節(jié)點(diǎn)上的信息,以及它是如何存儲(chǔ)在每個(gè)位置的
public SplitLocationInfo[] getLocationInfo()

4 RecordReader

RecorderReader將讀入到Map的數(shù)據(jù)拆分成KV對(duì)。RecorderReader也是一個(gè)抽象類。下面是RecordReader的類圖:

InputFormat類圖

接下來看一下RecordReader的源代碼:

public abstract class RecordReader<KEYIN, VALUEIN> implements Closeable {

  /**
   * 由一個(gè)InputSplit初始化
   */
  public abstract void initialize(InputSplit split,
                                  TaskAttemptContext context
                                  ) throws IOException, InterruptedException;

  /**
   * 讀取分片下一個(gè)KV
   */
  public abstract
  boolean nextKeyValue() throws IOException, InterruptedException;

  /**
   * Get the current key
   */
  public abstract
  KEYIN getCurrentKey() throws IOException, InterruptedException;

  /**
   * Get the current value.
   */
  public abstract
  VALUEIN getCurrentValue() throws IOException, InterruptedException;

  /**
   * 跟蹤讀取分片的進(jìn)度
   */
  public abstract float getProgress() throws IOException, InterruptedException;

  /**
   * Close the record reader.
   */
  public abstract void close() throws IOException;
}

參考博文

http://www.cnblogs.com/shitouer/archive/2013/02/28/hadoop-source-code-analyse-mapreduce-inputformat.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 先思考問題 我們處在一個(gè)大數(shù)據(jù)的時(shí)代已經(jīng)是不爭的事實(shí),這主要表現(xiàn)在數(shù)據(jù)源多且大,如互聯(lián)網(wǎng)數(shù)據(jù),人們也認(rèn)識(shí)到數(shù)據(jù)里往...
    墻角兒的花閱讀 7,685評(píng)論 0 9
  • 摘自:http://staticor.io/post/hadoop/2016-01-23hadoop-defini...
    wangliang938閱讀 693評(píng)論 0 1
  • 思考問題 Mapper類 Mapper類 四個(gè)泛型,分別是KEYIN、VALUEIN、KEYOUT、VALUEOU...
    Sakura_P閱讀 972評(píng)論 0 3
  • 說到跑步,我終于有談?wù)摰馁Y本了.從去年5月開始接觸跑步(學(xué)校那些被迫式的不算),到現(xiàn)在已經(jīng)一年多了。最開始的時(shí)候一...
    獨(dú)白社閱讀 254評(píng)論 0 3
  • 周二的早晨,走路去上班的途中,遇到拾荒的老人, 佝僂著在垃圾桶里翻找易拉罐、礦泉水瓶。同時(shí)垃圾桶里傳出陣陣惡臭...
    曉言說閱讀 299評(píng)論 0 0

友情鏈接更多精彩內(nèi)容