第3回でディストリビューションとディトリビューターや製品ベンダーを詳しく説明しましたが、その後2012年6月に様々なベンダーからApache Hadoop関連製品が新たにリリースされています。

 米クラウデラは2012年6月5日(現地時間)、Apache Hadoopバージョン2をサポートしたCDH 4.0.0をリリースしました。

 同じくHadoopのディストリビューターである米ホートンワークスも2012年6月12日(現地時間)、Apache HadoopのディストリビューションHortonworks Data Platform (HDP) 1.0を、Apache Hadoop 1.0.3ベースでリリースしました。このディストリビューションには管理とモニタリングサービスを提供するコンポーネント、Apache AmbariベースのHortonworks Management Center (HMC)も付属しています。

 両社の製品戦略には明確な違いが見えます。ホートンワークスのディストリビューションは管理製品も含めて100%オープンソースなのに対して、クラウデラの管理製品は非オープンソースです。つまりクラウデラのビジネスモデルはオープンコア(オープンソースをコアとした独自ライセンス製品)です。

 さらに米ヴイエムウェアは2012年6月13日(現地時間)、仮想化環境にApache Hadoopを簡単にデプロイすることを目的としたオープンソースプロジェクト「Serengeti」を発表しました(関連記事)。これまでは「Apache Hadoop仮想化環境は商用では利用されない」とされてきましたが、さらにHadoopユーザーの製品と動作環境の選択肢は広がっていくでしょう。

 さて今回は、HadoopクラスターのHDFS(Hadoop分散ファイルシステム)について解説します。前回(第5回)でMapReduceを解説したときは、Apache Hadoopバージョン2における新機能について詳しく触れましたが、HDFSに関しては、新機能拡張(HDFSフェデレーションや高可用性HDFS)には今回は触れず、HDFSの基本アーキテクチャについて説明します。

HDFSの基本

 HDFSとは、グーグルが発表した論文「Google File System」を元にして設計され、Java言語で実装された分散ファイルシステム(Distributed File System)です。このことでもお分かりのように、HDFSは既存のファイルシステムの上位に位置するファイルシステムです。全てJava経由でファイルの読み書きが実行され、ネイティブ実装はされていません。

 Apache Hadoopでは、第5回で説明したMapReduceアプリケーションが主に動作する一方で、そのための分散ファイルシステムとしてHDFSが利用されます。

 Apache HadoopではHDFSの利用は必須ではありません。別のファイルシステムも選択できるようになっています(例えば、ローカルファイルシステムやAmazon S3など)。そうは言っても、HDFSはMapReduceを動作させる目的で開発されていますし、実際にほとんどのHadoopユーザーは、分散ファイルシステムとしてHDFSを選択しています。

 HDFSのファイル操作はhadoop fsコマンドを利用します。以下にいくつかのコマンドの利用例を示します(Hadoopバージョン2の場合)。

ディレクトリのリスト: -lsオプション
$ hadoop fs -ls
drwxr-xr-x   - ttazawa hadoop          0 2012-06-18 18:31 input
drwxr-xr-x   - ttazawa hadoop          0 2012-06-18 21:10 output
drwxr-xr-x   - ttazawa hadoop          0 2012-06-18 21:10 testdata

ディレクトリ作成: -mkdirオプション
$ hadoop fs -mkdir mydir

ファイルの書込み: -putまたは-copyFromLocalオプション
$ hadoop fs -put mtlogfile.txt mydir

ファイル内容表示: -catオプション
$ hadoop fs -cat mydir/mtlogfile.txt

ファイルの読み出し: -getまたは-copyToLocalオプション
$ hadoop fs -get mydir/mtlogfile.txt

 このように、HDFSのファイル操作方法はUnixやLinux系の操作と似ています。とはいうものの、viなどのテキストエディタでのファイル作成や、ファイル編集には対応していませんので、一般的に利用されているファイルシステムと異なることは明らかです。

 HDFSでは、比較的大きなファイル(数十メガバイト~数ギガバイト)を均等なブロックに分割して、Apache Hadoopのクラスターを構成する複数のコモディティサーバに分散格納します。このアーキテクチャで数ペタバイトの情報を格納し、運用している実績があります。読み込みは大きなファイルのストリーミングリードが基本であり、ランダムアクセスはしません。

 HDFSに適した使い方は、ファイルの書込みは一度で、その後何度も読み出すというパターンです。より具体的に言えば、企業内の膨大なデータを格納しておき、分散コンピューティングアプリケーション(MapReduceアプリケーションなど)から、分析のために都度読み出す用途に適しています。

 この点でHDFSは、HDFSのルーツでもある検索インデックスの特性に似ています。トランザクションシステムで使うリレーショナルデータベースのCRUD(生成、読取、更新、削除)処理とは明らかに異なります。

 もちろん、高価なストレージ製品の代替として、安価なコモディティサーバーを並べてデータストレージとしてHDFSを利用することも可能ですし、実際にそのようなユーザー事例もあります。しかし、レイテンシー(遅延時間)を考慮するとサイズの細かなファイルの読み書きには適していませんし、追記も現状ではAPI経由でのみしかサポートされていません。