HDFSのディスク使用量表示の謎

HadoopのHDFSの使用量をコマンドラインから確認するには、

  • hadoop fsck /
  • hadoop dfsadmin -report

などを使用する方法があります。ところが、これらのツールで表示される結果が少し異なって表示されます。

fsckの結果

[root@node4 ~]# hadoop fsck /
FSCK started by root from /192.168.127.104 for path / at Thu Aug 09 20:39:53 JST 2012
.
/user/hdfs/hosts:  Under replicated blk_-1188876542256378619_1003. Target Replicas is 3 but found 1 replica(s).
.
/user/hdfs/passwd:  Under replicated blk_6858785821850585066_1002. Target Replicas is 3 but found 1 replica(s).
Status: HEALTHY
Total size:	2446 B
Total dirs:	4
Total files:	2
Total blocks (validated):	2 (avg. block size 1223 B)
Minimally replicated blocks:	2 (100.0 %)
Over-replicated blocks:	0 (0.0 %)
Under-replicated blocks:	2 (100.0 %)
Mis-replicated blocks:		0 (0.0 %)
Default replication factor:	3
Average block replication:	1.0
Corrupt blocks:		0
Missing replicas:		4 (200.0 %)
Number of data-nodes:		1
Number of racks:		1
FSCK ended at Thu Aug 09 20:39:53 JST 2012 in 9 milliseconds


The filesystem under path '/' is HEALTHY

dfsadmin -reportの結果

[root@node4 ~]# su - hdfs
-bash-4.1$ hadoop dfsadmin -report
Configured Capacity: 5298307892 (4.93 GB)
Present Capacity: 702069172 (669.55 MB)
DFS Remaining: 702038016 (669.52 MB)
DFS Used: 31156 (30.43 KB)
DFS Used%: 0%
Under replicated blocks: 2
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Name: 192.168.127.104:50010
Rack: /default
Decommission Status : Normal
Configured Capacity: 5298307892 (4.93 GB)
DFS Used: 31156 (30.43 KB)
Non DFS Used: 4596224820 (4.28 GB)
DFS Remaining: 702038016(669.52 MB)
DFS Used%: 0%
DFS Remaining%: 13.25%
Last contact: Thu Aug 09 20:45:28 JST 2012

調査のためにHDFSをフォーマットし、小さなファイルをコピーして実験してみました。比較すると、下記のようにかなり違った値になります。
fsck: Total size: 2446 B
dfsadmin -report : DFS Used: 45056 (44 KB)

CDH3u5のソースコードを読んだところ、

fsckはNameNode上にあるメタデータを元に計算を行い、HDFS上の各ディレクトリにあるファイルのサイズを合計して計算します。

dfsadmin -report では、各DataNodeから送られてくるブロック情報を元に計算しています。このとき各DataNodeでは、ブロック情報の追加/削除時にサイズを計算していることがわかったのですが、なんとチェックサムファイルのサイズを加算して計算していました。

[root@node4 dfs]# ls -l dn/current/
total 24
-rw-r--r-- 1 hdfs hdfs  161 Aug  9 20:23 VERSION
-rw-r--r-- 1 hdfs hdfs  213 Aug  9 20:31 blk_-1188876542256378619
-rw-r--r-- 1 hdfs hdfs   11 Aug  9 20:31 blk_-1188876542256378619_1003.meta
-rw-r--r-- 1 hdfs hdfs 2233 Aug  9 20:29 blk_6858785821850585066
-rw-r--r-- 1 hdfs hdfs   27 Aug  9 20:29 blk_6858785821850585066_1002.meta
-rw-r--r-- 1 hdfs hdfs  193 Aug  9 20:40 dncp_block_verification.log.curr

なお、ファイルが全く作成されていない状態で、28672バイトが消費されています(理由がわかりませんが、4096*7=28672なので、何かのディレクトリを7個分カウントとしているのかもしれません。

この状態でファイルを追加したところ、
ブロックの合計は2446(213+2233)、
チェックサムファイルの合計は38(11+27)バイトです。
合計すると28672+2446+38=31156となり、dfsadmin -reportの結果と一致します。

従って、dfsadmin -report の結果の方が大きな値になります。 (実際にはこれ以外にも何かの値を加算している条件があるようなのですが、ざっと調べた限りではわかりませんでしたが)

チェックサムもHDFSのために使用される容量ですが、これはソースを見ないとわからないような気がします。ご参考になれば。

余談:その後放置していたところ、微妙に値が変化していました。ブロック+メタ情報以外の何かが作成されたのかもしれません。追ってファイルを全て削除してみましたが、ゼロには戻りませんでした。謎は全て解けていないようです。。

Pocket

This entry was posted in Uncategorized by . Bookmark the permalink.