将DataNode Group 2的角色组分配给主机cdh2, 在cdh2上面执行put操作,根据文件本地性, HDFS文件会在本地保留一份副本, 观察cdh2上面的/hadoopdata1的磁盘使用情况。
3、继续实验,测试同一个磁盘分区下面新建两个数据目录
数据目录、限额修改如下:
角色组:DataNode Group2
dfs.datanode.du.reserved限额:700M
角色组分配的主机:cdh2
数据目录:/hadoopdata1/data1 和 /hadoopdata1/data2, 这两个目录均在/hadoopdata1/目录所在的磁盘分区。
将DataNode Group2的角色组分配给节点cdh2:
/hadoopdata1所在分区的总的大小为1008M。
现在假定步骤2的假设成立, 那么HDFS能够使用的空间为 (磁盘分区总的空间 - HDFS限额)*2 = (1008M - 700M)*2 = 308M * 2
在cdh2上面, 不断向hdfs增加文件,观察/hadoopdata1/data1和/hadoopdata1/data2的目录文件大小变化, 我发现, 两个目录分别增大到308M的时候, 空间不再增加,说明步骤2的假设成立。
4、测试根目录(/)先设置两个数据目录的限额
角色组:DataNode Group 1
dfs.datanode.du.reserved限额: 9G
角色组分配的主机:cdh3
数据目录:/hdfsdata1 和 hdfsdata2, 这两个目录均在根目录所在的磁盘分区。
根据步骤3的结论, HDFS能够使用的空间为:(磁盘总的空间大小 - HDFS限额)*2 = (9.7G - 9G) * 2 = 1.4G
使用dd创建文件, 然后向HDFS 做put操作, 查看目录/hdfsdata1 和 /hdfsdata2的空间大小情况。
观察发现, 当/hdfsdata1和/hdfsdata2的大小达到629M和627M的时候, 不再增长, 近似于1.4G大小

5、设置根目录下面设置一个数据目录的限额
角色组:DataNode Group 1
dfs.datanode.du.reserved限额: 9G
角色组分配的主机:cdh3
数据目录:/hdfsdata, 这个目录在根目录所在的磁盘分区。
根据步骤3的结论, HDFS能够使用的空间为:磁盘总的空间大小 - HDFS限额 = 9.7G - 9G = 0.7G
使用dd创建文件, 然后向HDFS 做put操作, 查看目录/hdfsdata1的空间大小变化情况。
观察发现, 当/hdfsdata的大小达到629M的时候, 不再增长, 近似于0.7大小
6、同一个角色组, 设置两个数据目录,两个数据目录分别存放在不同的磁盘下面
角色组:DataNode Group 1
dfs.datanode.du.reserved限额: 9G
角色组分配的主机:cdh3
数据目录:/hdfsdata、/home/hdfsdata分别在根目录(/)所在磁盘的分区和/home目录所在磁盘的分区。
根目录(/)的磁盘分区大小为9.7G, /home目录所在磁盘的分区大小为473G。

在cdh3上面不断put文件操作, 观察/hdfsdata、/home/hdfsdata空间大小使用情况, 刚开始put的几次操作, /hdfsdata空间使用在增长, /home/hdfsdata大小不变, 当 /hdfsdata增长到568M, 再执行put一个100M大文件, 此后, /hdfsdata空间使用不再增长, 后续的数据都存放到/home/hdfsdata下面了。

说明限额对/hdfsdata生效了, 但是/home/hdfsdata所在的磁盘分区很大, 没有测试了。
总结:
当通过参数dfs.datanode.du.reserved设置适用于非 DFS 使用的保留空间, HDFS能够使用的空间根据数据目录的设置有关, 具体如下:
1、HDFS的数据目录对应1个目录
HDFS能够使用的空间大小= 数据目录所在的磁盘分区总大小 - 非 DFS 使用的保留空间。
非 DFS 使用的保留空间即通过参数dfs.datanode.du.reserved设置的大小。
2、当HDFS的数据目录对应2个目录且对应两个不同的磁盘分区
HDFS能够使用的空间大小= (数据目录1所在的磁盘分区总大小 - 非 DFS 使用的保留空间) +
(数据目录2所在的磁盘分区总大小 - 非 DFS 使用的保留空间)。
数据目录1上, HDFS能够使用的空间大小= 数据目录1所在的磁盘分区总大小 - 非 DFS 使用的保留空间。
数据目录2上, HDFS能够使用的空间大小= 数据目录2所在的磁盘分区总大小 - 非 DFS 使用的保留空间。
3、 当HDFS的数据目录对应2个目录所在的磁盘分区相同
HDFS能够使用的空间大小 = (数据目录所在的磁盘分区总大小 - 非 DFS 使用的保留空间) *2。
从HDFS的IO效率来说,同一个磁盘分区设置两个或者以上的数据目录,无法分担HDFS的IO压力, 因为每次的IO都是对同一个磁盘进行读写。
同一个磁盘分区设置两个或者以上的数据目录,设置非 DFS 使用的保留空间, 很容易出现问题。假设某个磁盘分区的大小为10G,在这个磁盘分区下面设置两个数据目录, 非 DFS 使用的保留空间大小设置为2G, 看起来这2G能够保留下来供非HDFS应用来使用,但是HDFS能够使用的空间大小为(10G - 2G) * 2 = 16G, 已经超出了磁盘分区的总大小, 很容易将磁盘分区占满。
综上, 在实际生产中, 应该避免同一个磁盘分区下面对应两个和以上的数据目录。