4. HDFS(Hadoop Distributed File System)のアーキテクチャ
この章は「The Hadoop Distributed File System: Architecture and Design」を噛み砕いた内容となっています。また、このHFDSのアーキテクチャはGoogleFileSystemの学術論文に基づいています。興味のある方はぜひ参照してみてください。
HDFSは大規模なファイルを非常に効率よく、そして安全に保存するための分散ファイルシステムです。大規模なデータを保持するためには大量のマシンが必要となります。しかし、マシンが増えてくるとその分故障する確率も増えてきます。例えばマシンが3年に1回壊れるとしましょう。10000台あると、1日に10台ずつ壊れていく計算になります。そのため、最初から故障を前提としたファイルシステムを構築する必要があります。
HDFSは、MapReduceと組み合わさることで効力を発揮します。データを保持しているマシン上で計算プログラムを走らせることによって、計算に必要なデータをネットワークを介して転送する必要が無くなります。またローカルで計算を始められない状況でも、計算プログラムに一番近いマシン(IPによって決定される)から入力データを取ってくることにより、通信が最適化されます。
図11はHDFSのアーキテクチャを表しています。HDFSはNameNodeとDataNodeという2つのサーバーで構成されます。Nodeという名前がついていますが、実質的にはサーバーなので同じマシン上で起動していてもかまいません。先ほど1台で動かしたときは、NameNodeもDataNodeも同じマシン上で起動していました。HDFSクライアントはこれら2つのサーバーに接続し、通信することでファイル操作が行えるようになっています。

DataNodeは実際のデータを保持するサーバーです。HDFSではファイルはブロックという固定サイズの単位に分割されます(デフォルトは64M)。DataNodeではブロック単位でハードディスクにデータが保存されます。
NameNodeはファイルシステムのメタデータ(ディレクトリ構造やファイルのアクセス権など)を管理するサーバーです。またブロック情報も管理しています。つまり、あるファイルがどのようなブロックに分かれているか、そしてそれらのブロックがどのDataNodeで保持されているかを管理しています。
クライアントがファイルを読み込むときは、まずファイル名をNameNodeに渡します。アクセス権限がある場合は、そのファイルを構成するブロックを保持しているDataNodeの位置を取得することができます。それに基づいて各自DataNodeに接続し、データを読み込みます。
また安全性という面では、複数のDataNodeに同じブロックを保持させるレプリケーションという機能があります。先ほど設定した「hadoop-site.xml」にmapred.submit.replicationという値がありましたが、これを3にすると、少なくとも3つのDataNodeに同じブロックを置くように管理してくれます。
DataNodeが故障してシステム内のブロックの個数が1つや2つになった場合は、すぐさま他のDataNodeにブロックが転送されます。これによりすべてのブロックが消失してしまう事態を防ぎます。
ディスクが足りなくなってきたら、全体を止めることなく動的にDataNodeを追加することもできます。
