こんにちは。
今回は「優秀なファイルシステムであるHDFSですが、現行のNFSサーバを置き換えることができるだろうか」という事について考えてみたいと思います。
まず、HDFSのメリットについて再確認してみます。
Hadoop – HDFSのメリット
- 安価に大容量のファイルシステムが構築できる。
- ストレージサイズの拡張が簡単に行える。
- 分散配置されたブロックごとに通信が発生するため、ファイルの取得・格納スピードが速い。
- ファイルのレプリケーションが自動で行われるため、マシントラブルによるデータ喪失が起こりにくい。
- データ容量と比例して計算能力を獲得できる。
特に注目すべきなのは 「5. データ容量と比例して計算能力を獲得できる」という事です。
今までのNFSサーバは、ファイルを格納するためだけのサーバというイメージが強く、またそのように使用しているユーザーが大半だと思います。
Hadoopでは、容量拡大のためにスレーブマシンを増やせば増やすほど処理性能も上がりますので、知らず知らずのうちにスーパーコンピュータ並の計算能力を得ることができているかもしれません。
良い事ばかりのように見えるHDFSですが、NFSのようにマウントして使用するには、別のシステムを一つ経由する必要があります。
そのため速度的に実用に耐えうるのかどうか、という問題点が浮上してきます。
そこで、HadoopのクラスタとNFSサーバを作成し、実際マウントして使用した時にどの程度速度に違いが出るのかを試してみたいと思います。
機材構成
Hadoopクラスタ
◇ マスターマシン × 1台
OS – CentOS 6.6
CPU – Intel(R) Core(TM)2 Duo CPU E7300 @ 2.66GHz
メモリ – 2GB
HD – 70GB
◇スレーブマシン × 8台
OS – CentOS 6.6
CPU – Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz
メモリ – 2GB
HD – 200GB
◇スイッチ
ギガビット16ポート アンマネージスイッチ(デスクトップ) GS116
NFSサーバ
OS – CentOS 6.6
CPU – Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz
メモリ – 1GB
HD – 70GB
HDFSをマウント
HDFSをマウントして使用するには、別のシステムを経由する必要があると前述しましたが、今回は「NFS V3 Gateway」を使用して検証します。
CDH5に格納されていますので、簡単にインストールが可能です。
設定方法について、詳しくは こちら をご覧ください。(Clouderaの説明ページが開きます)
以下のコマンドで /hdfs にマウントしておきます。
sudo mount -t nfs -o vers=3,proto=tcp,nolock master00.fward.net:/ /hdfs
NFSをマウント
NFSのマウント方法は今さら記載することもないと思いますので、割愛します。
以下のコマンドで /nfs にマウントしておきます。
sudo mount -t nfs nfs.fward.net:/home /nfs
速度検証
検証に使用したファイルサイズは10MB、100MB、1GBの三種類。
以下のコマンドを使用して、NFSとHDFSの速度比較を行います
書き込み :
time dd if=/dev/zero of=/nfs/writefile10 bs=1024k count=10
読み込み :
time dd if=/nfs/writefile10 of=/dev/null bs=1024k
検証結果
10MB~1GBまでを三回ずつ読み書きした平均を出しました。
CentOSのページキャッシュ有
一回目
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.110 | 0.008 | 0.456 | 0.008 |
100MB | 1.025 | 0.042 | 3.021 | 0.043 |
1GB | 21.815 | 38.825 | 54.159 | 37.207 |
二回目
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.117 | 0.008 | 0.398 | 0.008 |
100MB | 1.035 | 0.042 | 6.198 | 0.042 |
1GB | 21.484 | 40.380 | 44.499 | 31.170 |
三回目
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.268 | 0.008 | 0.589 | 0.008 |
100MB | 1.030 | 0.044 | 2.980 | 0.043 |
1GB | 21.399 | 39.334 | 49.120 | 30.562 |
平均
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.165 | 0.008 | 0.589 | 0.008 |
100MB | 1.030 | 0.043 | 4.066 | 0.043 |
1GB | 21.566 | 39.513 | 49.259 | 32.980 |
(単位:秒)
CentOSのページキャッシュ無
一回目
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.214 | 0.540 | 0.506 | 1.196 |
100MB | 1.028 | 3.910 | 6.266 | 3.134 |
1GB | 22.644 | 33.092 | 50.090 | 34.382 |
二回目
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.211 | 0.757 | 0.523 | 0.866 |
100MB | 1.031 | 2.540 | 6.158 | 2.133 |
1GB | 22.621 | 35.291 | 58.997 | 22.780 |
三回目
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.210 | 0.698 | 0.389 | 0.572 |
100MB | 1.028 | 3.106 | 6.166 | 4.419 |
1GB | 23.524 | 27.818 | 57.664 | 34.998 |
平均
NFS | HDFS | |||
write | read | write | read | |
10MB | 0.212 | 0.665 | 0.473 | 0.878 |
100MB | 1.029 | 3.185 | 6.197 | 3.229 |
1GB | 22.930 | 32.067 | 55.584 | 30.720 |
(単位:秒)
まとめ
今回の検証では、NFSよりもHDFSの方が2.5倍ほど書き込みに時間が掛かる事がわかりました。恐らく複数ノードへデータをコピーする必要があるために遅延が発生していると思われます。
そのため、大量にある小さいサイズのファイルを頻繁に読み書きするような目的に使用する事は難しいのではないでしょうか。小さいサイズのデータはHDFSへ直接配置するのではなく、HadoopのエコシステムであるHBaseを利用する事がread, writeの処理時間的にも望ましいように思います。株式会社サイバーエージェント社が運用しているAmebaでは、ユーザー毎のデータを保持するために、HBaseを利用しているようです。
大きいファイルの読み込み時間はNFSと同等か、それ以上の性能を示しました。Hadoopクラスタ自体の性能を上げたり、スレーブマシンを増やしたりすればもっと読み込み時間を早くすることが可能です。
それを踏まえた結論としまして、以下のようにまとめたいと思います。
「大容量であり頻繁に更新が発生しないファイル(過去データ等)を扱う上では、HDFSを巨大なNFSサーバとして扱う事は可能である!むしろメリットが大きい!」