Hadoopは巨大なNFSサーバとして使用できるのか

こんにちは。

今回は「優秀なファイルシステムであるHDFSですが、現行のNFSサーバを置き換えることができるだろうか」という事について考えてみたいと思います。

 

まず、HDFSのメリットについて再確認してみます。

Hadoop – HDFSのメリット

  1. 安価に大容量のファイルシステムが構築できる。
  2. ストレージサイズの拡張が簡単に行える。
  3. 分散配置されたブロックごとに通信が発生するため、ファイルの取得・格納スピードが速い。
  4. ファイルのレプリケーションが自動で行われるため、マシントラブルによるデータ喪失が起こりにくい。
  5. データ容量と比例して計算能力を獲得できる。

 

特に注目すべきなのは 「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サーバとして扱う事は可能である!むしろメリットが大きい!」