[Hadoop][HDFS]HDFSはファイルディスクリプタをどのくらい使うのか?

HDFSはよくファイルハンドル数の上限値(ulimit -n)を上げるよう、言われている。

さもないと、IOException : too many open filesが発生してしまう。

 

じゃあ、

HDFSが使用するファイルハンドル数はいくつが適性なの?

 

プロセスが使用しているファイルディスクリプタの数え方は以下の通り。

 ls -1 /proc/[pid]/fd | wc -l

/proc/[pid]/fdにはシンボリックリンクで各オープンしているファイルへのリンクが張られているようだ。

つまりこの/proc/[pid]/fd配下のファイル数を数えれば、

すなわちファイルディスクリプタの数となるわけです。

 

で、HDFSの中身をあらかじめ空っぽにした状態で、ファイル追加/参照/削除をやってみた。

構成は

 CDH3u2

 擬似分散モード

 計測対象はNameNode、DataNode

 

まず、起動直後は

 NameNode:73

 DataNode:72

の状態でした。

内容は/usr/lib/hadoop/libのjarファイルか/var/log/hadoopのログファイル、socketがほとんどでした。

一部pipeや/dev/randomとかありましたが、何でしょうね。

 

で、おなじみ

 hadoop fs -put [srcファイルパス] [dstファイルパス]

で6バイトのファイルを置いてみたのですが、3ぐらいNameNodeで増えてすぐ元に戻った。

レプリカ3だったので、

ブロック(デフォルトのまま64MB)3つ分のファイルディスクリプタを作ってクローズしたのだろうな。

 

その後10kぐらいのファイルも置いてみたのですが、同じく3ぐらいしか増えませんでした。

 

参照(cat)したらfdは一瞬DataNodeのほうで1増えて元に戻った。

 

削除(rmr)もputと同様、3増えて元に戻った。

 

結論、以下のことが予想できる。

 1.HDFSがファイル生成/削除で使用するファイルディスクリプタ数はレプリカの数だけ倍になる。

   例)レプリカ3、HDFS上1ファイル → ファイルディスクリプタ数は3使用する。

 2.HDFSのファイルサイズをブロックサイズで割った数だけ、ファイルディスクリプタ数は増える。

   例)HDFS上200MBファイルを扱う → ファイルディスクリプタ数は200/64 = 3.12... ≒ 4使用する。

     レプリカ3、HDFS上200MBファイルを削除する →ファイルディスクリプタ数は 200/64 × 3 ≒ 12使用する。

 

今回1台のマシンの中で擬似分散で動かしたけど、

きっと他のマシンとやり取りすることになっても、

自分が持っていないブロックの数だけ、socketが開くから、同じ結果になるでしょう。(※予想)

 

あとやり方が雑すぎて、

検証足りず、結論急ぎすぎだとは思うけど、大体予想できたので、

私的にもういいかな。知的好奇心は満たした。