hadoop原始碼學習 InputFormat抽象類

2021-07-09 05:12:57 字數 1566 閱讀 6023

hadoop最cool的就是mapreduce了,那麼當執行乙個mapreduce作業的時候,你有沒有想過內部是如何實現的?儲存在hdfs上的資料到底是特麼的怎樣被讀取的?helloword級別的worldcount程式,是對文字檔案一行一行的讀的,為此我們需要對我們的文字進行處理,讓其老老實實的一行一行的排著隊。但是在生產環境中,各種格式的資料檔案,恐怕一行一行的排隊就滿足不了我們的要求了。比如需要誇張的處理100g的excel檔案,這個時候就需要自己來定義乙個輸入格式了。所以,我就想來解決這個問題。

乾掉敵人之前,先要弄清楚他的底細,那麼我們就從hadoop的原始碼開始研讀。

第乙個被研讀的物件就是inputformat。

inputformat作為hadoop作業的所有的輸入格式的抽象基類(與之相對應的hadoop作業的所有的輸出格式的抽象基類outputformat我等下再來學習),它描述了作業的輸入需要滿足的規範細節。也就是說,你要實現自己的乙個指定輸入格式的類,必須滿足這個規範,不然遊戲就玩不下去了,因為你用的就是hadoop這個平台。

inputformat這個抽象類的原始碼內部定義了兩個抽象方法:

public

abstract listgetsplits(jobcontext context) throws ioexception,interruptedexception;

改方法的主要作用就是將hdfs上要處理的檔案分割成許多個inputsplit,這裡的inputsplit就是hadoop平台上的邏輯分片,對應的還有物理分片blocks,以後學習hdfs源**的時候再來講這個。每乙個分片(inputsplit),通過其內部定義的檔案路徑,起始位置,偏移量三個位置來唯一確定。
public

abstract recordreadercreaterecordreader(inputsplit split,taskattemptcontext context) throws ioexception,interruptedexception;

該方法就是為指定的inputsplit建立記錄讀取器(後面我們將實現自己的recordreader),通過記錄讀取器從輸入分片中讀取鍵值對,然後將鍵值對交給map來處理。看到這裡,我想我們應該一些什麼。

當hadoop執行mapreduce作業的時候需要依賴inputformat來完成以下幾方面的工作:

檢查作業的輸入是否有效;

將輸入檔案分割成多個inputsplit,然後將每個inputsplit分別傳給單獨的map進行處理,也就是說有多少個inputsplit就會有多少個map任務,number(map)==number(inputsplit)

inputsplit是由乙個個記錄組成的,所以inputsplit需要提供乙個recordreader的實現,然後通過recordreader的實現來讀取inputformat中的每一條記錄,並將讀取的記錄交給map函式來進行處理。以下是hadoop預設為我們提供的inputformat實現類:

hadoop 原始碼筆記

public inte ce tool extends configurable public int run string args throws exception public static void main string args throws exception toolrunner執行...

Hadoop原始碼結構

hadoop專案已經得到社群以及行業內很多大牛的貢獻,現在版本已經推進到了1.0.0版本,本人以後將就當前1.0.0版本進行原始碼分析,如有重大特性更新的版本發布,會有相關的原始碼增補分析,多謝!bin 此目錄下為進行hadoop配置 執行以及管理的shell命令集合 c 此目錄下為linux下am...

Hadoop原始碼之JobTracker

jobtracker是map reducer中任務排程的伺服器。1 有如下執行緒為其服務 1 提供兩組rpc服務 intertrackerprotocol jobsubmissionprotocol 的1個listener執行緒與預設10個handler執行緒 2 提供任務執 況查詢的一組web服務...