HDFS會把很是大的文件分割成多個大的數據塊(例如,128M),而且每個數據塊在集羣的不一樣節點上存儲3個備份。HDFS並不知道也不關心這些文件的內容。html
在yarn上,當一個Mapreduce任務開始時,Resource Manager(負責集羣的資源管理和任務調度)會建立一個Application Master守護進程來監視這個任務的生命週期。app
(在Hadoop1中,JobTracker監控每一個Mapreduce任務,以及做業的調度和集羣資源的管理)oop
AM(Application Master,下同)首先要作的事情是肯定任務所須要的數據塊。AM向NameNode詢問所須要的數據塊的副本的存儲位置。帶着這些文件數據塊本地化信息,AM向資源管理器(Resource Manager)發出請求,資源管理器會在數據塊所在的從節點(Slave Node)上產生一個Mapper任務來處理數據塊。優化
MapReduce任務高效工做的關鍵是數據處理本地化,即在存儲數據塊的從節點上處理數據。
spa
譯者注:這就是所謂的"數據本地化優化",由於它無需使用寶貴的集羣帶寬資源。htm
在知道數據塊怎麼被處理以前,你要先知道Hadoop是怎麼存儲數據的。在Hadoop中,文件由每條獨立的記錄組成,最終被Mapper任務逐條記錄的處理。
生命週期
例如,示例數據集中包含了美國1987年至2008年全部已完成航班的信息。進程
示例數據集下載地址:http://stat-computing.org/dataexpo/2009/the-data.html hadoop
示例數據集格式:資源
每年都有一個很是大的文件,在每一個文件中,每一行表明了一次航班。換言之,一行表明了一條記錄。
如今,假設Hadoop集羣的數據塊大小是64M,這就意味着這些航班數據文件會被分割成多個精確的64M大小的數據塊。
那麼問題來了?若是每個Mapper任務要處理指定數據塊中的全部記錄,那麼這些記錄在跨越不一樣數據塊邊界時會發生什麼?文件數據塊是精準的64M(或者任何你設置的大小),可是由於HDFS不知道數據塊中存儲的內容,當一條完成的記錄被劃分到了不一樣的數據塊中,它也不會知道。
譯者注:HDFS在分割數據塊時會精準到字節,一個數據塊是64M,多一個或少一個字節都不行。而文件是由每一條完整的記錄組成,因此HDFS在把大文件分割成多個數據塊時,有可能會把一條完整的記錄劃分到不一樣的數據塊中。
當在一個數據塊中的最後一條記錄不完整的狀況下,輸入分片(input split)中就會包含下一個數據塊的儲存信息以及最後一條記錄的剩餘數據的字節偏移量。
下面這張圖表示了數據塊和輸入分片二者的關係。
你能夠經過配置,讓AM守護進程(或者Hadoop1中的JobTracker)去計算輸入分片而不是任務客戶端,這樣Mapper在處理大量數據塊時會快一些。
MapReduce處理數據是基於輸入分片的。一個應用中的輸入分片的數量決定了Mapper任務的數量。若是可能的話,每一個Mapper任務被分配在輸入分片所在的從節點上。Resource Manager(或者,Hadoop1中的JobTracker)儘可能讓輸入分片在本地被處理。
原文:http://www.dummies.com/how-to/content/input-splits-in-hadoops-mapreduce.html