hadoop 使用HDFS來落地存儲hbase的數據, 我們可以通過以下命令來查看HDFS的空間佔用大小.
- hadoop fsck
- hadoop fs -dus
- hadoop fs -count -q
上述命令在hdfs裏面可能存在權限問題, 可以前面加上sudo -u hdfs 來運行以上命令
首先讓我們看看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