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跑哪裡去了呢?現在,有兩個磁碟空間的疑問了
- 磁碟Size顯示733G,為何Used + Avail < Size
- 磁碟是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期望的預留空間
再回答第二個問題,磁碟是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