天天看點

[Hadoop]MapReduce中的InputSplit

在檢視資料塊的如何處理之前,我們需要更仔細地了解Hadoop如何存儲資料。在Hadoop中,檔案由一個一個的記錄組成,最終由mapper任務一個一個的處理。

例如,示例資料集包含有關1987至2008年間美國境内已完成航班的資訊。如果要下載下傳資料集可以打開如下網址: 

http://stat-computing.org/dataexpo/2009/the-data.html  。每一年都會生成一個大檔案(例如:2008年檔案大小為108M),在每個檔案中每單獨的一行都代表一次航班資訊。換句話說,一行代表一個記錄。

1. Block

塊是以 block size 進行劃分資料。 是以,如果群集中的 block size 為 128 MB,則資料集的每個塊将為 128 MB,除非最後一個塊小于block size(檔案大小不能被 block size 完全整除)。例如下圖中檔案大小為513MB,513%128=1,最後一個塊(e)小于block size,大小為1MB。 是以,塊是以 block size 的硬切割,并且塊甚至可以在邏輯記錄結束之前結束(blocks can end even before a logical record ends)。

假設我們的叢集中block size 是128 MB,每個邏輯記錄大約100 MB(假設為巨大的記錄)。是以第一個記錄将完全在一個塊中,因為記錄大小為100 MB小于塊大小128 MB。但是,第二個記錄不能完全在一個塊中,是以第二條記錄将出現在兩個塊中,從塊1開始,在塊2中結束。

2. InputSplit

如果配置設定一個Mapper給塊1,在這種情況下,Mapper不能處理第二條記錄,因為塊1中沒有完整第二條記錄。因為HDFS不知道檔案塊中的内容,它不知道記錄會什麼時候可能溢出到另一個塊(because HDFS has no conception of what’s inside the file blocks, it can’t gauge when a record might spill over into another block)。InputSplit這是解決這種跨越塊邊界的那些記錄問題,Hadoop使用邏輯表示存儲在檔案塊中的資料,稱為輸入拆分(InputSplit)。

當MapReduce作業用戶端計算InputSplit時,它會計算出塊中第一個完整記錄的開始位置和最後一個記錄的結束位置。在最後一個記錄不完整的情況下,InputSplit 包括下一個塊的位置資訊和完成該記錄所需的資料的位元組偏移(In cases where the last record in a block is incomplete, the input split includes location information for the next block and the byte offset of the data needed to complete the record)。下圖顯示了資料塊和InputSplit之間的關系:

塊是磁盤中的資料存儲的實體塊,其中InputSplit不是實體資料塊。 它是一個Java類,指向塊中的開始和結束位置。 是以,當Mapper嘗試讀取資料時,它清楚地知道從何處開始讀取以及在哪裡停止讀取。 InputSplit的開始位置可以在塊中開始,在另一個塊中結束。InputSplit代表了邏輯記錄邊界,在MapReduce執行期間,Hadoop掃描塊并建立InputSplits,并且每個InputSplit将被配置設定給一個Mapper進行處理。

原文:

http://www.dummies.com/programming/big-data/hadoop/input-splits-in-hadoops-mapreduce/ http://hadoopinrealworld.com/inputsplit-vs-block/