首頁>技術>

背景每個hdfs檔案的一個切片對應一個MapReduce作業的一個map任務,那麼檔案的切片是怎麼劃分的呢?下面介紹其中一個InputFormat:TextInputFormat作用獲取純文字檔案的邏輯切片為每個邏輯切片建立基於行的讀取器讀取器讀取的內容是kv鍵值對,鍵是記錄的偏移量,值是當前行文字內容前提條件檔案內容為純文字hdfs的塊大小預設為blockSize = 128M在TextInputFormat前提下,計算得到的每個切片大小為splitSize = 128M溢位閾值變數SPLIT_SLOP = 1.1(意思就是如果剩餘待切分的檔案長度 / splitSize < 1.1的話,那麼就把剩下的檔案長度當做一個邏輯切片看待,即使剩下的帶切分的檔案內容在2個塊中儲存)切片獲取假設當前一個文字檔案儲存在hdfs上有N個塊(不含副本塊數)前N-2個塊每個塊對應一個邏輯切片,如果第N-1和第N個塊的大小之和除以splitSize小於等於1.1,則第N-1和第N個塊被劃分到一個邏輯切片中如果第N-1和第N個塊的大小之和除以splitSize大於1.1,則第N-1個塊和第N個塊分別對應一個邏輯切片例1:檔案129M.txt是一個檔案大小為129M的檔案,因為blockSize為128M,因此該檔案以使用了兩個block儲存,第一個block大小為128M,第二個block大小為1M最開始時,檔案剩餘劃分內容長度為129M,129M / splitSize = 1.007 < 1.1,因此該檔案的第一個block和第二個block劃分到一個切片了因此該檔案對應的切片數量為1

圖示(未畫出副本block)

例2檔案150M.txt是一個檔案大小為150M的檔案,因為blockSize為128M,因此該檔案以使用了兩個block儲存,第一個block大小為128M,第二個block大小為22M最開始時,檔案剩餘劃分內容長度為150M,150M / splitSize = 1.17 > 1.1,因此該檔案的第一個block和第二個block分別對應一個切片因此該檔案對應的切片數量為2

圖示(未畫出副本block)

程式碼

TextInputFormat獲取文字檔案切片原始碼

切片類關鍵屬性檔案路徑(檔案邏輯路徑)起始偏移量內容長度這個起始偏移量所在資料塊在哪些DataNode的磁碟上這個資料塊被快取在哪些DataNode的記憶體中

切片類屬性

例1:以檔案大小為129M這個例子為例,該檔案劃分了一個切片(對應兩個block),因此該切片的屬性中起始偏移量start為0,內容長度length為129*1024*1024 = 135266304例2:以上述切片例子中的第2例150M的檔案為例,該例中有2個切片,第一個切片中包含該檔案的第一個block,該block的大小為128M,因此該切片的屬性起始偏移量start為0,內容長度length為128*1024*1024 = 134217728;第二個切片包含該檔案的第二個block(內容只有22M),因此第二個切片的屬性中起始偏移量start為(150-22)*1024*1024 = 134217728,內容長度length為22*1024*1024 = 23068672

以上就是TextInputFormat獲取文字檔案邏輯切片的過程了,後面介紹如何讀取切片對應檔案塊的內容~~~

6
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • BLE 掃描結果的上報