HDFS中的文件在物理上是分塊存儲(Block
),塊的大小可以通過配置參數(dfs.blocksize
)來規定,默認大小在Hadoop2.x版本中是128M,老版本中是64M。
那么,問題來了,為什么一個block的大小就是128M呢?
默認為128M的原因,基於最佳傳輸損耗理論!
不論對磁盤的文件進行讀還是寫,都需要先進行尋址!
最佳傳輸損耗理論:在一次傳輸中,尋址時間占用總傳輸時間的1%
時,本次傳輸的損耗最小,為最佳性價比傳輸!
目前硬件的發展條件,普通磁盤寫的速率大概為100M/S, 尋址時間一般為10ms!
10ms / 1% = 1s
1s * 100M/S=100M
塊在傳輸時,每64K還需要校驗一次
,因此塊大小,必須為2的n次方
,最接近100M的就是128M!
如果公司使用的是固態硬盤,寫的速度是300M/S,將塊大小調整到 256M
如果公司使用的是固態硬盤,寫的速度是500M/S,將塊大小調整到 512M
為什么塊的大小不能設置太小,也不能設置太大?
不能太大:
當前有文件a, 1G
128M一塊 1G存8塊 , 取第一塊
1G一塊 1G存1塊 , 取第一塊
只需要讀取a文件0-128M部分的內容
①在一些分塊讀取的場景,不夠靈活,會帶來額外的網絡消耗
②在上傳文件時,一旦發生故障,會造成資源的浪費
不能太小:
文件a,128M
1M一塊: 128個塊,生成128個塊的映射信息
128M一塊, 1個塊,一個塊的映射信息
①塊太小,同樣大小的文件,會占用過多的NN的元數據空間
②塊太小,在進行讀寫操作時,會消耗額外的尋址時間