首页 > 其他 > 详细

HDFS数据目录限额深入理解

时间:2017-02-23 13:35:38      阅读:1367      评论:0      收藏:0      [点我收藏+]

HDFS的参数dfs.datanode.du.reserved可以设置适用于非 DFS 使用的保留空间, 下面通过实验来理解非 DFS 使用的保留空间的具体用法。

1、HDFS的两个数据目录挂载在/目录下面, 同一个磁盘。
设置三个磁盘角色组,每组限额为200M:
技术分享
 
    /hadoopdata1是挂载在单独的磁盘分区下面, 总的大小是1008M。
    将DataNode Group 2的角色组分配给主机cdh2, 在cdh2上面执行put操作,根据文件本地性, HDFS文件会在本地保留一份副本, 观察cdh2上面的/hadoopdata1的磁盘使用情况。
测试文件使用dd命令创建, 然后执行put操作。
  1. [hdfs@cdh3 kai]$ dd if=/dev/zero of=test5m bs=1M count=5
  2. 5+0 records in
  3. 5+0 records out
  4. 5242880 bytes (5.2 MB) copied, 0.0036332 s, 1.4 GB/s
  5. [hdfs@cdh3 kai]$
  6. [hdfs@cdh3 kai]$ hdfs dfs -put test5m /tmp/

技术分享
 


     当/hadoopdata1的文件大小达到808M的时候, 空间不在增加, 说明已经达到磁盘限额。
    设置限额后, HDFS能够使用的空间为:磁盘分区总的大小 - HDFS限额 = 1008M - 200M = 808M。 但是需要注意, 留给非HDFS使用的空间没有200M,这是因为1008M ≠ 825M + 133M,
非HDFS能够使用的空间为:(825M + 133M) - 808M = 150M。
技术分享
 

2、在同一个磁盘分区下面新建两个数据目录
限额为200M, 分配给主机cdh2, 按照上面1的分析, HDFS能够使用的空间应该也为808M, 下面通过实验来分析。
技术分享
 
在主机CDH2上面put文件到HDFS文件系统, 当/hadoopdata1/data1和/hadoopdata1/data2 的大小增大到924M的时候不再增长,此时HDFS使占用的空间大小为:924M*2= 1848M, 此时数据目录的分区使用率为99%, 说明当在同一个分区下面有两个数据目录的时候, 限额并没有生效。 是不是可以这样假设:当只有一个数据目录的时候, HDFS能够使用的空间为1008M-200M=808M, 那么有两个分区的时候, HDFS能够使用的空间大小为:808M * 2 = 1616M, 但是本例中磁盘空间不够用, 所以无法证实, 下面通过另外一个实验验证下假设是否成立。
 技术分享
 

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, 已经超出了磁盘分区的总大小, 很容易将磁盘分区占满。
综上, 在实际生产中, 应该避免同一个磁盘分区下面对应两个和以上的数据目录。





HDFS数据目录限额深入理解

原文:http://www.cnblogs.com/xiaohe001/p/6432800.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!