(57)【特許請求の範囲】
【請求項１】
MapReduce処理におけるデータ処理制御方法を実行するコンピュータが、
前記MapReduce処理の処理対象である入力データをサンプリングして得られた各キーの出現数に基づく割当てルールを生成し、
前記割当てルールに含まれる各キー用のタスクとして、Map処理の結果を用いて実行される各第１のReduceタスクを割当て、前記割当てルールに含まれないキー用または事前に取得したキーごとの入力データ量が最も少ないキー用のタスクとして、第２のReduceタスクを割り当て、
前記第２のReduceタスクが前記各第１のReduceタスクのいずれよりも後に開始されるように、前記入力データが割り当てられた前記各第１のReduceタスクおよび前記第２のReduceタスクを、前記MapReduce処理におけるReduce処理を実行するサーバに割り当てる
処理を含んだことを特徴とするデータ処理制御方法。
【請求項２】
前記割り当てる処理は、前記入力データ量が大きい順に実行されるように、前記各第１のReduceタスクおよび前記第２のReduceタスクの属性を設定することを特徴とする請求項１に記載のデータ処理制御方法。
【請求項３】
MapReduce処理を実行するコンピュータが、
前記MapReduce処理の処理対象である入力データをサンプリングして得られた各キーの出現数に基づく割当てルールを生成し、
前記割当てルールに含まれる各キー用のタスクとして、Map処理の結果を用いて実行される各第１のReduceタスクを割当て、前記割当てルールに含まれないキー用または事前に取得したキーごとの入力データ量が最も少ないキー用のタスクとして、第２のReduceタスクを割り当て、
前記第２のReduceタスクが前記各第１のReduceタスクのいずれよりも後に開始されるように、前記入力データが割り当てられた前記各第１のReduceタスクおよび前記第２のReduceタスクを、前記MapReduce処理におけるReduce処理を実行するサーバに割り当てる
処理を実行させることを特徴とするデータ処理制御プログラム。
【請求項４】
MapReduce処理を実行するデータ処理制御装置において、
前記MapReduce処理の処理対象である入力データをサンプリングして得られた各キーの出現数に基づく割当てルールを生成し、前記割当てルールに含まれる各キー用のタスクとして、Map処理の結果を用いて実行される各第１のReduceタスクを割当て、前記割当てルールに含まれないキー用または事前に取得したキーごとの入力データ量が最も少ないキー用のタスクとして、第２のReduceタスクを割り当てる第１割当部と、
前記第２のReduceタスクが前記各第１のReduceタスクのいずれよりも後に開始されるように、前記第１割当部によって前記入力データが割り当てられた前記各第１のReduceタスクおよび前記第２のReduceタスクを、前記MapReduce処理におけるReduce処理を実行するサーバに割り当てる第２割当部と
を有することを特徴とするデータ処理制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理制御方法、データ処理制御プログラムおよびデータ処理制御装置に関する。
【背景技術】
【０００２】
クラウドコンピューティングの普及に伴い、クラウド上に保存される大量のデータを複数のサーバで分散して処理を実行する分散処理システムが利用されている。分散処理システムとしては、HDFS（Hadoop  Distributed  File  System）とMapReduce処理とを基盤技術とするHadoop（登録商標）が知られている。
【０００３】
HDFSは、複数のサーバにデータを分散格納するファイルシステムである。MapReduceは、HDFS上のデータをタスクと呼ばれる単位で分散処理する仕組みであり、Map処理、Shuffleソート処理、Reduce処理を実行する。
【０００４】
MapReduceによる分散処理においては、複数のスレーブノードにMap処理やReduce処理のタスクが割り当てられて、各スレーブノードで分散して処理が実行される。例えば、マスタサーバが、複数のスレーブノードに対してMap処理のタスクを割り当てて、各スレーブノードが、割り当てられたMapタスクを実行する。各スレーブノードで実行されるPatitionerは、Mapタスクの中で、キーのハッシュ値を計算し、その計算で得られた値によって振分先のReduceタスクを決定する。
【０００５】
このようにスレーブノードに対するReduceタスクの割り当ては、ハッシュ関数等を用いることにより均等に行われるが、各Reduceタスクに対応する処理量は、Reduceタスクに対応するキー等に関連づけられたReduce対象のデータ量等により均等になるとは限らない。
【０００６】
例えば、各スレーブノードに振分キーが均等に振り分けられたとしても、Reduceタスクごとに処理量が異なる。つまり、Reduceタスクで処理する単位、すなわちReduceスロット間で処理時間が相違し、全体の処理時間が延びる場合がある。このように、各スレーブノードでの処理完了時間が異なるので、複数タスクからなるジョブ全体の完了が最も処理の遅いスレーブノードの処理完了に左右される。
【０００７】
このため、各スレーブノードに割り当てるReduceタスクを調整する技術として、例えば、入力データのサンプリング等によりキーの出現数を調査し、処理量の異なるReduceタスクを事前に割り当てる技術が知られている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２０１２−１９００７８号公報
【特許文献２】国際公開第２０１０／１１４００６号
【特許文献３】特開２０１３−２３５５１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、サンプリング等によりキーの出現数が既知であり、Reduceタスクの事前割り当てが適切であっても、キーに対応するデータをReduceタスクで処理する際の処理時間が種々の要因により相違する場合がある。この場合、Reduceスロット間で処理時間が相違し、全体の処理時間が延びる状況が生じる。
【００１０】
また、入力データの調査時間を短縮するために、サンプリングや過去のデータの利用によるキーの出現数の推測を行う場合、推測から生じる偏りや推測時には含まれないキーに対する対応により、処理時間が延びる状況が生じる。
【００１１】
１つの側面では、処理時間を短縮することができるデータ処理制御方法、データ処理制御プログラムおよびデータ処理制御装置を提供することを目的とする。
【課題を解決するための手段】
【００１２】
第１の案では、データ処理制御装置は、MapReduce処理におけるデータ処理制御方法を実行する。データ処理制御装置は、Map処理の結果を用いて実行される第１のReduceタスクおよび第２のReduceタスクに入力データを割り当てる際に、前記第１のReduceタスクのいずれよりも少ない量の入力データを前記第２のReduceタスクに割り当てる。データ処理制御装置は、前記第２のReduceタスクが前記第１のReduceタスクのいずれよりも後に開始されるように、前記入力データが割り当てられた前記第１のReduceタスクおよび前記第２のReduceタスクを、前記MapReduce処理におけるReduce処理を実行するサーバに割り当てる。
【発明の効果】
【００１３】
１つの側面では、処理時間を短縮することができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施例１に係る分散処理システムの全体構成例を示す図である。
【図２】図２は、Hadoopの仕組みを説明する図である。
【図３】図３は、Map処理を説明する図である。
【図４】図４は、Shuffle処理を説明する図である。
【図５】図５は、Reduce処理を説明する図である。
【図６】図６は、管理サーバの機能構成を示す機能ブロック図である。
【図７】図７は、サンプリング結果テーブルに記憶される情報の例を示す図である。
【図８】図８は、パーティションテーブルに記憶される情報の例を示す図である。
【図９】図９は、マスタノードの機能構成を示す機能ブロック図である。
【図１０】図１０は、ジョブリストＤＢに記憶される情報の例を示す図である。
【図１１】図１１は、タスクリストＤＢに記憶される情報の例を示す図である。
【図１２】図１２は、スレーブノードの機能構成を示す機能ブロック図である。
【図１３】図１３は、割当確定テーブルに記憶される情報の例を示す図である。
【図１４】図１４は、パーティションテーブルの生成処理の流れを示すフローチャートである。
【図１５】図１５は、キーの振分け先のReduceタスクを決定する処理の流れを示すフローチャートである。
【図１６】図１６は、マスタノードが実行する処理の流れを示すフローチャートである。
【図１７】図１７は、スレーブノードが実行する処理の流れを示すフローチャートである。
【図１８】図１８は、Map処理の流れを示すフローチャートである。
【図１９】図１９は、Reduceタスクの割当による処理時間の短縮例を説明する図である。
【図２０】図２０は、Reduceタスクのデータ転送の短縮例を説明する図である。
【図２１】図２１は、装置のハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１５】
以下に、本願の開示するデータ処理制御方法、データ処理制御プログラムおよびデータ処理制御装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。各実施例は、矛盾のない範囲内で適宜組み合わせることができる。
【実施例１】
【００１６】
［全体構成］
図１は、実施例１に係る分散処理システムの全体構成例を示す図である。図１に示すように、この分散処理システムは、マスタノード３０、複数のスレーブノード５０がネットワーク１を介して互いに通信可能に接続される。
【００１７】
この分散処理システムでは、Hadoop（登録商標）などの分散処理フレームワークを使用した分散処理アプリケーションが各サーバで実行されており、データ基盤としてＨＤＦＳなどを使用する。
【００１８】
マスタノード３０は、分散処理システムを統括的に管理するサーバであり、MapReduce処理におけるジョブトラッカーとして機能する。例えば、マスタノード３０は、メタ情報などを用いて、どのデータがいずれのスレーブノード５０に格納されているのかを特定する。また、マスタノード３０は、各スレーブノード５０に割当てるタスクやジョブなどを管理し、Map処理やReduce処理などのタスクをスレーブノード５０に割当てる。
【００１９】
このマスタノード３０には管理サーバ１０が接続される。管理サーバ１０は、Redcuceタスクの割当に関するルール等を生成して、各ノードに配布するサーバである。ここでは、管理サーバ１０がマスタノード３０に接続される例を説明するが、これに限定されるものではなく、管理サーバ１０はいずれかのスレーブノード５０に接続されていてもよく、各ノードに接続されていてもよい。また、管理サーバ１０の機能をマスタノード３０やスレーブノード５０が有していてもよい。
【００２０】
各スレーブノード５０は、Map処理およびReduce処理を実行するサーバであり、MapReduce処理におけるデータノードやタスクトラッカー、ジョブクライアントとして機能する。また、各スレーブノード５０は、マスタノード３０によって割り当てられたMapタスクを実行し、Mapタスクの中でキーのハッシュ値を計算し、その計算で得られた値によって振分先のReduceタスクを決定する。その後、各スレーブノード５０は、マスタノード３０に割り当てられたReduceタスクを実行する。
【００２１】
ここで、各スレーブノード５０が実行するMapタスク、Reduceタスクについて説明する。図２は、Hadoopの仕組みを説明する図である。
【００２２】
図２に示すように、MapReduce処理は、MapタスクとReduceタスクから構成されMapタスクは、Map処理から構成され、ReduceタスクはShuffle処理とReduce処理とから構成される。マスタノード３０は、MapタスクキューとReduceタスクキューを有し、スレーブノード５０に対して、MapタスクやReduceタスクの割り当てを行う。
【００２３】
各スレーブノード５０は、少なくとも１つのMapスロットと少なくとも１つのReduceスロットを有する。各スレーブノード５０は、１つのMapスロット内でMapアプリとPartitonerを実行する。Mapアプリは、ユーザが所望する処理を実行するアプリケーションであり、Partitonerは、Mapアプリの実行結果によって振分先のReduceタスクを決定する。
【００２４】
さらに、各スレーブノード５０は、１つのReduceスロット内でSort処理とReduceアプリとを実行する。Sort処理は、割り当てられたReduceタスクに使用するデータを各スレーブノード５０から取得してソートし、ソートした結果をReduceアプリに入力する。Reduceアプリは、ユーザが所望する処理を実行するアプリケーションである。このようにして各スレーブノード５０が実行した結果を収集して出力結果が得られる。
【００２５】
ここで、Map処理、Shffule処理、Reduce処理の一例を説明する。なお、ここで示す処理や入力データはあくまで一例であり、処理を限定するものではない。
【００２６】
（Map処理）
図３は、Map処理を説明する図である。図３に示すように、各スレーブノード５０は、入力データとして「Hello  Apple！」と「Apple  is  red」を受信し、それぞれの入力データに対してMap処理を実行して、「キー、Value」のペアを出力する。
【００２７】
図３の例では、スレーブノード５０は、「Hello  Apple！」に対してMap処理を実行して、入力データの各要素の数を計数し、要素を「キー」、計数結果を「Value」とする「キー、Value」のペアを出力する。具体的には、スレーブノード５０は、入力データ「Hello  Apple！」から「Hello、1」、「Apple、1」、「！、1」を生成する。同様に、スレーブノード５０は、入力データ「Apple  is  red」から「Apple、1」、「is、1」、「red、1」を生成する。
【００２８】
（Shuffle処理）
図４は、Shuffle処理を説明する図である。図４に示すように、各スレーブノード５０は、各スレーブノードからMap処理結果を取得してShuffle処理を実行する。
【００２９】
図４の例では、スレーブノード（Ａ）、（Ｂ）、（Ｃ）・・・が同じジョブ（例えば、JobID＝20）に属するMap処理タスクを実行し、スレーブノード（Ｄ）と（Ｚ）とが、JobID＝20に属するReduce処理タスクを実行する。
【００３０】
例えば、スレーブノード（Ａ）がMap処理１を実行して「Apple、1」、「is、3」を生成し、スレーブノード（Ｂ）がMap処理２を実行して「Apple、2」、「Hello、4」を生成し、スレーブノード（Ｃ）がMap処理３を実行して「Hello、3」、「red、5」を生成する。スレーブノード（Ｘ）がMap処理１０００を実行して「Hello、1000」、「is、1002」を生成する。
【００３１】
続いて、スレーブノード（Ｄ）およびスレーブノード（Ｚ）は、割当てられたReduceタスクで使用する各スレーブノードのMap処理結果を取得して、ソートおよびマージを実行する。具体的には、スレーブノード（Ｄ）には、「Apple」と「Hello」についてのReduceタスクが割当てられて、スレーブノード（Ｚ）には、「is」と「red」についてのReduceタスクが割当てられたとする。
【００３２】
この場合、スレーブノード（Ｄ）は、スレーブノード（Ａ）からMap処理１の結果「Apple、1」を取得し、スレーブノード（Ｂ）からMap処理２の結果「Apple、2」および「Hello、4」を取得する。また、スレーブノード（Ｄ）は、スレーブノード（Ｃ）からMap処理３の結果「Hello、3」を取得し、スレーブノード（Ｘ）からMap処理１０００の結果「Hello、1000」を取得する。そして、スレーブノード（Ｄ）は、これらの結果をソートおよびマージして、「Apple、［1,2］」および「Hello、［3,4,1000］」を生成する。
【００３３】
同様に、スレーブノード（Ｚ）は、スレーブノード（Ａ）からMap処理１の結果「is、3」を取得し、スレーブノード（Ｃ）からMap処理３の結果「red、5」を取得し、スレーブノード（Ｘ）からMap処理１０００の結果「is、1002」を取得する。そして、スレーブノード（Ｚ）は、これらの結果をソートおよびマージして、「is、［3,1002］」および「red、［5］」を生成する。
【００３４】
（Reduce処理）
次に、スレーブノード５０が実行するReduce処理について説明する。図５は、Reduce処理を説明する図である。図５に示すように、各スレーブノード５０は、各スレーブノードのMap処理結果から生成したShuffle結果を用いて、Reduce処理を実行する。具体的には、Shuffle処理の説明と同様、スレーブノード（Ｄ）には、「Apple」と「Hello」についてのReduce処理タスクが割当てられて、スレーブノード（Ｚ）には、「is」と「red」についてのReduce処理タスクが割当てられたとする。
【００３５】
この例では、スレーブノード（Ｄ）は、Shuffle処理の結果である「Apple、［1,2］」および「Hello、［3,4,1000］」から値を合算し、Reduce処理結果として「Apple、3」および「Hello、1007」を生成する。同様に、スレーブノード（Ｚ）は、Shuffle処理の結果である「is、［3,1002］」および「red、［5］」から値を合算し、Reduce処理結果として「is、1005」および「red、5」を生成する。
【００３６】
このような状態において、管理サーバ１０は、Map処理の結果を用いて実行される通常のReduceタスクおよびスペアReduceタスクに入力データを割り当てる際に、通常のReduceタスクのいずれよりも少ない量の入力データをスペアReduceタスクに割り当てる。マスタノード３０は、スペアReduceタスクが通常のReduceタスクのいずれよりも後に開始されるように、入力データが割り当てられた通常のReduceタスクおよびスペアReduceタスクを、MapReduce処理におけるReduce処理を実行するスレーブノード５０に割り当てる。
【００３７】
したがって、実施例１に係る分散処理システムは、スペアのReduceタスクを設け、出現数の少ないキーやサンプルに含まれなかったキーを割り当て、通常のReduceタスクよりも後に処理を実行させる。この結果、各タスクの実行時間が平準化され、処理を短縮できる。
【００３８】
［管理サーバの機能構成］
図６は、管理サーバの機能構成を示す機能ブロック図である。図６に示すように、管理サーバ１０は、通信制御部１１、記憶部１２、制御部１５を有する。
【００３９】
通信制御部１１は、マスタノード３０との通信を制御する処理部であり、例えばネットワークインタフェースカードなどである。この通信制御部１１は、制御部１５によって生成された割当てルールなどをマスタノード３０に送信する。
【００４０】
記憶部１２は、制御部１５が実行するプログラムや各種データを記憶する記憶部であり、例えばハードディスクやメモリなどである。この記憶部１２は、サンプリング結果テーブル１３とパーティションテーブル１４を記憶する。なお、本実施例において、管理サーバ１０は、Reduceタスクとして５つ設定可能であり、そのうち１つをスペアReduceタスクに設定することを示す情報を記憶部１２等に予め記憶する。なお、この情報は、各スレーブノード５０のPartitionerが最低限保持していればよい。
【００４１】
サンプリング結果テーブル１３は、入力データにおけるキーの出現数のサンプリング結果を記憶する。図７は、サンプリング結果テーブルに記憶される情報の例を示す図である。図７に示すように、サンプリング結果テーブル１３は、「主キー、出現数」を対応付けて記憶する。
【００４２】
ここで記憶される「主キー」は、入力データに含まれるキーを特定する情報であり、「出現数」は、当該主キーが入力データに登場する数である。図７は、入力データをサンプリングした結果、Ａ銀行が１００回、Ｂ銀行が８０回、Ｃ銀行が６０回、Ｄ銀行が３０回、Ｅ銀行が２０回登場したことを示す。
【００４３】
パーティションテーブル１４は、Reduceタスクの振分先に関する情報を記憶する。図８は、パーティションテーブルに記憶される情報の例を示す図である。図８に示すように、パーティションテーブル１４は、「ReduceID、処理するキー、合計件数」を対応付けて記憶する。ここで記憶される「ReduceID」は、主キーを処理するReduceタスクを特定する情報であり、合計件数が多い順に割り与えられる。「処理するキー」は、Reduceタスクで処理対象となるキーであり、「合計件数」は、サンプリング結果で得られたキーの出現数である。
【００４４】
図８の例では、ReduceID＝０のReduceタスクには、サンプリング時に合計件数が１００件であったキー（Ａ銀行）が割り与えられ、ReduceID＝１のReduceタスクには、サンプリング時に合計件数が８０件であったキー（Ｂ銀行）が割り与えられたことを示す。同様に、ReduceID＝２のReduceタスクには、サンプリング時に合計件数が６０件であったキー（Ｃ銀行）が割り与えられ、ReduceID＝３のReduceタスクには、サンプリング時に合計件数が３０件と２０件であったキー（Ｄ銀行とＥ銀行）が割り与えられたことを示す。
【００４５】
制御部１５は、管理サーバ１０全体の処理を司る処理部であり、例えばプロセッサなどである。この制御部１５は、サンプリング実行部１６、実行数取得部１７、割合決定部１８、タスク決定部１９、テーブル配布部２０を有する。なお、サンプリング実行部１６、実行数取得部１７、割合決定部１８、タスク決定部１９、テーブル配布部２０は、プロセッサが有する電子回路の一例やプロセッサが実行するプロセスの一例である。
【００４６】
サンプリング実行部１６は、入力データをサンプリングしてキーの出現数を調査する処理部である。具体的には、サンプリング実行部１６は、入力データの所定数を参照して、登場するキーおよび当該キーの出現数を取得して、サンプリング結果テーブル１３に格納する。なお、サンプリングするタイミングは、例えばMap処理の開始前でもよく、Map処理において入力データの読み出しが実行されるタイミングでもよく、任意に設定できる。
【００４７】
実行数取得部１７は、実行環境の並列実行数を取得する処理部である。具体的には、実行数取得部１７は、各スレーブノード５０から、各スレーブノード５０に予め設定されているReduceスロットの数を取得する。
【００４８】
割合決定部１８は、スペアReduceタスクを除くReduceタスクに割り当てるキーの割合を決定する処理部である。具体的には、割合決定部１８は、サンプリング結果テーブル１３に記憶される主キー情報、実行数取得部１７によって取得された並列実行数、並列実行可能なReduceタスクの数等を用いて、Reduceタスクに詰め合わせるキーの割合を決定する。
【００４９】
例えば、割合決定部１８は、BinPackingなどのアルゴリズムが対象とするキーの割合を、主キーの数がReduceタスクの数以下の場合は割合（rate）＝０．９９とし、主キーの数がReduceタスクよりも多い場合は割合（rate）＝１−１／Reduceタスク数とする。
【００５０】
一例として、図７のサンプリング結果、Reduceタスクが５つ（１つはスペアReduceタスク）を例にして説明する。この場合、割合決定部１８は、図７の主キーが５個であり、通常のReduceタスクが４つであることから、「割合（rate）＝１−１／通常のReduceタスク数＝０．７５」と算出する。なお、主キーが５個であり、Reduceタスクが５つ以上である場合、割合決定部１８は、「割合（rate）＝０．９９」と決定する。
【００５１】
また、割合決定部１８は、例えば主キーの種類数が並列実行数よりも少ない場合もしくは主キーの種類数が並列実行数以下の場合は、割合を０．９９に設定し、主キーの種類数が並列実行数よりも多い場合は、上記処理を実行することもできる。
【００５２】
タスク決定部１９は、割合決定部１８によって割合を用いて、Reduceタスクにキーを割り当てる処理部である。具体的には、タスク決定部１９は、まず、Reduceタスクに割り当てる件数の閾値を算出し、次に、各Reduceタスクへのキーの割当ルールを作成する。
【００５３】
例えば、図７のサンプリング結果、通常のReduceタスクが４つ、割合（rate）が０．９９とした例で説明する。まず、タスク決定部１９は、サンプリング結果の主キーの合計である「totalRecord」を「２９０」と算出し、totalRecord（２９０）×割合（０．９）＝２６１を閾値として算出する。
【００５４】
次に、タスク決定部１９は、Reduceタスクが４つあることから、ReduceID＝０、１、２、３に設定する。そして、タスク決定部１９は、割当てられた合計件数が最小でReduceIDの値が最小であるReduceID＝０のタスクに、最も件数の多いキー（Ａ銀行）を割り当て、「ReduceID、処理するキー、合計件数」＝「０、Ａ銀行、１００」を設定する。
【００５５】
続いて、タスク決定部１９は、割り当て済み合計件数が１００であり、閾値２６１を超えていないことから割当てを続行し、例えば割り当て済み合計件数が２６１以上である場合、割当てを終了する。具体的には、タスク決定部１９は、割当てられた合計件数が最小でReduceIDの値が最小であるReduceID＝１のタスクに、未割当のキーのうち最も件数の多いキー（Ｂ銀行）を割り当て、「ReduceID、処理するキー、合計件数」＝「１、Ｂ銀行、８０」を設定する。
【００５６】
同様に、タスク決定部１９は、ここまでの割り当て済み合計件数が１８０であり、閾値２６１を超えていないことから、割当てを続行する。具体的には、タスク決定部１９は、割当てられた合計件数が最小でReduceIDの値が最小であるReduceID＝２のタスクに、未割当のキーのうち最も件数の多いキー（Ｃ銀行）を割り当て、「ReduceID、処理するキー、合計件数」＝「２、Ｃ銀行、６０」を設定する。
【００５７】
同様に、タスク決定部１９は、ここまでの割り当て済み合計件数が２４０であり、閾値２６１を超えていないことから、割当てを続行する。具体的には、タスク決定部１９は、割当てられた合計件数が最小でReduceIDの値が最小であるReduceID＝３のタスクに、未割当のキーのうち最も件数の多いキー（Ｄ銀行）を割り当て、「ReduceID、処理するキー、合計件数」＝「３、Ｄ銀行、３０」を設定する。
【００５８】
同様に、タスク決定部１９は、ここまでの割り当て済み合計件数が２６０であり、閾値２６１を超えていないことから、割当てを続行する。具体的には、タスク決定部１９は、割当てられた合計件数が最小でReduceIDの値が最小であるReduceID＝３のタスクに、未割当のキー（Ｅ銀行）を割り当てる。そして、タスク決定部１９は、「ReduceID、処理するキー、合計件数」＝「３、Ｅ銀行、２０」を追加し、「ReduceID、処理するキー、合計件数」＝「３、Ｄ銀行＋Ｅ銀行、５０（３０＋２０）」と設定する。
【００５９】
ここで、タスク決定部１９は、ここまでの割り当て済み合計件数が２８０であり、閾値２６１を超えたことから、割当てを終了する。このようにして、タスク決定部１９は、Reduceタスクの割当ルールとして、図８に示したパーティションテーブル１４を生成することができる。
【００６０】
テーブル配布部２０は、パーティションテーブル１４をマスタノード３０に配布する処理部である。具体的には、テーブル配布部２０は、タスク決定部１９から処理が終了したことが通知されると、タスク決定部１９が生成して記憶部１２に格納したパーティションテーブル１４を読み出して、マスタノード３０に配布する。
【００６１】
［マスタノードの機能構成］
図９は、マスタノードの機能構成を示す機能ブロック図である。図９に示すように、マスタノード３０は、通信制御部３１、記憶部３２、制御部４０を有する。
【００６２】
通信制御部３１は、管理サーバ１０や各スレーブノード５０との通信を制御する処理部であり、例えばネットワークインタフェースカードなどである。この通信制御部３１は、管理サーバ１０からパーティションテーブル１４などを受信し、マスタノード３０に送信する。
【００６３】
記憶部３２は、制御部４０が実行するプログラムや各種データを記憶する記憶部であり、例えばハードディスクやメモリなどである。この記憶部３２は、パーティションテーブル３３、ジョブリストＤＢ３４、タスクリストＤＢ３５を記憶する。
【００６４】
パーティションテーブル３３は、管理サーバ１０が送信したパーティションテーブル１４を記憶する。このパーティションテーブル３３は、図８で説明したパーティションテーブル１４と同様なので詳細な説明を省略する。
【００６５】
ジョブリストＤＢ３４は、分散処理対象のジョブ情報を記憶するデータベースである。図１０は、ジョブリストＤＢに記憶される情報の例を示す図である。図１０に示すように、ジョブリストＤＢ３４は、「JobID、総Mapタスク数、総Reduceタスク数、スペアReduceタスク数」を対応付けて記憶する。
【００６６】
ここで記憶される「JobID」は、ジョブを識別する識別子である。「総Mapタスク数」は、ジョブに含まれるMap処理タスクの総数である。「総Reduceタスク数」は、ジョブに含まれるReduce処理タスクの総数である。「スペアReduceタスク数」は、総Reduceタスク数のうちスペアReduceタスクに使用されるタスクの数である。なお、「JobID、総Mapタスク数、総Reduceタスク数、スペアReduceタスク数」は、管理者等によって設定更新される。
【００６７】
図１０の例では、「JobID」が「Job001」のジョブは、６つのMap処理タスクと５つのReduce処理タスクで構成され、１つがスペアReduceタスクに用いられることを示す。同様に、「JobID」が「Job002」のジョブは、４つのMap処理タスクと２つのReduce処理タスクで構成され、１つがスペアReduceタスクに用いられることを示す。
【００６８】
タスクリストＤＢ３５は、Map処理タスクやReduce処理タスクに関する情報を記憶するデータベースである。図１１は、タスクリストＤＢに記憶される情報の例を示す図である。図１１に示すように、タスクリストＤＢ３５は、「JobID、TaskID、種別、データのあるスレーブID、状態、割り当てスレーブID、必要スロット数」を記憶する。
【００６９】
ここで記憶される「JobID」は、ジョブを識別する識別子である。「TaskID」は、タスクを識別する識別子である。「種別」は、Map処理やReduce処理を示す情報である。「データのあるスレーブID」は、Map処理対象のデータを保持するスレーブノードを識別する識別子であり、例えばホスト名などである。「状態」は、該当タスクが処理完了（Done）状態、実行中（Running）、割り当て前（Not  assigned）のいずれであるかを示す。
【００７０】
「割当スレーブID」は、タスクが割当てられたスレーブノードを識別する識別子であり、例えばホスト名などである。「必要スロット数」は、タスクを実行するのに使用するスロット数である。
【００７１】
図１１の場合、「JobID」が「Job001」であるジョブで、１スロットを用いるMap処理タスク「Map000」が「Node１」のスレーブノード５０に割当てられる。そして、この「Node１」のスレーブノード５０は、「Node１」のスレーブノードと「Node２」のスレーブノードとからデータを取得して、Map処理を実行し、実行が完了していることを示す。
【００７２】
また、「JobID」が「Job001」であるジョブで、１スロットを用いて実行されるReduce処理タスク「Reduce002」が、Partionerによる割り当て前であることを示す。
【００７３】
なお、JobID、TaskID、種別については、ジョブリストＤＢ３４に記憶される情報にしたがって生成される。データのあるスレーブIDは、メタ情報等により特定することができる。状態は、タスクの割り当て状況やスレーブノード５０からの処理結果等によって更新される。割当スレーブIDは、タスクの割当時点で更新される。必要スロット数は、１タスクについて１スロットなどのように予め指定することができる。
【００７４】
制御部４０は、マスタノード３０全体の処理を司る処理部であり、配布部４１、Map割当部４２、Reduce割当部４３を有する。制御部４０は、例えばプロセッサなどの電子回路であり、配布部４１、Map割当部４２、Reduce割当部４３は、電子回路の一例や制御部４０が実行するプロセスの一例である。
【００７５】
配布部４１は、管理サーバ１０からパーティションテーブル３３を受信して記憶部３２に格納し、各スレーブノード５０に配布する処理部である。この処理により、管理サーバ１０が生成したパーティションテーブル１４、すなわちReduceタスクの割当ルールが各ノードで共有に保存される。
【００７６】
Map割当部４２は、各ジョブにおけるMap処理のタスクであるMapタスクをスレーブノード５０のMapスロットに割当てる処理部である。そして、Map割当部４２は、図１１に示した「割当スレーブID」や「状態」等を更新する。
【００７７】
一例を挙げると、Map割当部４２は、スレーブノード５０等からMapタスクの割当要求を受信した場合に、タスクリストＤＢ３５を参照して「状態」が「Not  assigned」のMapタスクを特定する。続いて、Map割当部４２は、割当要求を送信したスレーブノード５０のＩＤが「データのあるスレーブＩＤ」に含まれるMapタスクがあればそのMapタスクを優先して選ぶ。Map割当部４２は、そのようなMapタスクがなければ任意の方法でMapタスクを選び、割当対象のMapタスクとする。その後、Map割当部４２は、割当要求を送信したスレーブノード５０のIDを、割当対象のMapタスクの「割当スレーブID」に格納する。
【００７８】
その後、Map割当部４２は、特定した割当先のスレーブノード５０に、TaskID、データのあるスレーブID、必要スロット数等を通知して、Mapタスクを割当てる。また、Map割当部４２は、割当てたMapタスクの「状態」を「Not  assigned」から「Running」に更新する。
【００７９】
Reduce割当部４３は、Reduceタスクをスレーブノード５０のReduceスロットに割り当てる処理部である。具体的には、Reduce割当部４３は、パーティションテーブル３３に記憶されるReduceタスクの割当ルールや管理するスペアReduceタスクの数等にしたがって、各ReduceタスクをReduceスロットに割り当てる。割り当てに伴って、Reduce割当部４３は、タスクリストＤＢ３５を随時更新する。つまり、Reduce割当部４３は、Reduceタスク（ReduceID）とスレーブノード５０との対応付けを実行し、ハッシュ値ではなく主キーによる割り当てを実行する。
【００８０】
例えば、Reduce割当部４３は、パーティションテーブル３３のうちReduceIDが小さい順にReduceタスクをReduceスロットに割り当てる。このとき、例えば、Reduce割当部４３は、任意のReduceスロットに割り当ててもよく、Map処理が終わっているReduceスロットを優先して割当ててもよい。
【００８１】
ここで、図８と同様の情報を記憶するパーティションテーブル３３であり、割当て対象のReduceタスクが４つ、スペアReduceタスクが１つ、Reduceスロットが３つ、各スレーブノードが１つのReduceスロットを有する場合を例にして説明する。
【００８２】
この場合、Reduce割当部４３は、Reduceタスクが５つでReduceスロットが３つあることから、Reduce＝０のReduceタスク、Reduce＝１のReduceタスク、Reduce＝２のReduceタスクを各スレーブノード５０に割り当てる。その後、Reduce割当部４３は、いずれかのスレーブノード５０のReduceタスクが終了すると、未割当のReduce＝３のReduceタスクを当該スレーブノード５０に割り当てる。
【００８３】
さらに、Reduce割当部４３は、いずれかのスレーブノード５０のReduceタスクが終了すると、未割当のスペアReduceタスクを当該スレーブノード５０に割り当てる。なお、Reduce割当部４３は、スペアReduceタスク含むReduceタスクのReduceIDと処理対象のキーとを対応付けた情報について、いずれかのスレーブノード５０から取得してもよく、自装置内で判断することもできる。
【００８４】
例えば、ReduceIDが１つずつ増加するIDである場合、Reduce割当部４３は、５つのタスクのうち通常のReduceタスクが４つ、スペアReduceタスクが１つであるので、スペアReduceタスクのReduceIDが４であることを特定できる。したがって、Reduce割当部４３は、Reduceタスクが終了したスレーブノード５０に、ReduceID＝４のスペアReduceタスクを割り当てることもできる。
【００８５】
このように、Reduce割当部４３は、ReduceIDが小さいReduceタスク、すなわち出現数の多いReduceタスクから順に、各スレーブノード５０のReduceスロットに割り当てていき、最後にスペアReduceタスクを割り当てる。この結果、スペアReduceタスクは、通常のReduceタスクのいずれよりも後に開始される。
【００８６】
［スレーブノードの構成］
図１２は、スレーブノードの機能構成を示す機能ブロック図である。図１２に示すように、スレーブノード５０は、通信制御部５１と、記憶部５２と、制御部６０とを有する。
【００８７】
通信制御部５１は、マスタノード３０や他のスレーブノード５０などと通信を実行する処理部であり、例えばネットワークインタフェースカードなどである。例えば、通信制御部５１は、マスタノード３０から各種タスクの割当やパーティションテーブル３３を受信し、各種タスクの完了通知を送信する。また、通信制御部５１は、各種タスク処理の実行に伴って、該当するスレーブノード５０から読み出されたデータを受信する。
【００８８】
記憶部５２は、制御部６０が実行するプログラムや各種データを記憶する記憶部であり、例えばハードディスクやメモリなどである。この記憶部５２は、パーティションテーブル５３、割当確定テーブル５４を記憶する。また、記憶部５２は、各種処理の実行時にデータを一時的に記憶する。さらに、記憶部５２は、Map処理の入力およびReduce処理の出力を記憶する。
【００８９】
パーティションテーブル５３は、マスタノード３０が送信したパーティションテーブル３３を記憶する。このパーティションテーブル５３は、図８で説明したパーティションテーブル１４と同様なので詳細な説明を省略する。
【００９０】
割当確定テーブル５４は、Reduceタスクとキーの対応付けを記憶するデータベースである。具体的には、割当確定テーブル５４は、通常の各Reduceタスクと処理対象のキーの対応付け、および、スペアReduceタスクと処理対象のキーの対応付けを記憶する。図１３は、割当確定テーブルに記憶される情報の例を示す図である。図１３に示すように、割当確定テーブル５４は、「ReduceID、処理するキー」を対応付けて記憶する。なお、ReduceIDおよび処理するキーは、図６と同様の項目なので詳細な説明は省略する。
【００９１】
図１３の例では、ReduceID＝０のReduceタスクがキー（Ａ銀行）を処理するタスクであることを示し、ReduceID＝１のReduceタスクがキー（Ｂ銀行）を処理するタスクであることを示す。また、ReduceID＝２のReduceタスクがキー（Ｃ銀行）を処理するタスクであることを示し、ReduceID＝３のReduceタスクがキー（Ｄ銀行＋Ｅ銀行）を処理するタスクであることを示す。
【００９２】
さらに、ReduceID＝４のReduceタスクがスペアReduceタスクであり、キー（Ｆ銀行）を処理するタスクであることを示す。なお、スペアReduceタスクへのキーの割り当てについては後述する。
【００９３】
制御部６０は、スレーブノード５０全体の処理を司る処理部であり、取得部６１、Map処理部６２、Reduce処理部６３を有する。制御部６０は、例えばプロセッサなどの電子回路であり、取得部６１、Map処理部６２、Reduce処理部６３は、電子回路の一例や制御部６０が実行するプロセスの一例である。
【００９４】
取得部６１は、マスタノード３０からパーティションテーブル３３を取得して、記憶部５２に格納する処理部である。例えば、取得部６１は、MapReduce処理の開始タイミングや予め設定されたタイミング、もしくはマスタノード３０からプッシュ式で送信されたパーティションテーブル３３を取得する。
【００９５】
Map処理部６２は、Mapアプリ実行部６２ａとReduce割当部６２ｂを有し、これらによって、マスタノード３０から割り当てられたMapタスクを実行する。
【００９６】
Mapアプリ実行部６２ａは、ユーザが指定した処理に対応するMapアプリケーションを実行する処理部である。具体的には、Mapアプリ実行部６２ａは、ハートビートなどを用いて、マスタノード３０にMapタスクの割当を要求する。このとき、Mapアプリ実行部６２ａは、スレーブノード５０の空きスロット数も通知する。そして、Mapアプリ実行部６２ａは、マスタノード３０から、「TaskID、データのあるスレーブID、必要スロット数」などを含むMap割当情報を受信する。
【００９７】
その後、Mapアプリ実行部６２ａは、受信したMap割当情報にしたがって、「データのあるスレーブID」で特定されるスレーブノード５０が処理を行っているスレーブノードであれば、記憶部５２からデータを取得する。そうでなければ、Mapアプリ実行部６２ａは、「データのあるスレーブＩＤ」で特定されるスレーブノード５０からデータを取得して記憶部５２等に保存する。その後、Mapアプリ実行部６２ａは、「必要スロット数」で指定されるスロット数を用いてMap処理を実行する。
【００９８】
例えば、Mapアプリ実行部６２ａは、割り当てられたMapタスクの処理対象データを１つずつ、保存先のスレーブノード５０から取得して該当処理を実行する。そして、Mapアプリ実行部６２ａは、処理した結果をReduce割当部６２ｂに出力する。また、Mapアプリ実行部６２ａは、処理対象の入力データすべてに処理を実行した場合、すなわちMapタスクの実行を完了した場合、実行の完了通知をマスタノード３０に通知する。
【００９９】
Reduce割当部６２ｂは、Reduceタスク（ReduceID）と処理対象のキーとの対応付けを実行する処理部である。具体的には、Reduce割当部６２ｂは、管理サーバ１０が生成したパーティションテーブル５３に記憶されるReduceタスクの割当ルールを確定し、スペアReduceタスクの割当ルールの生成および確定を実行する。なお、Reduce割当部６２ｂは、確定した割当ルールをマスタノード３０に送信することもできる。
【０１００】
例えば、Reduce割当部６２ｂは、Mapアプリ実行部６２ａから入力された処理結果のキーを取得し、取得したキーがパーティションテーブル５３に記憶されているか否かを判定する。そして、Reduce割当部６２ｂは、処理結果のデータのキーがパーティションテーブル５３に記憶されている場合、当該キーとReduceIDとの組み合わせを確定して割当確定テーブル５４に格納する。
【０１０１】
一方、Reduce割当部６２ｂは、処理結果のデータのキーがパーティションテーブル５３に記憶されていない場合、スペアReduceタスクの数を使用して当該キーのハッシュ値を計算し、スペアReduceタスクの割当ルールを生成して割当確定テーブル５４に格納する。本実施例では、スペアReduceタスクが１つであることからハッシュ値は４となる。このハッシュ値は、ReduceタスクやスペアReduceタスクの数が予め決まっていることから、各スレーブノード５０で同じ値となる。
【０１０２】
一例を挙げると、Reduce割当部６２ｂは、Mapアプリ実行部６２ａから入力された処理結果のキーがＡ銀行である場合、Ａ銀行とReduceID＝０とが対応付けられていることから、この組み合わせをReduceタスクの処理内容として確定する。一方、Reduce割当部６２ｂは、Mapアプリ実行部６２ａから入力された処理結果のキーがＦ銀行である場合、Ｆ銀行に対応するReduceIDがパーティションテーブル５３に存在しないことから、Ｆ銀行のハッシュ値「４」とキー（Ｆ銀行）との組み合わせをスペアReduceタスクの処理内容として確定する。
【０１０３】
Reduce処理部６３は、Shuffle処理部６３ａとReduceアプリ実行部６３ｂを有し、これらによってReduceタスクを実行する処理部である。このReduce処理部６３は、マスタノード３０から割り当てられたReduceタスクを実行する。
【０１０４】
Shuffle処理部６３ａは、Map処理の結果をキーでソートし、同じキーを有するレコード（データ）をマージして、Reduceタスクの処理対象を生成する処理部である。具体的には、Shuffle処理部６３ａは、マスタノード３０からMap処理が終了したことを通知されると、当該Map処理が属するジョブのReduceタスクを実行する準備として、各スレーブノード５０から該当するMap処理結果を取得する。そして、Shuffle処理部６３ａは、Map処理の結果を予め指定されたキーでソートし、同じキーを有する処理結果をマージして、記憶部５２に格納する。
【０１０５】
例えば、Shuffle処理部６３ａは、「JobID」が「Job001」のMapタスクである「Map000、Map001、Map002、Map003」が終了したこと、つまり、「JobID」が「Job001」のReduce処理タスクの実行開始をマスタノード３０から受信する。すると、Shuffle処理部６３ａは、Node1、Node2、Node3、Node4等からMap処理結果を取得する。続いて、Shuffle処理部６３ａは、Map処理結果のソートおよびマージを実行して記憶部５２等に格納する。
【０１０６】
Reduceアプリ実行部６３ｂは、ユーザが指定した処理に対応するReduceアプリケーションを実行する処理部である。具体的には、Reduceアプリ実行部６３ｂは、マスタノード３０から割当てられたReduceタスクを実行する。
【０１０７】
例えば、Reduceアプリ実行部６３ｂは、「JobID、TaskID、必要スロット数」などから構成されるReduceタスクの情報を受信する。そして、Reduceアプリ実行部６３ｂは、受信した情報を記憶部５２等に格納する。その後、Reduceアプリ実行部６３ｂは、各スレーブノード５０から該当データを取得してReduceアプリケーションを実行し、その結果を記憶部５２に格納する。なお、Reduceアプリ実行部６３ｂは、Reduceタスクの結果をマスタノード３０に送信してもよい。
【０１０８】
［処理の流れ］
次に、本実施例の分散処理システムが実行する処理の流れを説明する。
【０１０９】
（パーティションテーブルの生成処理）
図１４は、パーティションテーブルの生成処理の流れを示すフローチャートである。この処理は、管理サーバ１０が実行する。
【０１１０】
図１４に示すように、管理サーバ１０の実行数取得部１７は、主キーを用いた振分け機能が有効であるか否かを判定する（Ｓ１０１）。例えば、実行数取得部１７は、ユーザの手動設定がされているか否か、または、主キーの数が主キーによる振分効果が期待できる所定数以上か否かを判定する。
【０１１１】
そして、実行数取得部１７は、主キーを用いた振分け機能が有効である場合（Ｓ１０１：Ｙｅｓ）、実行環境の並列実行数情報を取得する（Ｓ１０２）。例えば、実行数取得部１７は、タスクトラッカーやジョブクライアントとして機能する各スレーブノード５０から、Reduceスロットの数を取得する。また、実行数取得部１７は、管理者等により予め指定されるReduceタスクの数等を取得する。
【０１１２】
続いて、割合決定部１８は、BinPacking等により詰め合わせるキーの割合を決定する（Ｓ１０３）。例えば、割合決定部１８は、サンプリング結果テーブル１３に記憶される主キー情報や並列実行可能なReduceタスクの数等を用いて、Reduceタスクに詰め合わせるキーの割合を決定する。
【０１１３】
そして、タスク決定部１９は、決定した割合だけキーの振分け先のReduceタスクを決定する（Ｓ１０４）。例えば、タスク決定部１９は、Reduceタスクに割り当てる件数の閾値を算出し、次に、各Reduceタスクへのキーの割当ルールを作成する。
【０１１４】
その後、テーブル配布部２０は、決定したキーと振分け先のReduceタスクの関係をパーティションテーブルファイルとして各スレーブノード５０に配布する（Ｓ１０５）。例えば、テーブル配布部２０は、生成されたパーティションテーブル１４を、マスタノード３０を介して各スレーブノード５０に配布する。
【０１１５】
そして、管理サーバ１０の制御部１５は、割当て方を制御したMapReduceジョブを実行する（Ｓ１０６）。例えば、管理サーバ１０は、パーティションテーブル１４を用いてReduce処理を実行する指示を含む、MapReduceジョブの実行をマスタノード３０に送信する。
【０１１６】
一方、Ｓ１０１において主キーを用いた振分け機能が有効ではない場合（Ｓ１０１：Ｎｏ）、管理サーバ１０の制御部１５は、割当てにハッシュ値を使うMapReduceジョブを実行する（Ｓ１０７）。つまり、管理サーバ１０は、一般的なMapReduceジョブの実行をマスタノード３０に送信する。
【０１１７】
（Reduceタスクの決定処理）
図１５は、キーの振分け先のReduceタスクを決定する処理の流れを示すフローチャートである。この処理は、図１４のＳ１０４に該当する。
【０１１８】
図１５に示すように、管理サーバ１０のタスク決定部１９は、サンプリング結果の主キー情報に含まれる各キーの件数から、キーの出現数の合計値（totalRecord）を求める（Ｓ２０１）。例えば、タスク決定部１９は、サンプリング結果の各キーの出現数を合算する。
【０１１９】
続いて、タスク決定部１９は、BinPackingによって詰め合わせる割合（rate）から、制御するキーの出現数の閾値を「totalRecord×rate」で求める（Ｓ２０２）。例えば、タスク決定部１９は、Ｓ２０１で得られた合計値（totalRecord）とＳ１０３で算出した割合とを乗算する。
【０１２０】
その後、タスク決定部１９は、各Reduceタスクの中から、詰め合わせたキーが最も少ないReduceタスクのIDを調べる（Ｓ２０３）。例えば、タスク決定部１９は、パーティションテーブル１４を参照して、割り当てられたキーの件数が最小のReduceタスクのID（ReduceID）を特定する。
【０１２１】
そして、タスク決定部１９は、特定したReduceIDに対応するReduceタスクに対して、キーを割り当て、そのReduceタスクに詰め合わせたキーの数を更新する（Ｓ２０４）。例えば、タスク決定部１９は、ReduceIDに新たに割り当てたキーの出現数と、当該ReduceIDに既に割り当てられているキーの出現数とを合算する。
【０１２２】
その後、タスク決定部１９は、詰め合わせたキーの数が閾値を超えた場合（Ｓ２０５：Ｙｅｓ）、処理を終了し、詰め合わせたキーの数が閾値を超えない場合（Ｓ２０５：Ｎｏ）、Ｓ２０３以降を繰り返す。例えば、タスク決定部１９は、各Reduceタスクに割り当て済みの全キーの出現数の合算値がＳ２０２で算出した閾値を超える場合は、割当てを終了し、超えない場合、閾値を超えるまで新たな割り当てを実行する。
【０１２３】
（マスタノードの処理）
図１６は、マスタノードが実行する処理の流れを示すフローチャートである。この処理は、なお、ここで説明する処理の流れはあくまで一例であり、例えば各タスクの割当、Map処理、Reduce処理は、MapReduceの制約の中において矛盾がない範囲内で並列に実行することができる。
【０１２４】
図１６に示すように、処理が開始されると（Ｓ３０１：Ｙｅｓ）、マスタノード３０のMap割当部４２は、Mapタスクを各スレーブノード５０に割り当てる（Ｓ３０２）。
【０１２５】
その後、Map割当部４２は、Mapタスクの完了通知をスレーブノード５０から受信すると（Ｓ３０３：Ｙｅｓ）、未処理のMapタスクがあるか否かを判定する（Ｓ３０４）。
【０１２６】
そして、Map割当部４２は、未処理のMapタスクがある場合（Ｓ３０４：Ｙｅｓ）、スロットが空いているスレーブノード５０に、未処理のMapタスクを割り当てて（Ｓ３０５）、Ｓ３０３以降を繰り返す。
【０１２７】
一方、未処理のMapタスクがない場合（Ｓ３０４：Ｎｏ）、Reduce割当部４３は、スペアReduce情報を受信しているか否かを判定する（Ｓ３０６）。なお、マスタノード３０は、スペアReuceIDが存在していることを認識しており、実際にスペアReduceIDにキーが割り当てられているか否かに関わらず、以降の処理を実行するので、Ｓ３０６の処理を必ずしも実行しなくてもよい。
【０１２８】
そして、Reduce割当部４３は、スペアReduce情報を受信している場合（Ｓ３０６：Ｙｅｓ）、Reduceタスクをスレーブノード５０に割り当てる（Ｓ３０７）。
【０１２９】
その後、Reduce割当部４３は、Reduceタスクの完了通知をスレーブノード５０から受信すると（Ｓ３０８：Ｙｅｓ）、未処理のReduceタスクがあるか否かを判定する（Ｓ３０９）。
【０１３０】
そして、Reduce割当部４３は、未処理のReduceタスクがある場合（Ｓ３０９：Ｙｅｓ）、スロットが空いているスレーブノード５０に、未処理のReduceタスクを割り当てて（Ｓ３１０）、Ｓ３０８以降を繰り返す。
【０１３１】
一方、Reduce割当部４３は、未処理のReduceタスクがない場合（Ｓ３０９：Ｎｏ）、スロットが空いているスレーブノード５０に、スペアReduceタスクを割り当てる（Ｓ３１１）。
【０１３２】
（スレーブノードの処理）
図１７は、スレーブノードが実行する処理の流れを示すフローチャートである。図１７に示すように、スレーブノード５０は、マスタノード３０に、ハートビートでタスク要求を送信する（Ｓ４０１）。
【０１３３】
続いて、スレーブノード５０は、タスク要求の応答としてジョブ情報とタスク情報を取得し（Ｓ４０２）、取得したタスク情報がMapタスクの情報か否かを判定する（Ｓ４０３）。
【０１３４】
そして、スレーブノード５０のMap処理部６２は、取得したタスク情報がMapタスクの情報であると判定された場合（Ｓ４０３：Ｙｅｓ）、入力データを読み込み（Ｓ４０４）、Mapタスクを起動して（Ｓ４０５）、Map処理を実行する（Ｓ４０６）。
【０１３５】
その後、Map処理部６２は、Mapタスクが終了するまで待機し（Ｓ４０７）、Mapタスクが終了すると、ハートビートを利用してMapタスクの完了通知等をマスタノード３０に送信する（Ｓ４０８）。
【０１３６】
一方、取得したタスク情報がReduceタスクの情報である場合（Ｓ４０３：Ｎｏ）、Shuffle処理部６３ａは、Reduceタスクを実行して、各スレーブノード５０からMap処理結果を取得してShuffle処理を実行する（Ｓ４０９）。
【０１３７】
続いて、Reduceアプリ実行部６３ｂは、Shuffle処理結果を用いてReduceアプリを実行する（Ｓ４１０）。そして、Reduceアプリ実行部６３ｂは、Reduceタスクが終了するまで待機し（Ｓ４１１）、Reduceタスクが終了すると、ハートビートを利用してReduceタスクの完了通知等をマスタノード３０に送信する（Ｓ４１２）。
【０１３８】
（Map処理）
図１８は、Map処理の流れを示すフローチャートである。この処理は、図１７のＳ４０６で実行される処理である。
【０１３９】
図１８に示すように、スレーブノード５０のMapアプリ実行部６２ａは、入力データからレコードを読み取り（Ｓ５０１）、当該レコードを用いてMapアプリケーションを実行し、出力結果を得る（Ｓ５０２）。
【０１４０】
その後、Reduce割当部６２ｂは、出力結果のキーに対応する振分り先のReduceIDがパーティションテーブル５３に登録されているか否かを判定する（Ｓ５０３）。そして、Reduce割当部６２ｂは、出力結果のキーに対応する振分り先のReduceIDがパーティションテーブル５３に登録されている場合（Ｓ５０３：Ｙｅｓ）、登録されているReduceIDを当該キーの振分け先に決定して、割当確定テーブル５４に格納する（Ｓ５０４）。
【０１４１】
一方、Reduce割当部６２ｂは、出力結果のキーに対応する振分り先のReduceIDがパーティションテーブル５３に登録されていない場合（Ｓ５０３：Ｎｏ）、Ｓ５０５を実行する。すなわち、Reduce割当部６２ｂは、出力結果のキーのハッシュ値を求める。なお、ハッシュ値の計算には、スペアReduceタスクの数を使用する。
【０１４２】
続いて、Reduce割当部６２ｂは、算出したハッシュ値に通常のReduceタスクの数を加算した値を、振分け先のReduceタスクIDとして、割当確定テーブル５４に格納する（Ｓ５０６）。例えば、Reduce割当部６２ｂは、算出したハッシュ値「０」＋通常のReduceタスクの数「４」を加算した値「４」をスペアReduceのIDとする。
【０１４３】
その後、Reduce割当部６２ｂは、未処理の入力データが残っている場合（Ｓ５０７：Ｎｏ）、Ｓ５０１以降を繰り返す。一方、Reduce割当部６２ｂは、入力データを全て処理し終えた場合（Ｓ５０７：Ｙｅｓ）、処理を終了する。このとき、Reduce割当部６２ｂは、生成した割当確定テーブル５４を、マスタノード３０に送信することもできる。
【０１４４】
［効果］
上述したように、スレーブノード５０は、スペアReduceタスクの数と通常のReduceタスクの数、検出されたキーの情報に基づいて、スペアReduceタスクに対してハッシュ値を用いてスロットに割当てることができる。このため、スレーブノード５０は、通信する仕組みを加えることなく、全て一意のReduceタスクにキーを振分けることができる。
【０１４５】
さらに、マスタノード３０は、スペアReduceタスクのスケジューリングを通常のReduceタスクのスケジューリングが全て終わった後に行うことで、サンプリング時のキー情報が不正確であっても最適なReduceスロット毎にスペアReduceタスクを割当てる。この結果、Reduceスロットが実行するReduceタスクの実行が完了する時間を平準化することができ、MapReduceのジョブ実行からジョブ完了までの時間を短縮できる。
【０１４６】
また、管理サーバ１０は、ReduceIDの番号が小さい順に処理件数の多いキーを割り当て、マスタノード３０は、処理件数の多いReduceタスクから順にReduceスロットに割り当てる。この結果、処理件数を考慮せずにReduceタスクを割り当てる場合に比べて、処理時間を短縮することができる。
【０１４７】
図１９は、Reduceタスクの割当による処理時間の短縮例を説明する図である。図１９では、３つのReduceスロットに対して、スペアReduceタスクを含む５つのReduceタスクを割り当てる例を説明する。
【０１４８】
図１９の上図に示すように、出現数の少ないキーから順に、Ｆ銀行（１００００件）、Ｄ銀行＋Ｅ銀行（５００００件）、Ｃ銀行（６００００件）、Ｂ銀行（８００００件）、Ａ銀行（１０００００件）と割当てていく例である。この場合、はじめに、Ｆ銀行（１００００件）、Ｄ銀行＋Ｅ銀行（５００００件）、Ｃ銀行（６００００件）がReduceスロット１、２、３に順に割り当てられる。
【０１４９】
その後、最も件数の少ないＦ銀行の処理が終了すると、次にＢ銀行（８００００件）がＦ銀行を処理していたReduceスロット１に割り当てられる。さらに、次に件数の少ないＤ銀行＋Ｅ銀行の処理が終了すると、次にＡ銀行（１０００００件）がＤ銀行＋Ｅ銀行を処理していたReduceスロット２に割り当てられる。したがって、Reduce処理の完了時間は、Ｄ銀行＋Ｅ銀行（５００００件）の処理時間とＡ銀行（１０００００件）の処理時間の合計となる。
【０１５０】
一方、図１９の下図は、出現数の多いキーから順に、Ａ銀行（１０００００件）、Ｂ銀行（８００００件）、Ｃ銀行（６００００件）、Ｄ銀行＋Ｅ銀行（５００００件）、Ｆ銀行（１００００件）を割当てていく例である。この場合、はじめに、Ａ銀行、Ｂ銀行、Ｃ銀行がReduceスロット１、２、３に順に割り当てられる。
【０１５１】
その後、割り当て済みキーのうち最も件数の少ないＣ銀行の処理が終了すると、次にＤ銀行＋Ｅ銀行がＣ銀行を処理していたReduceスロット３に割り当てられる。さらに、次に件数の少ないＢ銀行の処理が終了すると、次にＦ銀行がＢ銀行を処理していたReduceスロット２に割り当てられる。したがって、Reduce処理の完了時間は、Ｃ銀行（６００００件）の処理時間とＤ銀行＋Ｅ銀行（５００００件）の処理時間との合計となる。
【０１５２】
上図と下図とを比較すると、上図では、１５００００件の処理時間がかかり、下図ででは１１００００件の処理時間がかかる。つまり、出現数の多いキーから順に、Reduceタスクを割り当てることで、全体の処理時間の短縮が実現できる。
【０１５３】
また、MapReduceは、Mapタスクのバックグラウンドで実行されるReduceタスクへのデータ転送がMapタスク実行時間によって隠される特性を有する。この特性を利用して、出現数が多いキーのReduceタスクを先に割り当てることで、MapタスクからReduceタスクへのデータ転送（Shuffle処理）にかかる時間の隠ぺいを最大化することができる。
【０１５４】
図２０は、Reduceタスクのデータ転送の短縮例を説明する図である。図２０では、２つのReduceスロットに対して、スペアReduceタスクを含む４つのReduceタスクを割り当てる例を説明する。また、図２０では、データ転送時間を件数の４割とする。つまり、入力データ量を１００とした場合、４０がデータ転送時間であり、６０が実際の処理時間とする。なお、Mapタスクの処理時間は一律とする。
【０１５５】
図２０の上図は、出現数の少ないキーから順に割当てた場合であり、具体的には、入力データ量（３０）と（５０）を先に割り当て、その後（８０）と（１００）を割り当てる例である。この場合、Mapタスクの実行中に、データ量（５０）のうちの１０とデータ量（３０）のうちの６のデータ転送を実行することができる。すなわち、合計１６のデータ転送をMapタスク中に実行できる。
【０１５６】
一方、図２０の下図は、出現数の多いキーから順に割当てた場合であり、具体的には、入力データ量（１００）と（８０）を先に割り当て、その後（５０）と（３０）を割り当てる例である。この場合、Mapタスクの実行中に、データ量（１００）のうちの２０とデータ量（８０）のうちの１６のデータ転送を実行することができる。すなわち、合計３６のデータ転送をMapタスク中に実行できる。
【０１５７】
したがって、出現数の多いキーから順に割当てた方がMapタスクの実行中により多くのReduce処理対象のデータを転送することができるので、Reduceタスクの準備にかかる処理時間を短縮できる。この結果、全体の処理時間が短縮できる。
【０１５８】
さらに、このスケジューリングの効果は、スペアReduceタスクの効果の向上にもつながる。スペアReduceタスクは、入力データのうち出現数が少ないことが分かっているキー、または、サンプリングで検出できなかった程出現数が少ないキーが割り当てられるため、実行時間が短い。この短い実行時間を使って有効に平準化するには、各Reduceスロットの終了時刻の差が短い程よい。したがって、図２０の上図と下図を比較して分かるように、入力データ件数が多いReduceタスクを優先して割り当てる方が、各Reduceスロットの終了時刻の差が短くなるため、スペアReduceタスクの効果が高くなる。
【実施例２】
【０１５９】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【０１６０】
［スペアReduceタスクの数］
上記実施例では、スペアReduceタスクが１つの例で説明したが、これに限定されるものではなく、複数のスペアReduceタスクを有していてもよい。その場合、各スレーブノード５０は、スペアReduceタスクの数でハッシュ値の計算を行うことで、システム内で共通のReduceIDを割り当てることができる。
【０１６１】
［スペアReduceタスクへの割当］
また、上記例では、サンプリング時に含まれなかった主キーをスペアReduceタスクに割り当てる例を説明したが、これは一例であり、割当てを限定するものではない。例えば、算出された割合によって、通常のReduceタスクが割り当てられなかった出現数の少ない主キーがスペアReduceタスクに割り当てられる場合もある。さらに、スペアReduceタスクに割り当てられる主キーは、１つに限られず、２つ以上が割り当てられる場合もある。
【０１６２】
［割当る入力データ量］
上記実施例で説明したスペアReduceタスクに割り当てる入力データ量は、Reduceタスクのいずれよりも小さい例で説明した。ここで、入力データ量とは、例えばレコードの数やペイロードの大きさなどを任意に指定することができ、入力データ量が少ないとは、例えばレコードの数が少ない、ペイロードが小さいなどで判定することができる。
【０１６３】
［システム］
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１６４】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散や統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１６５】
［ハードウェア］
次に、各サーバのハードウェア構成例を説明するが、各装置は同様の構成を有するので、ここでは一例を説明する。図２１は、装置のハードウェア構成例を示す図である。図２１に示すように、装置１００は、通信インタフェース１０１、メモリ１０２、複数のＨＤＤ（ハードディスクドライブ）１０３、プロセッサ装置１０４を有する。
【０１６６】
通信インタフェース１０１は、各機能部の説明時に示した通信制御部に該当し、例えばネットワークインタフェースカードなどである。複数のＨＤＤ１０３は、各機能部の説明時に示した処理部を動作させるプログラムやＤＢ等を記憶する。
【０１６７】
プロセッサ装置１０４が有する複数のＣＰＵ１０５は、各機能部の説明時に示した各処理部と同様の処理を実行するプログラムをＨＤＤ１０３等から読み出してメモリ１０２に展開することで、図６、図９、図１２等で説明した各機能を実行するプロセスを動作させる。すなわち、このプロセスは、管理サーバ１０が有するサンプリング実行部１６、実行数取得部１７、割合決定部１８、タスク決定部１９、テーブル配布部２０と同様の機能を実行する。また、このプロセスは、マスタノード３０が有する配布部４１、Map割当部４２、Reduce割当部４３と同様の機能を実行する。また、このプロセスは、スレーブノード５０が有する取得部６１、Map処理部６２、Reduce処理部６３と同様の機能を実行する。
【０１６８】
このように装置１００は、プログラムを読み出して実行することで、データ処理制御方法またはタスク実行方法を実行する情報処理装置として動作する。また、装置１００は、媒体読取装置によって記録媒体から上記プログラムを読み出し、読み出された上記プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、装置１００によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【符号の説明】
【０１６９】
１０  管理サーバ
１１  通信制御部
１２  記憶部
１３  サンプリング結果テーブル
１４  パーティションテーブル
１５  制御部
１６  サンプリング実行部
１７  実行数取得部
１８  割合決定部
１９  タスク決定部
２０  テーブル配布部
３０  マスタノード
３１  通信制御部
３２  記憶部
３３  パーティションテーブル
３４  ジョブリストＤＢ
３５  タスクリストＤＢ
４０  制御部
４１  配布部
４２  Map割当部
４３  Reduce割当部
５０  スレーブノード
５１  通信制御部
５２  記憶部
５３  パーティションテーブル
５４  割当確定テーブル
６０  制御部
６１  取得部
６２  Map処理部
６２ａ  Mapアプリ実行部
６２ｂ  Reduce割当部
６３  Reduce処理部
６３ａ  Shuffle処理部
６３ｂ  Reduceアプリ実行部
【図１】
0006519111.tif 000002
【図２】
0006519111.tif 000003
【図３】
0006519111.tif 000004
【図４】
0006519111.tif 000005
【図５】
0006519111.tif 000006
【図６】
0006519111.tif 000007
【図７】
0006519111.tif 000008
【図８】
0006519111.tif 000009
【図９】
0006519111.tif 000010
【図１０】
0006519111.tif 000011
【図１１】
0006519111.tif 000012
【図１２】
0006519111.tif 000013
【図１３】
0006519111.tif 000014
【図１４】
0006519111.tif 000015
【図１５】
0006519111.tif 000016
【図１６】
0006519111.tif 000017
【図１７】
0006519111.tif 000018
【図１８】
0006519111.tif 000019
【図１９】
0006519111.tif 000020
【図２０】
0006519111.tif 000021
【図２１】
0006519111.tif 000022