Linux と Hadoop による分散コンピューティング

紹介とアーキテクチャー

人々は毎日、検索エンジンを使ってインターネット上にあるテラバイトをはるかに超えるデータの中から特定のコンテンツを見つけていますが、皆さんはこの検索が実際にどのように実行されているのかを考えたことがあるでしょうか。その検索を実行する 1 つの方法として、Apache の Hadoop を使用する方法があります。Hadoop は膨大な量のデータを分散操作することができるソフトウェア・フレームワークで、その 1 つの応用として、インターネットの Web ページの索引付けを並列処理するための使い方があります。Hadoop は Apache のプロジェクトであり、Yahoo!、Google、IBM などによってサポートされています。この記事では Hadoop フレームワークを紹介し、Hadoop が Linux® ベースの最も重要な分散コンピューティング・フレームワークの 1 つである理由を説明します。

Ken Mann, Software Developer, 自由职业者

Author photo - Ken MannKen Mann はデンバーの中心部に住む、組み込みソフトウェアのエンジニアです。彼はソフトウェア開発に 20 年以上の経験があり、その範囲は Fortran 77 によるシミュレーションや数値解析から有線および無線のテレコミュニケーション・アプリケーションまで広範にわたります。



M. Tim Jones, Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』(現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。また、コロラド州ロングモン所在のEmulex Corp. の顧問エンジニアでもあります。



2008年 12月 09日

Hadoop は Apache Software Foundation による Lucene の Nutch サブプロジェクトの一部として 2005年の秋に世界に紹介されました。Hadoop は、元々 Google Labs で開発された MapReduce と Google File System にヒントを得たものです。2006年の 3月、MapReduce と NDFS (Nutch Distributed File System) は分離され、Hadoop と呼ばれる独自のプロジェクトになりました。

Hadoop の最も一般的な使い方はインターネット上のコンテンツを (検索キーワードで) 分類する手段としての使い方ですが、大規模なスケーラビリティーが要求される多くの問題にも使用することができます。例えば、10TB のファイルを grep したい場合にはどうすればよいのでしょう。従来のシステムでは、この作業には恐ろしいほど長い時間がかかります。しかし Hadoop はそうした問題を想定して設計されているため、非常に効率的にこの作業を行えるのです。

前提条件

Hadoop は膨大な量のデータを分散操作することができるソフトウェア・フレームワークです。しかし Hadoop はそうした操作を、信頼性の高い、効率的でスケーラブルな方法で行います。Hadoop の信頼性が高い理由は、Hadoop がコンピューティング要素やストレージは故障するものと想定しており、処理中のデータのコピーをいくつも保持するため、故障したノードの周囲にプロセスが確実に再分散されるからです。Hadoop による処理が効率的である理由は、Hadoop が並列化の原則に基づいて動作するため、データは並列処理され、処理速度が上がるからです。また Hadoop はスケーラブルでもあるため、ペタバイトのデータを処理することもできます。さらに、Hadoop は一般的なサーバーで動作するため、誰もが高い費用をかけることなく使用することができます。ご想像のとおり、Hadoop にとって理想的なのは、Linux を実稼働プラットフォームとして Java™ 言語で作成されたフレームワークとともに使用される場合です。Hadoop 上のアプリケーションは C++ など他の言語を使って開発することができます。


Hadoop のアーキテクチャー

Hadoop はいくつかの要素から構成されています。アーキテクチャーの一番下には、Hadoop クラスター内のストレージ・ノード全体に渡ってファイルを保存する HDFS (Hadoop Distributed File System) があります。HDFS 上の MapReduce エンジンは、(この記事では) JobTracker と TaskTracker とで構成されています。


HDFS

HDFS は外部のクライアントから見ると従来の階層構造のファイルシステムのように見えます。ファイルの作成、削除、移動、リネーム等々は可能です。しかし HDFS は特殊な性質を持つため、HDFS のアーキテクチャーは特別なノードの集合として構成されています (図 1)。これらのノードは、HDFS 内でメタデータ・サービスを提供する (1 つしか存在しない) NameNode と、HDFS のストレージ・ブロックとして動作する DataNode です。NameNode は 1 つしか存在できないため、このノードは HDFS にとって問題 (単一障害点) となります。

図 1. Hadoop クラスターを単純化した図
Hadoop クラスターを単純化した図

HDFS に保存されるファイルはブロックに分割され、これらのブロックが複数のコンピューター (DataNode) に複製されます。この仕組みは従来の RAID アーキテクチャーとはまったく異なります。ブロック・サイズ (通常は 64MB) とブロックの複製数はファイルを作成する際にクライアントが決定し、すべてのファイル操作は NameNode によって制御されます。HDFS 内のすべての通信は標準的な TCP/IP プロトコルの上に階層化されています。

NameNode

NameNode は、通常は HDFS インスタンス内の 1 台のマシン上で実行されるソフトウェアの 1 つです。NameNode はファイルシステムの名前空間を管理し、外部クライアントによるアクセスを制御します。NameNode は DataNode 上に複製されたブロックへのファイルのマッピング方法を決定します。複製要素が 3 つという一般的な構成では、1 つのレプリカ・ブロックは別のレプリカ・ブロックと同じラックの別ノードに保存され、もう 1 つのコピーは別のラックのノードに保存されます。このためにはクラスターのアーキテクチャーを知っている必要があることに注意してください。

実際の I/O のトランザクションは NameNode を通過せず、DataNode とブロックとの間でのファイルのマッピングを示すメタデータのみが NameNode を通過します。外部クライアントがファイル作成リクエストを送信すると、NameNode はそのブロックの ID と、そのブロックの最初のコピーの DataNode の IP アドレスで応答します。また NameNode は、そのブロックのコピーを受信する他の特定の DataNode に対して通知を行います。

NameNode はファイルシステムの名前空間に関するすべての情報を FsImage というファイルに保存します。このファイルはすべてのトランザクションのレコード (EditLog と呼ばれます) と共に、NameNode のローカル・ファイルシステムに保存されます。また FsImage ファイルと EditLog ファイルも、ファイルの破損や NameNode のシステム自体が消失する事態に対する保護として複製されます。

DataNode

DataNode も、通常は HDFS インスタンス内の 1 台のマシン上で実行されるソフトウェアの 1 つです。Hadoop クラスターには、1 つの NameNode と、何百から何千という DataNode が含まれます。DataNode は通常、ラックの中に配置されており、ラックの中ですべてのシステムがスイッチに接続されます。Hadoop では、ラック内でノード間のネットワーク帯域幅はラック間のネットワーク帯域幅よりも高速であると想定しています。

DataNode は HDFS クライアントからの読み書きリクエストに応答します。また、NameNode から受信されるブロック作成、削除、複製のコマンドにも応答します。NameNode は 各 DataNode から送信される周期的なハートビート・メッセージを利用します。これらの各メッセージにはブロック・レポートが含まれており、NameNode はこのブロック・レポートを NameNode が持つブロック・マッピングとファイルシステムに関する他のメタデータと突き合わせて検証を行います。DataNode がハートビート・メッセージを送信できなかった場合、NameNode はそのノードで失われたブロックを再度複製するための修復アクションを実行することができます。

ファイル操作

ここまで読むと、HDFS が汎用のファイルシステムではないことが明確にわかるでしょう。HDFS はむしろ、1 度しか書き込まれない大規模なファイルにストリーミング・アクセスするために設計されています。クライアントが HDFS にファイルを書き込もうとする場合、そのプロセスでは最初にファイルをそのクライアントのローカル一時ストレージにキャッシングします。キャッシングされたデータが HDFS で要求されるブロック・サイズを超えると、ファイル作成リクエストが NameNode に送信されます。NameNode は応答として DataNode の ID と宛先ブロックをクライアントに返します。ファイル・ブロックのレプリカをホストする DataNode にも通知が行われます。クライアントがクライアント内の一時ファイルを最初の DataNode に送信し始めると、そのブロックの内容は即座にパイプライン方式でレプリカ DataNode 群にも送信されます。クライアントはまた、チェックサム・ファイルも作成し、このチェックサム・ファイルも同じ HDFS 名前空間に保存されます。最後のファイル・ブロックの送信が終わると、NameNode は (EditLog ファイルと FsImage ファイルの中にある) 永続メタデータ・ストレージに対してファイルの作成をコミットします。

Linux クラスター

Hadoop フレームワークは (開発やデバッグ用に) 単一の Linux プラットフォームに使用することもできますが、その真価は安価なサーバーで構成されるラックを使用する場合に発揮されます。これらのラックの集合によって Hadoop クラスターが構成されます。Hadoop フレームワークはクラスターのトポロジーに関する知識を利用して、どのようにしてクラスター全体にジョブやファイルを分散させるかを決定します。Hadoop ではノードは故障するものと想定しているため、個々のコンピューターや、さらにはラック全体の障害に対応するために、ネイティブの方式を採用しています


Hadoop のアプリケーション

Hadoop の最も一般的な使い方は Web 検索での使い方です。Web 検索は Hadoop ソフトウェア・フレームワークの唯一の応用というわけではありませんが、並列データ処理エンジンとしての Hadoop の強みを端的に示しています。その側面の中で最も興味深いものの 1 つが、Google による開発からヒントを得た Map and Reduce と呼ばれるプロセスです。このプロセスは索引付けとも呼ばれ、Web クローラーが取得したテキスト表現の Web ページを入力として取り込み、それらのページの中で見つかる単語の出現回数を結果としてレポートします。これを Web 検索に使用することによって、指定された検索パラメーターを基にコンテンツを識別します。

MapReduce

MapReduce アプリケーションには、最も単純なアプリケーションであっても最低限 3 つの部分が含まれています (map 関数、reduce 関数、そしてジョブ制御とファイル入出力を組み合わせる main 関数)。この 3 つに関して Hadoop にはインターフェースや抽象クラスが非常にたくさん用意されているため、Hadoop アプリケーションの開発にはデバッグ用からパフォーマンス測定用に至るまで数々のツールを使用することができます。

MapReduce そのものは大規模なデータ・セットを並列処理するためのソフトウェア・フレームワークです。MapReduce のルーツは関数型プログラミングにあり、関数型言語に見られる map/reduce 関数を正式なベースにしています。MapReduce は 2 つの操作で構成され、それぞれの操作は多くのインスタンス (数多くの map や reduce など) で構成されます。Map 関数は一連のデータをキーと値のペアのリストに変換します (ペアは入力ドメインの要素ごとに 1 つ作成されます)。Reduce 関数は Map 関数から得られるリストを入力として、その (キーと値のペアの) リストをキーに基づいて整理します (各キーに対してキーと値のペアが 1 つ作成されるようにします)。

以上の説明が何を意味するのかを示すものが次の例です。例えば入力ドメインが one small step for man, one giant leap for mankind (一人の人間にとっては小さな一歩だが、人類にとっては大きな飛躍である) だとしましょう。このドメインに対して Map 関数を実行すると、次のようなキーと値のペアのリストが得られます。

	(one, 1)  (small, 1)  (step, 1)  (for, 1)  (man, 1)
	(one, 1)  (giant, 1)  (leap, 1)  (for, 1)  (mankind, 1)

このキーと値のペアのリストに対して Reduce 関数を実行すると、次のような一連のキーと値のペアが得られます。

	(one, 2)    (small, 1)  (step, 1)     (for, 2)  (man, 1)
	(giant, 1)  (leap, 1)   (mankind, 1)

この結果は入力ドメインの中にある各単語の数を示しており、索引付けのプロセスに役立つのは明らかです。しかしここで、入力ドメインが実際には 2 つの入力ドメインから成り、第 1 の入力ドメインが one small step for man、第 2 の入力ドメインが one giant leap for mankind だと考えてみてください。それぞれの入力ドメインに Map 関数を実行し、また Reduce 関数も実行し、そして最後にキーと値のペアの 2 つのリストに対して別の Reduce 関数を実行すると、同じ結果が得られます。つまり入力ドメインに対する操作を並列化することで同じ答えが得られ、しかもずっと高速に答えを得ることができます。これが MapReduce の強力さであり、MapReduce は本質的に、いくらでもシステムを並列化することができるのです。図 2 は、この考え方をセグメント化と反復の形で表現したものです。

図 2. MapReduce プロセスの概念的な流れ
MapReduce プロセスの概念的な流れ

Hadoop に話を戻すと、Hadoop はこの機能をどのように実装しているのでしょう。MapReduce アプリケーションは、クライアントの代わりに、JobTracker と呼ばれる 1 つのマスター・システム上で開始または起動されます。JobTracker は NameNode と同じように Hadoop クラスター内に 1 つだけ存在するシステムであり、MapReduce アプリケーションを制御するジョブのみを行います。アプリケーションを送信する場合には、HDFS の中に含まれる入力ディレクトリーと出力ディレクトリーが提供されます。JobTracker はファイル・ブロックに関して持っている情報 (物理的な量と場所) を利用して、TaskTracker の従属タスクをいくつ作成するかを決定します。MapReduce アプリケーションは入力ブロックが存在するすべてのノードにコピーされます。指定されたノードの各ファイル・ブロックに対して一意に決まる従属タスクが作成されます。各 TaskTracker はステータスと完了のレポートを JobTracker に返します。図 3 はサンプル・クラスターで作業が分散されている様子を示しています。

図 3. 処理とストレージを物理的に分散する Hadoop クラスターの例
処理とストレージを物理的に分散する Hadoop クラスターの例

Hadoop のこの側面は重要です。なぜなら Hadoop はストレージを処理用の場所に移す代わりに、処理をストレージに移しているからです。こうすることでクラスター内のいくつかのノード間でスケーラブルに処理を行うことができるため、データの処理が効率的になります。


他の用途への Hadoop の応用

Hadoop は分散アプリケーションの開発用フレームワークとして驚くほど多才です。Hadoop を活用するために必要なことは、異なる角度から問題を見ることだけです。図 2 では処理がステップによる関数として行われていることを思い出してください。ここでは、あるコンポーネントによる処理の結果が他のコンポーネントで利用されています。もちろん Hadoop は開発のための万能薬ではありませんが、こうしたレンズをとおして問題を見ることができる場合には、Hadoop は適切な選択肢となるはずです。

Hadoop は非常に大規模なデータ・セットのソートや特に巨大なファイルの grep など、さまざまな問題を解決するために使われています。また Hadoop は、Amazon の A9 や Able Grape によるワイン情報の垂直検索エンジンなど、さまざまな検索エンジンのコアとしても使われています。Hadoop のウィキには Hadoop を (さまざまな異なる方法で) 使用したアプリケーションや企業を大量に記載したリストが提供されています (「参考文献」を参照)。

Yahoo! は現在、Hadoop を利用した実動の Linux システムとして最大のアーキテクチャーを持っています。このアーキテクチャーは 5 ペタバイトを超えるストレージを持つ 10,000 のコアで構成され、それが DataNode に分散されています。Yahoo! の Web 索引の中には約 1 兆のリンクがあります。しかし皆さんが抱える問題ではそれほどの規模のシステムは必要ないかもしれません。もし必要ないなら、Amazon の EC2 (Elastic Compute Cloud) を使って仮想的な 20 ノードのクラスターを作成することができます。実際、New York Times は Hadoop と EC2 を使うことによって、4TB の TIFF 画像 (40.5 万枚の巨大な TIFF 画像と 330 万本の SGML 記事、そして 40.5 万個の XML ファイルなど) を Web で使いやすい 80 万枚の PNG 画像に 36 時間で変換したのです。このプロセスはクラウド・コンピューティングとして知られていますが、Hadoop の強力さを示すユニークな例です。


まとめ

Hadoop は明らかに一層強力になりつつあり、また Hadoop を利用するアプリケーションの様子から見る限り、将来は明るいようです。独自の Hadoop クラスターをセットアップする方法を含め、Hadoop とそのアプリケーションについてさらに学ぶためには「参考文献」セクションを参照してください。

参考文献

学ぶために

  • Hadoop コアの Web サイトは Hadoop について学ぶために最適のリソースです。このサイトには、最新のドキュメントやクイックスタート・ガイド、クラスター構成のセットアップ方法の詳細、チュートリアル、その他が用意されています。また Hadoop フレームワークを利用した開発のための API (application program interface) の詳細を説明したドキュメントも用意されています。
  • Hadoop DFS User Guide では HDFS と関連コンポーネントを紹介しています。
  • Yahoo! は彼らの検索エンジン用に、最大と考えられる Hadoop クラスターの使用を 2008年の始めに開始しました。この Hadoop クラスターは 10,000 を超える処理コアから構成され、また 5 ペタバイト (500,000 ギガバイト) を超えるロー・ディスク・ストレージを提供しています。
  • Hadoop: Funny Name, Powerful Software」(LinuxInsider、2008年11月) は Hadoop に関する優れた記事であり、この中には Hadoop の作成者である Doug Cutting のインタビューも含まれています。またこの記事は New York Times が大量の画像変換用に Amazon の EC2 と共に Hadoop を使用していることにも触れています。
  • Hadoop はクラウド・コンピューティング環境で本領を発揮しています。クラウド・コンピューティングについて学ぶために、「Linux によるクラウド・コンピューティング」(developerWorks、2008年9月) を読んでください。
  • Hadoop のウィキの PoweredBy ページには、Hadoop の強力さを活用したアプリケーションの完全な一覧があります。Hadoop は検索エンジン以外にも数多くの問題領域で活用されています。
  • Michael Noll によるチュートリアル、「Running Hadoop on Ubuntu Linux (Multi-Node Cluster)」は Hadoop クラスターのセットアップ方法を解説しています。またこのチュートリアルは、単一ノードでのセットアップ方法を解説した以前のチュートリアルも参照しています。
  • developerWorks に掲載されている Tim の他の記事も読んでください。
  • developerWorks の Linux ゾーンには、他にも (Linux の初心者のための資料を含め) Linux 開発者のためのリソースが豊富に用意されています。また最も人気の高かった記事とチュートリアルの一覧もご覧ください。
  • developerWorks には他にも Linux に関するヒントチュートリアルが用意されています。
  • developerWorks technical events and webcasts で最新情報を入手してください。

製品や技術を入手するために

  • MapReduce の概念は何十年も前に関数型言語の中で最初に紹介されたものですが、プラグインの形でも見ることができます。IBM は MapReduce プログラムの作成とデプロイメントを単純化する Eclipse 用のプラグインを作成しました。
  • developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を利用して皆さんの次期 Linux 開発プロジェクトを構築してください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source, Web development
ArticleID=365777
ArticleTitle=Linux と Hadoop による分散コンピューティング
publish-date=12092008