[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進行處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM