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基本就对应起来了。

[root@A06-R12-I12-126 hadoop]# tune2fs -l /dev/sdi

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

猜你喜欢

转载自blog.csdn.net/weixin_43947499/article/details/84942125