mapreduce源碼解讀
⑴ MapRece源碼解析之InputFormat
導讀
深入探討MapRece框架的核心組件——InputFormat。此組件在處理多樣化數據類型時,扮演著數據格式化和分片的角色。通過設置job.setInputFormatClass(TextInputFormat.class)等操作,程序能正確處理不同文件類型。InputFormat類作為抽象基礎,定義了文件切分邏輯和RecordReader介面,用於讀取分片數據。本節將解析InputFormat、InputSplit、RecordReader的結構與實現,以及如何在Map任務中應用此框架。
類圖與源碼解析
InputFormat類提供了兩個關鍵抽象方法:getSplits()和createRecordReader()。getSplits()負責規劃文件切分策略,定義邏輯上的分片,而RecordReader則從這些分片中讀取數據。
InputSplit類承載了切分邏輯,表示了給定Mapper處理的邏輯數據塊,包含所有K-V對的集合。
RecordReader類實現了數據讀取流程,其子類如LineRecordReader,提供行數據讀取功能,將輸入流中的數據按行拆分,賦值為Key和Value。
具體實現與操作流程
在getSplits()方法中,FileInputFormat類負責將輸入文件按照指定策略切分成多個InputSplit。
TextInputFormat類的createRecordReader()方法創建了LineRecordReader實例,用於讀取文件中的每一行數據,形成K-V對。
Mapper任務執行時,通過調用RecordReader的nextKeyValue()方法,讀取文件的每一行,完成數據處理。
在Map任務的run()方法中,MapContextImp類實例化了一個RecordReader,用於實現數據的迭代和處理。
總結
本文詳細闡述了MapRece框架中InputFormat的實現原理及其相關組件,包括類圖、源碼解析、具體實現與操作流程。後續文章將繼續探討MapRece框架的其他關鍵組件源碼解析,為開發者提供深入理解MapRece的構建和優化方法。
⑵ yarn源碼分析(四)AppMaster啟動
在容器分配完成之後,啟動容器的代碼主要在ContainerImpl.java中進行。通過狀態機轉換,container從NEW狀態向其他狀態轉移時,會調用RequestResourceTransition對象。RequestResourceTransition負責將所需的資源進行本地化,或者避免資源本地化。若需本地化,還需過渡到LOCALIZING狀態。為簡化理解,此處僅關注是否進行資源本地化的情況。
為了將LAUNCH_CONTAINER事件加入事件處理隊列,調用了sendLaunchEvent方法。該事件由ContainersLauncher負責處理。ContainersLauncher的handle方法中,使用一個ExecutorService(線程池)容器Launcher。ContainerLaunch實現了Callable介面,其call方法生成並執行launch_container腳本。以MapRece框架為例,該腳本在hadoop.tmp.dir/application name/container name目錄下生成,其主要作用是啟動MRAppMaster進程,即MapRece的ApplicationMaster。