クラウドで MapReduce を使用してロード・バランシングを行う

Hadoop の MapReduce と仮想化によってノードのパフォーマンスを改善する

クラウド環境で Hadoop の MapReduce フレームワークを実装する方法と、仮想的なロード・バランシングを使って単一ノード・システムと複数ノード・システム両方のパフォーマンスを改善する方法を学びましょう。

Kirpal A. Venkatesh, System Engineer, Global Business Services, IBM

Kirpal A. Venkatesh は IBM の Global Business Service のシステム・エンジニアであり、Microsoft 技術の実践者であり、クラウド・コンピューティング技術の熱心な採用者、革新者でもあります。



Kishorekumar Neelamegam, Systems Engineer/IT Architect, Global Business Services, IBM

Kishorekumar は IBM の Global Business Service の IT アーキテクトです。彼はソフトウェア開発に 13 年以上の経験があり、Rational プラットフォームへのソフトウェア統合を重点に業務を行ってきました。彼はクラウドに関する情熱的なエバンジェリストとして、頻繁に developerWorks に寄稿しています。彼の活動を追うために、彼の MydW プロフィールブログを見てください。



R. Revathy, Intern, IBM

R. Revathy はインドのチェンナイにある Guindy, Anna University の最終学年の学生です。



2010年 7月 19日

クラウド・コンピューティングはリソースやサービスをオンデマンドでインターネットを介して提供するように設計されており、通常、その規模や信頼性のレベルはデータ・センター並みです。一方、MapReduce は大量のデータを並列に処理するために設計されたプログラミング・モデルであり、一連の独立したタスクに処理を分割します。MapReduce は並列プログラミングの 1 つのスタイルであり、要求に応じて処理能力が変化する一部のクラウド (Google の BigTable や、Hadoop、Sector など) でサポートされています。

この記事ではロード・バランシング・アルゴリズムとして、ランダム流体ロード・バランシング (Randomized Hydrodynamic Load Balancing) 手法 (以下のセクションで説明します) によるアルゴリズムを使用します。実際の物理的なサーバーの台数とコストを削減するために仮想化を使用しますが、もっと重要な点として、仮想化を使用して物理的なマシンの CPU 使用率を改善します。

この記事を最大限に活用するためには、クラウド・コンピューティングの概念とランダム流体ロード・バランシング手法、そして Hadoop の MapReduce プログラミング・モデルに関して全般的に理解している必要があります。また、並列プログラミングに関する基本知識や、Java™ その他のオブジェクト指向言語のプログラミングに関する知識があると大いに役立ちます。

この記事では、以下のソフトウェアがインストールされたシステムで MapReduce アルゴリズムを実装しました。

  • Hadoop 0.20.1
  • Eclipse IDE 3.0 またはそれ以降のバージョン (または Rational Application Developer 7.1)
  • Ubuntu 8.2 またはそれ以降のバージョン

MapReduce アルゴリズムの説明に入る前に、クラウドのアーキテクチャー、ロード・バランシング、MapReduce、並列プログラミングの基本事項について、少なくともこの記事を読む上で十分な程度に説明しておきます。

クラウドのアーキテクチャー: 基本事項

図 1 は、システム全体、システムを構成するプラットフォーム、ソフトウェア、そしてそれらを使ってこの記事の目標を実現する仕組みを詳細に示した図です。

図 1. クラウドのアーキテクチャー
クラウドのアーキテクチャー

この図を見ると、オペレーティング・システムとして Ubuntu 9.04 と 8.2 が使われ、プラットフォームとして Hadoop 0.20.1、Eclipse 3.3.1、Sun Java 6 が、プログラミング言語として Java が、スクリプト言語として HTML、JSP、XML が使われていることがわかります。

このクラウド・アーキテクチャーにはマスター・ノードとスレーブ・ノードの両方があります。この実装では、メイン・サーバーがクライアント・リクエストを受信して、リクエストのタイプに応じた処理を行います。マスター・ノードはメイン・サーバーにあり、スレーブ・ノードはセカンダリー・サーバーにあります。

検索リクエストは、メイン・サーバーにある Hadoop の NameNode に転送されます (図 2)。そして Hadoop の NameNode は大量の Map プロセスと Reduce プロセスを開始することで、検索と索引付けの処理を行います。特定の検索キーに対する MapReduce 処理が完了すると、NameNode は出力の値をメイン・サーバーに返し、メイン・サーバーからその値がクライアントに返されます。

図 2. Map 関数と Reduce 関数によって検索と索引付けを行う
Map 関数と Reduce 関数によって検索と索引付けを行う

リクエストが特定のソフトウェアに対するものである場合には、その顧客のテナント ID、支払情報、特定のソフトウェアの使用権限の有無、そのソフトウェアのリース期間などに基づいて、認証ステップが実行されます。そしてサーバーはこのリクエストを処理し、選択された組み合わせでのソフトウェアの使用をユーザーに許可します。

ここでは、1 つのソフトウェア・インスタンスで複数のテナントに対応できるという、SaaS のマルチテナンシー機能が提供されています。テナントごとに特有のすべてのリクエストは、テナント ID に基づいて分けられることになります。これらのリクエストは 1 つのインスタンスによって処理されます。

あるテナント特有のクライアント・リクエストがファイルの検索を要求した場合、または他のマルチテナント・ソフトウェアの利用を要求した場合には、このサービスはプロビジョニングされたオペレーティング・システムのインスタンス上にある Hadoop を使います (PaaS)。また、そのテナントのデータ (例えばデータベースやファイル) をクラウドに保存するために、クライアントはデータ・センターのメモリー空間をいくらか使用する必要があります (IaaS)。こうした動作はすべて、ユーザーにはわからない形で行われます。


ランダム流体ロード・バランシング: 基本事項

ロード・バランシングの目的は、既存のリソースがどれもアイドル状態にならず、どのリソースも使用されるようにすることです。負荷分散を均一化するためには、負荷が過剰なノード (転送元ノード) から、比較的負荷の軽いノード (転送先ノード) に負荷を移動する必要があります。

実行中にロード・バランシングを適用する場合、その動作はダイナミック・ロード・バランシングと呼ばれます。ダイナミック・ロード・バランシングは実行ノードの選び方に応じて、直接的な方法でも繰り返し型の方法でも実現することができます。

  • 繰り返し型の方法では、最終的な転送先ノードは複数の繰り返しステップによって決まります。
  • 直接的な方法では、最終的な転送先ノードは 1 つのステップで選択されます。

この記事では、ランダム流体ロード・バランシング手法を使います。この手法は混成型であり、直接的な方法と繰り返し型の方法の両方の利点を活用しています。


MapReduce: 基本事項

MapReduce プログラムは大量のデータを並列方式で計算するように設計されています。そのために、大量のマシンに負荷を分割する必要があります。Hadoop には、このプログラミング方式をシステマチックな方法で実装する手段が用意されています。

この計算では、一連のキーと値のペアを入力として取り、出力として一連のキーと値のペアを生成します。この計算は Map と Reduce という 2 つの基本的な処理で構成されています。

Map 処理はユーザーによって作成され、キーと値の入力ペアを受け取り、一連の中間的なキーと値のペアを生成します。MapReduce ライブラリーにより、中間的な Key #1 に関連付けられた中間的な値がすべてグループ化され、Reduce 関数に渡されます。

Reduce 関数もユーザーによって作成され、中間的な Key #1 と、そのキーに対する一連の値を受け付けます。Reduce 関数はこれらの値をマージし、多くの場合は元の値の数よりも少ない、一連の値を出力します。通常は Reduce を呼び出すごとに、出力の値として 0 または 1 のみが生成されます。これらの中間的な値はイテレーターを介してユーザーの Reduce 関数に渡されます (イテレーターというオブジェクトを使うことで、集合を構成する全要素をトラバースすることができますが、それは集合がどのように実装されているかにはよりません)。この方式により、多すぎてメモリーに収容できないような大量の値を処理することができます。

例えば WordCount の問題を考えてみましょう。この問題では、大量の文書の中に登場する各単語の使用回数をカウントします。Map 関数である mapper と Reduce 関数である reducer はリスト 1 のようになります。

リスト 1. WordCount 問題の Map と Reduce
mapper (filename, file-contents):
  for each word in file-contents:
    emit (word, 1)

reducer (word, values):
  sum = 0
  for each value in values:
    sum = sum + value
  emit (word, sum)

Map 関数は各単語と、その単語に関連付けられたカウント値として単語の使用回数を出力します。Reduce 関数は、特定の単語に対して出力されたすべてのカウント値を合計します。この基本的な機能を複数ノード・クラスターで構築すると、簡単に高速の並列処理システムになります。

大量のデータに対する計算は従来から、通常は分散型で行われてきました。Hadoop のユニークな点は、プログラミング・モデルが単純化されており、ユーザーが分散システムを素早く作成してテストできる点と、データや処理が複数のマシンに効率的かつ自動的に分散され、各マシンの CPU コアの並列処理を活用できる点にあります。

では、もう少しわかりやすくしましょう。先ほど説明したように、Hadoop クラスターには以下のノードがあります。

  • NameNode (クラウド・マスター)
  • DataNodes (つまりスレーブ)

クラスターのノードには、ローカルの入力ファイルが事前にロードされています。MapReduce プロセスが開始されると、NameNode は JobTracker プロセスを使用し、DataNodes が実行すべきタスクを TaskTracker プロセスによって割り当てます。各 DataNode では複数の Map プロセスが実行され、中間的な結果は集約プロセスに渡され、その集約プロセスは、例えば単語の使用回数を 1 台のマシンのファイルの中に生成します (WordCount 問題の場合)。これらの値はシャッフルされて Reduce プロセスに送られ、Reduce プロセスが対象の問題に対する最終的な出力を生成します。


ロード・バランシングの使い方

ロード・バランシングは、あるノードの負荷が一定レベルを越えた場合に、負荷の軽いノード全体に負荷を均等に分散する上で有効です。ロード・バランシングは MapReduce アルゴリズムを実行する上ではそれほど重要ではありませんが、処理対象のファイルが大きい場合やハードウェア・リソースが限界まで使用されている場合には、非常に重要になります。強調すべき点として、リソースが限界まで使用されているような状況では、ロード・バランシングによってハードウェアの使用率を高め、わずかでもパフォーマンスを改善することができます。

モジュールの実装は、一部のデータ・ノードの負荷が限界に達した場合、または新しい空のノードがクラスターに加わった場合に、Hadoop Distributed File System クラスター上のディスク・スペースの使用率を均等にすることを目標に行われました。しきい値を設定してバランサー (Class Balancer ツール) を起動します。このしきい値パラメーターは 0 パーセントと 100 パーセントの間の数であり、デフォルト値は 10 パーセントです。この値によって、クラスターが均等に負荷分散されているかどうかの目標値を設定します。しきい値が小さいほど、クラスターが均等に負荷分散され、またバランサーの実行時間は長くなります (注: しきい値が小さすぎるとクラスターの負荷を均等に分散することができません。アプリケーションが並行してファイルの書き込みと削除を行っている場合があるからです)。

クラスターが均等に負荷分散されているとみなされる場合というのは、各データ・ノードに対し、そのノードで使用されているスペースとそのノードの合計容量の比 (ノードの使用率と呼ばれます)、そしてそのクラスターで使用されているスペースとそのクラスターの合計容量の比 (クラスターの使用率と呼ばれます)、この両者の差がしきい値を上回っていない場合です。

このモジュールは繰り返し操作により、非常に使用率の高いデータ・ノードから使用率の低いデータ・ノードにブロックを移動します。繰り返しごとに、各ノードはそのノードの容量のうち、しきい値を上回らないだけの容量に相当するブロックを移動するか、または受け取ります。各繰り返しの実行時間は 20 分以内です。

この実装では、各ノードは、高使用ノード、平均的使用ノード、低使用ノードのいずれかに分類されます。各ノードの使用率に応じてノード間で負荷が転送され、クラスターの負荷は均等に分散されます。このモジュールの動作は以下のとおりです。

  • まず、このモジュールは近くにあるノードの詳細情報を取得します。
    1. ある DataNode の負荷がしきい値まで増大すると、その DataNode は NameNode にリクエストを送信します。
    2. NameNode は、その特定の DataNode の最も近くにあるノードの負荷レベルに関する情報を持っています。
    3. NameNode によって負荷が比較され、近くにあるノードの中で最も負荷の軽いノードに関する詳細情報が、その特定の DataNode に送信されます。
  • 次に、各 DataNode が処理を開始します。
    1. 各 DataNode はそのノード自身の負荷の量を、そのノードに最も近いノードの負荷の合計と比較します。
    2. ある DataNode の負荷レベルが、そのノードの近くにあるノードの負荷の合計よりも大きい場合には、負荷の転送先のノード (直接隣にあるノード「および」他のノード) がランダムに選択されます。
    3. 次に負荷処理リクエストが転送先ノードに送信されます。
  • 最後に、そのリクエストが受信されます。
    1. 各ノードは受信される負荷処理リクエスト用のバッファーを持っています。
    2. このバッファーは MPI (Message Passing Interface: メッセージ・パッシング・インターフェース) によって管理されています。
    3. メイン・スレッドはバッファリングされたキューをリッスンし、受信したリクエストを処理します。
    4. 各ノードはロード・バランシングを実行するフェーズに入ります。

パフォーマンスを評価する

それぞれサイズの異なる多様な入力ファイル・セットを用意し、単一ノード・クラスターと 2 ノード・クラスターの両方で MapReduce タスクを実行しました。それぞれに対して実行時間を計測した結果、入力ファイルのサイズが大きい場合、複数ノード・クラスターで MapReduce を実行した方がはるかに効率的であるという結論に達しました。

図 3 のグラフは、さまざまなノードで実行した結果のパフォーマンスを示しています。

図 3. MapReduce によるロード・バランシングは複数ノード・クラスターで実行した方が効率が高い
MapReduce によるロード・バランシングは複数ノード・クラスターで実行した方が効率が高い

まとめ

Hadoop MapReduce とロード・バランシングに関する私達の実験から、以下の 2 つの明確な結論が得られました。

  • クラウド環境では、MapReduce 構造によって大規模なデータ・セットに対するスループットが高まります。それとは対照的に、非クラウド環境ではそうしたスループットの向上は必ずしも見られません。
  • データ・セットの規模が小さい場合には、MapReduce とロード・バランシングによってクラウド環境で大幅にスループットが高まるとは言えません。

従って、クラウド・システムで大量のデータ処理を計画する場合には、MapReduce スタイルの並列プログラミングとロード・バランシングの組み合わせを検討する必要があります。

参考文献

学ぶために

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

議論するために

  • My developerWorks の Developer Cloud グループは Smart Business Development and Test on the IBM Cloud のためのコミュニティーです。
  • 他の開発者とやり取りし、共有し、協力するための専門的ネットワークであり、総合コミュニティー・ツールでもある My developerWorks を通じ、developerWorks のコミュニティー (開発者ブログ、グループ、フォーラム、ポッドキャスト、プロファイル、ウィキ、コミュニティー・トピック) に参加してください。

コメント

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=Cloud computing, Open source, Java technology
ArticleID=512991
ArticleTitle=クラウドで MapReduce を使用してロード・バランシングを行う
publish-date=07192010