1. 程式人生 > >Hadoop預留磁碟空間問題

Hadoop預留磁碟空間問題

在hdfs-site.xml中設定dfs.datanode.du.reserved的值,磁碟就會有預留空間:

<property>
    <name>dfs.datanode.du.reserved</name>
    <value>2147483648</value> #2GB
    <說明>Reserved space in bytes per volume. Always leave this much space free for non dfs use.<說明>
</property>

既然有預留空間,且預留空間設定為2GB,那為何Hadoop上卻顯示Remaining只剩餘100MB左右呢,而非2GB呢?

那我們從單機上看看吧,為了方便展現,把df的命令結果列出來,從單機上看,以某一個特定磁碟為例,有以下幾筆資料:

  • Size為768413784,約為733G
  • Used為766359616,約為731G
  • Avail為102180,約為100M

那麼,733G-731G=2G,而不應該是100M啊,那系統為什麼會顯示100M呢?看起來,從733-731=2這個角度來講,確實是預留了2G沒有使用,那是怎麼回事?

我們繼續往下追查,通過fdisk命令看到,該磁碟大小為799.5G,而系統顯示只有733G,那60G跑哪裡去了呢?現在,有兩個磁碟空間的疑問了

  1. 磁碟Size顯示733G,為何Used + Avail < Size
  2. 磁碟是800G,為何系統顯示Size僅有733G

先回答第一個問題,為何Used + Avail < Size?

通過命令 tune2fs -l /dev/sdi可以看到分割槽有保留空間(Reserved block count: 487997),Block size是4096,因此預留空間大小就是Reserved block count * Block size= 487997 * 4096 = 1998835712KB / 1024 = 1951988MB,那麼實際的預留空間大小就是1951988MB,然後df命令的(Size)768413784 – (Used)766439308 = (Avali)22488 + (Reserved)1951988。真相大白了,系統預留了2G左右的保留空間,而Hadoop未考慮該部分,當Hadoop設定了2GB預留分割槽後,就會出現這個悲劇,Hadoop無法使用該部分空間,因此,Hadoop需要調整預留空間的大小,且Hadoop預留空間的大小=系統預留空間+Hadoop期望的預留空間

。在實際使用中,考慮到磁碟都是4T以上的,因此預留空間一般設定為100GB為宜,,這樣磁碟預留空間佔比大於1%,我們設定磁碟報警也就比較方便了。

再回答第二個問題,磁碟是800G,為何系統顯示Size僅有733G?

硬碟格式化的時候,作業系統自動將硬碟分成兩個區域。一個是資料區,存放檔案資料;另一個是inode區(inode table),存放inode所包含的資訊。inode也會消耗硬碟空間,所以這個800G- 733G=67G,就是Inode佔用的空間。那如何把這個理論放到實踐裡呢,我們也來算一下吧。799535005696 bytes / 1024  / 1024 / 1024 = 744.625GB(按照1000/1000/1000會是799.5GB,這點比較坑,導致我算了好久沒有對回去),系統顯示Size為768413784(733G),那麼Inode理論佔用了大概11.625G的空間,具體來算下吧,Inode count: 48799744 * Inode size: 256 = 12492734464 / 1024 /1024 /1024= 11.63G,和之前的11.625G基本就對應起來了。

[[email protected] hadoop]# tune2fs -l /dev/sdi

  • Inode count: 48799744
  • Reserved block count: 487997
  • Inode size: 256
  • Block size: 4096