阻止和拆分 HDFS
-
HDFS 中的塊大小和塊 :HDFS 具有在載入檔案時以塊的形式儲存資料的概念。塊是 HDFS 中資料的物理分割槽(或者在任何其他檔案系統中)。
無論何時將檔案載入到 HDFS 上,它都會被物理地分割(是的,檔案被分割)到稱為塊的不同部分。塊數取決於
hdfs-site.xml
中dfs.block.size
的值理想情況下,塊大小設定為較大的值,例如 64/128/256 MB(與普通 FS 中的 4 KB 相比)。Hadoop 2.x 的大多數發行版上的預設塊大小值為 128 MB。更大塊大小的原因是因為 Hadoop 用於處理 PetaBytes 資料,每個檔案的範圍從幾百兆位元組到 TeraBytes。
比如說你有一個大小為 1024 MB 的檔案。如果你的塊大小為 128 MB,你將獲得 8 塊 128 MB 的塊。這意味著你的 namenode 將需要儲存
8 x 3 = 24
檔案的後設資料(3 是複製因子)。考慮塊大小為 4 KB 的相同方案。它將導致
1GB / 4KB = 250000
塊,這將需要 namenode 為750000
塊儲存僅 1GB 檔案的後設資料。由於所有這些與後設資料相關的資訊都儲存在記憶體中,因此較大的塊大小是首選,以便在 NameNode 上節省額外的負載。同樣,塊大小不會設定為像 1GB 等極高的值,因為理想情況下,為每個資料塊啟動 1 個對映器。因此,如果將塊大小設定為 1GB,則可能會失去並行性,這可能會導致整體吞吐量降低。
2.) HDFS 中的分割大小 :Hadoop 處理中的分割是資料的邏輯塊。當檔案被分成塊時,hadoop 不尊重任何檔案 bopundaries。它只是根據塊大小拆分資料。假如你有一個 400MB 的檔案,有 4 行,每行有 100MB 的資料,你將得到 3 塊 128 MB x 3
和 16 MB x 1
。但是當在資料的 prceossing 中計算輸入分割時,記住檔案/記錄邊界,在這種情況下,如果你使用 NLineInputFormat
,我們將有 4 個輸入分割,每個 100 MB。
也可以使用屬性 mapreduce.input.fileinputformat.split.maxsize
為每個作業設定分割大小