Hadoop のコモディティはローエンドという意味ではない

Hadoop に関するよくある勘違いの一つとして、「古いマシンを有効活用できる」というものがあります。
その根拠となるのが、公式サイトを含めあちこちで書かれる「コモディティサーバの上で動く」という一文です。

The Hadoop Distributed File System (HDFS) is a distributed file system designed to run on commodity hardware.

404 Not Found


しかし Hadoop本9章などにも書かれている通り、コモディティサーバとはローエンドサーバという意味ではありません。
あくまで「複数のベンダから入手可能なサーバ」という意味であって、決して安いサーバを意味しているわけではないのです。
メモリだけあれば古いマシンが蘇る memcached とかとは訳が違います。


例えば2010年3月時点でのClouderaの推奨スペックを見ると、以下のようになっています。

CPU 2-2.5GHz クアッドコア×2
メモリ 16-24GB
ディスク 1TB×4
ネットワーク Gbit


退役した古いマシンを再利用など到底できないことがわかります。
また、FaceBook で稼働している Hadoop クラスタのノードも結構なスペックです。
Facebook の Dhruba Borthakur が書いた記事によると、以下のようなスペックだそうです。

CPU 8-16コア
メモリ 32GB
ディスク 12-24TB


これが2000台動いているというのですから、「安いマシン並べてお金をかけずに……」なんていうのが夢物語だということがわかります。


そもそも、Hadoopがデフォルトでどのくらいメモリを使うのかもあまり知られてません。
Hadoop本9章にはデフォルトの消費メモリが以下のように書かれています。

マスター(NameNode,SecondaryNameNode,JobTracker) 3GB
ワーカー(DataNode,TaskTracker) 2.8GB


これらは全て java の -Xmx で割り当てられた量なので実際には起動後いきなりここまで消費することはありませんが、メモリが足りないと簡単にswapするでしょう。
ただし、大規模クラスタを想定すればマスターで動いてるサービスは別サーバにするので、データ量がPBクラスになるまではメモリに関してそこまで気にする必要はないと思います。
(データセット1PBあたり NameNode のメモリは大体1GB必要と言われています。この辺の話はYahoo!の調査記事を参照のこと)


「じゃあ割り当てメモリ減らせばいい」と思うかもしれません。
確かにそれでも動きます。ちんまい処理だったらそれくらいのメモリ量でも処理は可能です。(手元の環境では割り当てメモリ100MBとかでも動いた)
おそらく実行時間を見たらHadoopなんて使うのやめたくなるでしょうが。


というわけで、まともに Hadoop クラスタを組もうと思ったら決して安くないので、月に1回とか年に数回の処理とかだったら EC2 並べて処理させた方がいいんじゃないかと思います。
ただし真面目にコスト比較したわけじゃないので具体的なコストパフォーマンスの違いについてはわかりません。


Hadoop

Hadoop