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),通過其內部定義的檔案路徑,起始位置,偏移量三個位置來唯一確定。
該方法就是為指定的inputsplit建立記錄讀取器(後面我們將實現自己的recordreader),通過記錄讀取器從輸入分片中讀取鍵值對,然後將鍵值對交給map來處理。看到這裡,我想我們應該一些什麼。public
abstract recordreadercreaterecordreader(inputsplit split,taskattemptcontext context) throws ioexception,interruptedexception;
當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服務...