首先让我们看看fsck和fs -dus区别
hadoop fsck
hadoop fsck /path/to/directory
Total size: 16565944775310 B <=== see here
Total dirs: 3922
Total files: 418464
Total blocks (validated): 502705 (avg. block size 32953610 B)
Minimally replicated blocks: 502705 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 3.0
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 18
Number of racks: 1
FSCK ended at Thu Oct 20 20:49:59 CET 2011 in 7516 milliseconds
The filesystem under path '/path/to/directory' is HEALTHY
hadoop fs -du -s
hadoop fs -dus /path/to/directory
hdfs://master:54310/path/to/directory 16565944775310 <=== see here
可以看见上面都有16565944775310 Bytes (15.1 TB) 的空间被HDFS占用, 他们都显示了”正常”的文件大小, 却没有考虑到HDFS的replication(复制). 在这种情况下, 路径/目录 存储了大约378.7M的数据. 现在fsck告诉我们, 在hdfs上所有文件的平均块复制( Average block replication) 的值是3, 这意味着, 这些文件在原始的HDFS存储空间中会存在, 就是会存在3倍.
3.0 x 16565944775310 (15.1 TB) = 49697834325930 Bytes (45.2 TB)
这才是HDFS真实消耗了多少磁盘空间.
hadoop fs -count -q
hadoop fs -count -q /path/to/directory
QUOTA REMAINING_QUOTA SPACE_QUOTA REMAINING_SPACE_QUOTA
none inf 54975581388800 5277747062870
DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME
3922 418464 16565944775310 hdfs://master:54310/path/to/directory
这里作了一下换行, 并且加入了一些列标, 可以更加方便的看出:
第七列, CONTENT_SIZE 16565944775310 Bytes (15.1 TB) 是有效的HDFS空间占用
第三列, SPACE_QUOTA 54975581388800 Bytes ( 50 TB) 是原始的HDFS磁盘配额, 也就是HDFS在磁盘上总的空间, HDFS能够使用 50 TB.
第四列, REMAINING_SPACE_QUOTA 5277747062870 Bytes (4.8 TB) 是剩余的HDFS磁盘配额.
可以看到, hadoop fsck 和 hadoop fs -du -s都会显示数据的有效占用, 等于本地文件系统的占用大小.
而 hadoop fs -count -q第三列和第四列间接返回了实际消耗在分布式集群节点的磁盘占用. 根据
每个HDFS块(block)/3个副本(replications)的比例(这里3已经在hadoop fsck 上输出了, average block replication=3.0),
所以我们可以作一个减法来算出实际磁盘占用:
54975581388800 (50 TB) - 5277747062870 (4.8 TB) = 49697834325930 (45.2 TB)
可以知道, hadoop空间配额总是会计算原始的 HDFS 磁盘占用消耗,
所以如果你有 1 TB 的磁盘, 当你设置副本(replication)=10的时候, 你可以存 100 GB 的单个文件.
如果副本是3 你可以存单个文件 333 GB的.
这就是 hadoop 的空间配额怎么计算的. 同时hadoop 会在你没有设置副本值(replication)的时候, 给出了一个默认的3个副本的值. 这也就决定了hadoop的磁盘配额会始终计算原始HDFS 磁盘空间消耗, 并且算上副本值.
本地文件系统大小 hadoop fsck/hadoop fs -dus hadoop fs -count -q(if replication factor == 3)
100GB 100GB 300GB
原文在这里http://www.michael-noll.com/blog/2011/10/20/understanding-hdfs-quotas-and-hadoop-fs-and-fsck-tools/