以下に添付図面を参照して、開示の割当プログラム、割当装置、および割当方法の実施の形態を詳細に説明する。なお、実施の形態1にかかる割当装置の例として、分散処理システム内において、スレーブノードに処理を割り当てる、マスタノードにて説明を行う。
(実施の形態1)
図1および図2は、実施の形態1にかかる分散処理システムの動作例を示す説明図(その1)および(その2)である。分散処理システム100は、第1の処理および第2の処理を割り当てるマスタノード101と、第1の処理および第2の処理が割り当てられるスレーブノード102と、データベース110を含む。スレーブノード102は、分散処理システム100内にn台存在していてもよい。nは1以上の整数である。図1の例では、分散処理システム100は、スレーブノード102#1とスレーブノード102#2を含んでいる。以下の説明では、xをインデックスとし、末尾記号“#x”が付与されている記号については、x番目のスレーブノード102について説明しているとする。xは1からnまでの整数となる。また、スレーブノード102と表現されている場合、スレーブノード102全てに共通する説明を行っているとする。
スレーブノード102に割り当てられる第1の処理は、他のスレーブノード102に割り当てられる第1の処理とは独立したものであり、スレーブノード102に割り当てられた全ての第1の処理を並列に実行できる処理である。たとえば、第1の処理は、データベース110に入力されたデータを用いて、他の入力されたデータを処理対象とする別の第1の処理とは独立して、keyValueの形式にてデータを出力する処理である。keyValueの形式となるデータとは、Valueフィールドに格納された任意の保存したい値と、keyフィールドに格納された保存したいデータに対応する一意の標識と、の組である。
第2の処理は、第1の処理の処理結果の属性をもとに前記第1の処理の処理結果を集約した1以上の処理結果を処理対象とする処理である。たとえば、第1の処理の処理結果が、keyValueの形式となるデータである場合、第2の処理は、第1の処理の処理結果の属性となるKeyフィールドをもとに第1の処理結果を集約した1つ以上の処理結果を処理対象とする処理である。また、たとえば、第2の処理は、Valueフィールドをもとに第1の処理結果を集約した1つ以上の処理結果を処理対象とする処理であってもよい。
データベース110は、分散処理システム100内の装置がアクセス可能な記憶領域である。また、データベース110は、第1の処理の処理対象となるデータが順次入力される。
データは、どのようなデータであってもよい。たとえば、一連のデータは、ある時間帯の計測結果を記録したファイルである。また、一連のデータのいずれかのデータは、たとえば、ファイルを論理的な区切りにて分割したスプリットである。論理的な区切りとは、たとえば、ファイルの行単位である。
ある時間帯の計測結果は、たとえば、1分間ごとの道路ごとの道路通行量の計測結果である。または、ある時間帯の計測結果は、1分間ごとのある室内の温度や湿度の計測結果でもよい。分散処理システム100は、一連のデータを参照して、第1の処理および第2の処理を実行し、処理結果を出力する。たとえば、分散処理システム100は、1分間ごとの道路ごとの道路通行量の計測結果を5分間分用いて、各道路の車両数を計数し、渋滞情報として出力する。
以下、14:11〜14:15までの5分間の計測ファイル111〜113を分割したスプリットが順次入力される状態において、分散処理システム100が、計測ファイル群を用いて渋滞情報を出力することを前提として説明を行う。また、計測ファイル113には、渋滞情報の処理対象の最後のファイルであることを示す末尾情報114が付与されているとする。さらに、分散処理システム100は、渋滞情報を算出する処理を、スレーブノード102#1と、スレーブノード102#2とに分散して処理する。分散して処理するソフトウェアとして、実施の形態1にかかる分散処理システム100は、Hadoopを採用した例を用いて説明する。
また、Hadoopにて用いられている用語を用いて、実施の形態1にかかる分散処理システム100を説明する。「ジョブ」は、Hadoopにおける処理単位である。たとえば、渋滞情報を算出する処理が1つのジョブとなる。「タスク」は、ジョブが分割された処理単位である。タスクは、第1の処理であるMap処理を実行するMapタスクと、第2の処理であるReduce処理を実行するReduceタスクとの2種類がある。Reduceタスクは、Reduce処理を実行しやすくするため、Reduce処理の前に、KeyフィールドをもとにMap処理の処理結果を集約するシャッフル&ソート処理を実行する。
図1では、分散処理システム100の時刻t1における状態と、時刻t2における状態とを表示する。図2では、分散処理システム100の時刻t3における状態と、時刻t4における状態と、時刻t5における状態とを表示する。なお、時刻t1、時刻t2、時刻t3、時刻t4、時刻t5の順に時間が経過しているとする。
図1に示す時刻t1において、マスタノード101は、渋滞情報を算出するというジョブの実行要求を受け付ける。また、図1に示す時刻t1において、マスタノード101は、データベース110に、14:11の計測ファイル111のスプリット1が入力されたことを検出する。スプリット1が入力されたことを検出した場合、マスタノード101は、スレーブノード102#1にスプリット1を処理対象とする、ジョブを分割したMap処理1を割り当てる。
このとき、処理対象となる全部のスプリットが揃うのを待たずに一部のスプリットに対するMap処理の実行を開始すると、一部のスプリットをジョブ全体の処理対象とみなしてMapReduce処理が実行され、期待する処理結果を得られない場合がある。処理結果を正確にするため、マスタノード101は、同一ジョブとして処理する計測ファイル群の末尾のスプリットであることを示す末尾情報がスプリット1に付与されているか否かを判断する。スプリット1には末尾情報が付与されていないため、マスタノード101は、スプリットがまだ入力され続けると判断する。
図1に示す時刻t2において、マスタノード101は、データベース110に、14:14の計測ファイル112のスプリット2が入力されたことを検出する。スプリット2が入力されたことを検出した場合、マスタノード101は、スレーブノード102#2にスプリット2を処理対象とするMap処理2を割り当てる。また、図1に示す時刻t2において、スレーブノード102#1は、Map処理1を完了しており、Map処理結果1を保持している。また、マスタノード101は、スプリット2に末尾情報が付与されているか否かを判断する。スプリット2には末尾情報が付与されていないため、マスタノード101は、スプリットがまだ入力され続けると判断する。
図2に示す時刻t3において、マスタノード101は、データベース110に、14:15の計測ファイル113のスプリット3が入力されたことを検出する。スプリット3が入力されたことを検出した場合、マスタノード101は、スレーブノード102#1にスプリット3を処理対象とするMap処理3を割り当てる。また、図2に示す時刻t3において、スレーブノード102#2は、Map処理2を完了しており、Map処理結果2を保持している。また、マスタノード101は、スプリット3に末尾情報が付与されているか否かを判断する。スプリット3には末尾情報が付与されていないため、マスタノード101は、スプリットがまだ入力され続けると判断する。
図2に示す時刻t4において、マスタノード101は、データベース110に、14:15の計測ファイル113のスプリット4が入力されたことを検出する。スプリット4は、計測ファイル113の末尾であるとする。また、データベース110にスプリット4を入力する装置は、スプリット3の入力が完了した後に、スプリット4を入力する。スプリット4は計測ファイル113の末尾であるため、スプリット4は、末尾情報114が付与されている。スプリット4が入力されたことを検出した場合、マスタノード101は、スレーブノード102#2にスプリット4を処理対象とするMap処理4を割り当てる。また、図2に示す時刻t3において、スレーブノード102#2は、Map処理2を完了しており、Map処理結果2を保持している。
また、マスタノード101は、スプリット4に末尾情報114が付与されているか否かを判断する。スプリット4には末尾情報114が付与されているため、マスタノード101は、スプリットの入力が終了したと判断する。スプリットに末尾情報114が付与されていると判断した場合の動作について、図2に示す時刻t5にて説明する。
図2に示す時刻t5において、マスタノード101は、Map処理結果1〜4をMap処理結果の属性をもとに集約するシャッフル&ソート処理1、2を、スレーブノード102#1と、スレーブノード102#2に割り当てる。シャッフル&ソート処理1は、Map処理結果1とMap処理結果3を処理対象としている。シャッフル&ソート処理2は、Map処理結果2とMap処理結果4を処理対象としている。また、図2では図示していないが、スレーブノード102#1は、シャッフル&ソート処理1の処理結果を処理対象として、Reduce処理1を実行する。また、スレーブノード102#2は、シャッフル&ソート処理2の処理結果を処理対象として、Reduce処理2を実行する。
このように、分散処理システム100は、データベース110に順次入力されるデータに対してMap処理を逐次実行し、末尾情報が付与されたデータまでのMap処理完了後にシャッフル&ソート処理に移行する。データに対して逐次実行することと、末尾情報が付与されたデータまでシャッフル&ソート処理の実行を待つことにより、分散処理システム100は、同一ジョブのMap処理の実行時間帯の集中を避け、効率的に分散処理を実行することができる。以下、図2〜図20を用いて、分散処理システム100について説明する。
図3は、分散処理システムのシステム構成例を示す説明図である。分散処理システム100は、マスタノード101と、スレーブノード102#1〜nと、ジョブクライアント301と、HDFS(Hadoop Distributed File System)クライアント302とを含む。マスタノード101〜HDFSクライアント302とは、それぞれ、ネットワーク311にて接続されている。また、マスタノード101と、スレーブノード102#1〜nを含めてHadoopクラスタ312として定義する。Hadoopクラスタ312は、ジョブクライアント301と、HDFSクライアント302を含んでもよい。
マスタノード101は、Map処理と、Reduce処理をスレーブノード102#1〜スレーブノード102#nに割り当てる装置である。スレーブノード102#1〜スレーブノード102#nは、割り当てられたMap処理と、Reduce処理を実行する装置である。
ジョブクライアント301は、データベース110に入力される計測ファイルと、実行可能ファイルとなるプログラムと、実行ファイルの設定ファイルとを記憶しており、ジョブの実行要求をマスタノード101に通知する装置である。
なお、計測ファイルは、計測ファイルを生成する分散処理システム100以外のシステムに含まれる装置からジョブクライアント301に送信されてもよいし、分散処理システム100の運用者等により、ジョブクライアント301に格納されてもよい。また、計測ファイルをスプリットに分割する装置は、ジョブクライアント301でもよいし、マスタノード101でもよい。また、ジョブクライアント301は、計測ファイルに末尾情報を付与する。たとえば、ジョブクライアント301は、14:11〜14:15の計測ファイルを用いる渋滞情報を算出するジョブを登録しており、14:15の計測ファイル113を取得した場合、14:15の計測ファイル113の末尾に末尾情報を付与する。
HDFSクライアント302は、Hadoop独自のファイルシステムである、HDFSのファイル操作を行う端末である。ネットワーク311は、たとえば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットである。
(マスタノード101のハードウェア)
図4は、マスタノードのハードウェア構成例を示すブロック図である。図4において、マスタノード101は、CPU(Central Processing Unit)401と、ROM(Read‐Only Memory)402と、RAM(Random Access Memory)403と、を含む。また、マスタノード101は、磁気ディスクドライブ404と、磁気ディスク405と、IF(Interface)406と、を含む。また、各部はバス407によってそれぞれ接続されている。
CPU401は、マスタノード101の全体の制御を司る演算処理装置である。ROM402は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。RAM403は、CPU401のワークエリアとして使用される揮発性メモリである。磁気ディスクドライブ404は、CPU401の制御にしたがって磁気ディスク405に対するデータのリード/ライトを制御する制御装置である。磁気ディスク405は、磁気ディスクドライブ404の制御で書き込まれたデータを記憶する不揮発性メモリである。なお、ROM402、磁気ディスク405のいずれかの記憶装置に、実施の形態1にかかる割当プログラムが格納されていてもよい。
IF406は、通信回線を通じて、ネットワーク311を介し他の装置に接続される。そして、IF406は、ネットワーク311と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。IF406には、たとえばモデムやLANアダプタなどを採用することができる。
なお、マスタノード101の管理者がマスタノード101を直接操作する場合、図4には図示していないが、マスタノード101は、光ディスクドライブと、光ディスクと、ディスプレイと、マウスと、を有していてもよい。
光ディスクドライブは、CPU401の制御にしたがって光ディスクに対するデータのリード/ライトを制御する制御装置である。光ディスクは、光ディスクドライブの制御で書き込まれたデータを記憶したり、光ディスクに記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイは、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイは、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
キーボードは、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボードは、タッチパネル式の入力パッドやテンキーなどであってもよい。マウスは、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。また、マスタノード101は、マウスの代わりとして、ポインティングデバイスとして同様に機能を有するものであれば、トラックボールやジョイスティックなどであってもよい。
また、スレーブノード102#1と、スレーブノード102#2と、ジョブクライアント301は、CPUと、ROMと、RAMと、磁気ディスクドライブと、磁気ディスクと、を有する。また、HDFSクライアント302は、CPUと、ROMと、RAMと、磁気ディスクドライブと、磁気ディスクと、光ディスクドライブと、光ディスクと、ディスプレイと、マウスと、を有する。
図5は、分散処理システムのソフトウェア構成例を示す説明図である。マスタノード101は、ジョブトラッカー501と、ジョブスケジューラ502と、ネームノード503と、HDFS504と、メタデータテーブル505とを有する。スレーブノード102#xは、タスクトラッカー511#xと、データノード512#xと、HDFS513#xと、Mapタスク514#xと、Reduceタスク515#xを有する。xは、1からnまでの整数である。ジョブクライアント301は、MapReduceプログラム521と、JobConf522とを、有する。HDFSクライアント302は、HDFSクライアントアプリケーション531と、HDFS API(Application Programming Interface)532と、を有する。
また、図1に示したデータベース110は、HDFS504、HDFS513#1〜nとなる。また、Hadoopは、HDFS以外のファイルシステムであってもよい。たとえば、分散処理システム100は、データベース110として、マスタノード101とスレーブノード102#1〜nが、FTP(File Transfer Protocol)によりアクセス可能なファイルサーバを採用してもよい。
ジョブトラッカー501は、実行すべきジョブをジョブクライアント301から受け付ける。続けて、ジョブトラッカー501は、クラスタ中の利用可能なタスクトラッカー511に、Mapタスク514、Reduceタスク515を割り当てる。ジョブスケジューラ502は、次に実行するジョブを決定する。具体的に、ジョブスケジューラ502は、ジョブクライアント301から要求された複数のジョブのうち、次に実行するジョブを決定する。また、ジョブスケジューラ502は、決定したジョブに対して、スプリットが入力される都度、Mapタスク514を生成する。
ネームノード503は、Hadoopクラスタ312内のファイルの記憶先を制御する。たとえば、ネームノード503は、データベース110に入力されたファイルが、HDFS504、HDFS513#1〜nのどこに記憶されるかを決定し、決定されたHDFSにファイルを送信する。
HDFS504、HDFS513#1〜nは、ファイルを分散して記憶する記憶領域である。具体的に、HDFS513#1〜nは、ファイルを物理的な区切りにて分割したブロック単位にて記憶している。メタデータテーブル505は、HDFS504、HDFS513#1〜nに記憶しているファイルの位置を記憶する記憶領域である。メタデータテーブル505を用いた具体的なファイルの記憶方法としては、図6にて後述する。また、ブロックとスプリットの関係は、図7にて後述する。
タスクトラッカー511は、ジョブトラッカー501から割り当てられたMapタスク514やReduceタスク515を、自装置に実行させる。また、タスクトラッカー511は、Mapタスク514やReduceタスク515の進捗状況や処理の完了報告をジョブトラッカー501に通知する。
データノード512は、スレーブノード102内のHDFS513を制御する。Mapタスク514は、Map処理を実行する。Reduceタスク515は、Reduce処理を実行する。また、Reduceタスク515は、Reduce処理を行う前段階として、シャッフル&ソート処理を実行する。シャッフル&ソート処理は、Map処理の結果を集約する処理を行う。具体的に、シャッフル&ソート処理は、Map処理の結果をKeyごとに並び替え、同一のkeyとなったValueを纏めて、Reduce処理に出力する。
MapReduceプログラム521は、Map処理を実行するプログラムと、Reduce処理を実行するプログラムとである。JobConf522は、MapReduceプログラム521の設定を記述したプログラムである。設定の例としては、Mapタスク514の生成数や、Reduceタスク515の生成数や、MapReduce処理の処理結果の出力先等である。
HDFSクライアントアプリケーション531は、HDFSを操作するアプリケーションである。HDFS API532は、HDFSにアクセスするAPIである。HDFS API532は、たとえば、HDFSクライアントアプリケーション531からファイルのアクセス要求があった場合、データノード512に、ファイルを保持しているか否かを問い合わせる。
図6は、HDFSによるファイルの記憶方法の一例を示す説明図である。図6の(A)では、メタデータテーブル505の記憶内容の一例を示している。図6の(B)では、ファイルの分割方法を示している。図6の(C)では、メタデータテーブル505の記憶内容に従った、HDFS513の記憶内容の一例を示している。
図6の(A)に示すメタデータテーブル505は、レコード601−1〜5を記憶する。メタデータテーブル505は、ファイルパス、ブロック番号、データノードという3つのフィールドを含む。ファイルパスフィールドには、ルートパスからのファイルの位置を示す文字列が格納される。ブロック番号フィールドには、ファイルを物理的に分割した際のブロックのIDが格納される。データノードフィールドには、該当のブロックIDにて示されるブロックが格納されているデータノードのIDが格納される。図6に示すデータノードフィールドは、HDFS513のインデックスが格納されているとする。
たとえば、レコード601−1は、ファイルパス“/file/X.txt”のブロック番号1が、HDFS513#1、#4、#6に格納されていることを示す。このように、HDFSは、1つのファイルをブロックに分割し、ブロックを複数のHDFS513に格納する。また、分割したブロックの格納先は、ブロック間で異なる組合せとなるように配置する。たとえば、ファイルパス“/file/X.txt”のブロック番号1は、HDFS513#1、#4、#6に格納されており、ファイルパス“/file/X.txt”のブロック番号2は、HDFS513#2、#4、#5に格納されている。
図6の(B)に示す説明図は、ファイルの分割方法を示している。図6の(B)では、ファイルパス“/file/X.txt”とファイルパス“/file/Y.txt”の分割方法を示している。ネームノード503は、たとえば、ファイルパス“/file/X.txt”にて示すファイルが入力されてきた場合、64[MB]ごとのブロックに分割する。ネームノード503は、1つ目のブロックの名称を“/file/X.txt−1”に設定する。同様に、ネームノード503は、2つ目のブロックの名称を“/file/X.txt−2”に設定し、3つ目のブロックの名称を“/file/X.txt−3”に設定する。
図6の(C)に示す説明図は、メタデータテーブル505の記憶内容に従った、HDFS513の記憶内容の一例を示している。たとえば、HDFS513#1は、“/file/X.txt−1”にて示されるブロックと、“/file/X.txt−3”にて示されるブロックと、“/file/Y.txt−2”にて示されるブロックと、を記憶する。
図7は、ブロックとスプリットの関係を示す説明図である。ブロックとはファイルの物理的な分割単位であり、スプリットとはデータの一連の論理的な分割単位である。図7では、ファイルパスが“/file/X.txt”にて示されるファイルを用いて、分割されたブロックと、分割されたスプリットの例を説明する。スプリットに分割する場合、ネームノード503は、“/file/X.txt”にて示されるファイルのうち、1〜5行目までをスプリット1に設定し、6〜9行目までをスプリット2に設定し、10、11行目をスプリット3に設定する。
また、ネームノード503は、“/file/X.txt”にて示されるファイルのうち、先頭の64[MB]分のデータをブロック1に設定し、次の64[MB]分のデータをブロック2に設定し、残余のデータをブロック3に設定する。
(マスタノード101の機能構成)
次に、マスタノード101の機能構成について説明する。図8は、マスタノードの機能構成例を示すブロック図である。マスタノード101は、受付部801と、検出部802と、生成部803と、第1の割当部804と、判断部805と、第2の割当部806と、を含む。制御部となる受付部801〜第2の割当部806は、記憶装置に記憶されたプログラムをCPU401が実行することにより、受付部801〜第2の割当部806の機能を実現する。記憶装置とは、具体的には、たとえば、図4に示したROM402、RAM403、磁気ディスク405などである。または、IF406を経由して他のCPUが実行することにより、受付部801〜第2の割当部806の機能を実現してもよい。
受付部801は、Map処理の開始要求を受け付ける。たとえば、受付部801は、ダミーファイルをジョブクライアント301から受け付けた場合、Map処理の開始要求として受け付ける。ダミーファイルは、たとえば、分散処理システム100の設計者によって予め指定されたファイル名称であってもよいし、データが空であるファイルをダミーファイルとしてもよい。受付部801の機能により、分散処理システム100は、順次入力されたファイルを逐次処理するMapReduce処理の開始の契機を検出できる。なお、受け付けた開始要求は、RAM403、磁気ディスク405などの記憶領域に記憶される。
検出部802は、Map処理の処理対象となるスプリットが順次入力されるデータベース110に、新たなスプリットが入力されたことを検出する。たとえば、検出部802は、データベース110を一定周期で参照し、前回からのデータベースに記憶されたスプリット一覧からの差分により、スプリットが入力されたことを検出する。または、検出部802は、ネームノード503に新たなスプリットが入力されたかを定期的に問い合わせて、入力されたという応答があれば、スプリットが入力されたことを検出してもよい。なお、マスタノード101は、スプリットをジョブクライアント301から受け付けてもよいし、ファイルを受け付けて、スプリットに分割し、データベース110に入力してもよい。スプリットを受け付けた場合、マスタノード101は、ネームノード503の制御により、受け付けたスプリットをデータベース110に入力する。
また、検出部802は、受付部801によって開始要求が受け付けられた場合、データベース110に新たなスプリットが入力されたことを検出する処理の実行を開始する。たとえば、検出部802は、開始要求が受け付けられた場合に、データベース110を一定周期で参照し始める。検出部802の機能により、分散処理システム100は、スプリットがデータベース110に入力されたタイミングにて、Map処理を実行することができる。なお、検出結果は、RAM403、磁気ディスク405などの記憶領域に記憶される。
生成部803は、受付部801によって開始要求が受け付けられた場合、Map処理の処理対象に固有の識別情報を生成する。処理対象に固有の識別情報とは、処理対象を識別可能な情報である。生成部803は、たとえば、処理対象となるスプリット1、2…に、「1」という識別情報を生成する。また、一旦末尾情報を受け付けた後、再び開始要求が受け付けられた場合、生成部803は、新たな識別情報として、たとえば、「2」という識別情報を生成する。開始要求は、ジョブ単位で通知されてくるため、識別情報は、ジョブの識別情報となる。以下、識別情報を、「ジョブID」と呼称する。なお、生成した識別情報は、RAM403、磁気ディスク405などの記憶領域に記憶される。
第1の割当部804は、検出部802によって新たなスプリットが入力されたことが検出された場合、通信可能なノード群のうちのいずれかのノードに新たなスプリットを処理対象とするMap処理を割り当てる。たとえば、第1の割当部804は、スプリット1が入力されたことが検出された場合、スレーブノード102#1〜nのうちのスレーブノード102#1に、スプリット1を処理対象とするMap処理を割り当てる。
また、第1の割当部804は、次に示す条件の場合に、ノード群のうちのいずれかのノードに、生成部803によって生成されたジョブIDとともに、新たなスプリットを処理対象とするMap処理を割り当ててもよい。条件は、検出部802によって新たなスプリットが入力されたことが検出された場合である。たとえば、第1の割当部804は、スレーブノード102#1に、ジョブID:1とともに、スプリット1を処理対象とするMap処理を割り当てる。
判断部805は、検出部802によって新たなスプリットが入力されたことが検出された場合、新たなスプリットに、Map処理の処理対象となる一連のスプリットの末尾のスプリットであることを示す末尾情報が付与されているか否かを判断する。一連のスプリットは、同一のジョブとして処理する処理対象となる。
末尾情報は、スプリットの内容とは区別可能な値である。たとえば、計測ファイルがテキストデータである場合、末尾情報は、テキストデータの末尾に記述された、道路通行量の計測結果に登場しないタグであってもよいし、バイナリデータであってもよい。タグは、たとえば、マークアップ言語にて採用されている表記方法にしたがってもよい。たとえば、末尾情報は、“<END>”という文字列となる。
判断部805は、たとえば、スプリット1に末尾情報が付与されているか否かを判断する。判断部805の機能により、順次入力されるスプリット群のうち、同一のジョブとして処理する一連のスプリットを特定することができる。なお、判断結果は、RAM403、磁気ディスク405などの記憶領域に記憶される。
第2の割当部806は、判断部805が新たなスプリットに末尾情報が付与されていると判断した場合、ノード群のうちのいずれかのノードにReduce処理を割り当てる。Reduce処理は、一連のスプリットの各々を処理対象として実行されたMap処理の処理結果の属性をもとにMap処理の処理結果を集約した1以上の処理結果を処理対象とする。
たとえば、検出部802が、スプリット1、スプリット2、スプリット3、スプリット4を順次検出し、判断部805が、スプリット4に末尾情報が付与されていると判断したとする。この場合、第2の割当部806は、スプリット1〜4を処理対象としたMap処理の処理結果の属性をもとにMap処理の処理結果を集約した1以上の処理結果を処理対象とするReduce処理を、スレーブノード102#1、2に割り当てる。
また、第2の割当部806は、新たなスプリットに末尾情報が付与されていると判断した場合、ノード群のうちのいずれかのノードに、ジョブIDとともに、1以上の処理結果を処理対象とする第2の処理を割り当ててもよい。第2の割当部806の機能により、分散処理システム100は、分散して処理されたMap処理の処理結果から、ジョブの出力結果を得ることができる。
図9は、MapReduce処理の具体例を示す説明図である。図9では、14:11〜14:15の計測ファイルを用いて、渋滞情報を算出する場合の具体例を示す。計測ファイル111は、keyとして道路の識別情報、valueとして道路を通過した種別、を組としたレコード群が記述されているとする。また、道路を通過した種別としては、“四輪車”、“二輪車”、“歩行者”の3種類があるとする。
1つ目のレコードが、(道路1,四輪車)である。2つ目のレコードが、(道路2,二輪車)である。3つ目のレコードが、(道路4,四輪車)である。ジョブトラッカー501は、1つ目から3つ目のレコード群をスプリット1とする。また、4つ目のレコードが、(道路2,四輪車)である。5つ目のレコードが、(道路3,歩行者)である。6つ目のレコードが、(道路3,四輪車)である。ジョブトラッカー501は、4つ目から6つ目のレコード群をスプリット2とする。また、7つ目のレコードが、(道路4,二輪車)である。8つ目のレコードが、(道路2,四輪車)である。9つ目のレコードが、(道路5,四輪車)である。ジョブトラッカー501は、7つ目から9つ目のレコード群をスプリット3とする。
また、Map処理は、Valueフィールドに“四輪車”が格納されているレコードを抽出する処理である。Reduce処理は、道路ごとの“四輪車”を計数する処理である。Map処理とReduce処理を行うことにより、分散処理システム100は、道路ごとの渋滞情報を算出することになる。また、分散処理システム100は、Map処理とReduce処理の間に、シャッフル&ソート処理を実行する。
ジョブスケジューラ502がデータベース110にスプリット1が入力されたことを検出した場合、ジョブトラッカー501は、スプリット1を処理対象とするMap処理1をスレーブノード102#1に割り当てる。また、ジョブスケジューラ502がスプリット2やスプリット3が入力されたことを検出した場合、ジョブトラッカー501は、スプリット2、スプリット3を処理対象とするMap処理2、Map処理3をスレーブノード102#1に割り当てる。なお、Map処理は、独立したスプリットに対して処理を行うため、それぞれ独立して動作することが可能である。
Map処理1は、(道路1,四輪車)、(道路2,二輪車)、(道路4,四輪車)のうち、(道路1,四輪車)、(道路4,四輪車)を抽出する。また、Map処理2は、(道路2,四輪車)、(道路3,歩行者)、(道路3,四輪車)のうち、(道路2,四輪車)、(道路3,四輪車)を抽出する。また、Map処理3は、(道路4,二輪車)、(道路2,四輪車)、(道路5,四輪車)のうち、(道路2,四輪車)、(道路5,四輪車)を抽出する。Map処理1〜3は、処理が完了すると、タスクトラッカー511を経由して、ジョブトラッカー501に処理が完了したことを通知する。
同様に、ジョブトラッカー501は、14:12の計測ファイル901を分割したスプリット群を処理対象とするMap処理4〜6をスレーブノード102#2に割り当てる。Map処理4は、計測ファイル901を分割したスプリットのうち、(道路1,四輪車)、(道路4,四輪車)を抽出する。Map処理5は、計測ファイル901を分割したスプリットのうち、(道路5,四輪車)を抽出する。Map処理6は、計測ファイル901を分割したスプリットのうち、(道路1,四輪車)、(道路6,四輪車)を抽出する。同様に、ジョブトラッカー501は、14:15の計測ファイル113を分割したスプリット群を処理対象とするMap処理Lをスレーブノード102#nに割り当てる。Lは、1以上の整数である。
Map処理1〜Lの処理が完了した場合、ジョブトラッカー501は、Map処理1〜Lの処理結果を処理対象とするシャッフル&ソート処理1〜Mをスレーブノード102#1〜nに実行させる。Mは1以上の整数である。たとえば、ジョブトラッカー501は、keyフィールドが“道路1”、または“道路2”となるレコードを処理対象とするシャッフル&ソート処理1をスレーブノード102#1に割り当てる。ジョブトラッカー501は、keyフィールドが“道路1”、または“道路2”となったレコードをスレーブノード102#1に送信するように、スレーブノード102#1以外のスレーブノード102に指示する。同様に、ジョブトラッカー501は、keyフィールドが“道路3”、または“道路4”となるレコードを処理対象とするシャッフル&ソート処理2をスレーブノード102#2に割り当てる。
たとえば、シャッフル&ソート処理1は、処理結果の属性の一つであるkeyフィールドの“道路1”に関して、(道路1,(四輪車,四輪車,四輪車))のように集約する。また、シャッフル&ソート処理1は、“道路2”に関して、(道路2,(四輪車,四輪車))のように集約する。また、シャッフル&ソート処理2は、“道路3”に関して、(道路3,(四輪車))のように集約する。また、シャッフル&ソート処理2は、“道路4”に関して、(道路4,(四輪車,四輪車))のように集約する。シャッフル&ソート処理は、シャッフル&ソート処理を実行するスレーブノード102同士が協調して動作する。また、シャッフル&ソート処理は、Map処理が全て完了した後に行われる。
シャッフル&ソート処理が完了した場合、ジョブトラッカー501は、シャッフル&ソート処理の処理結果を処理対象とするReduce処理1〜Nをスレーブノード102#1〜nに実行させる。Nは、1以上の整数である。たとえば、ジョブトラッカー501は、“道路1”に対して集約した処理結果を処理対象とするReduce処理1をスレーブノード102#1に割り当てる。また、ジョブトラッカー501は、“道路2”に対して集約した処理結果を処理対象とするReduce処理2をスレーブノード102#1に割り当てる。同様に、ジョブトラッカー501は、“道路3”に対して集約した処理結果を処理対象とするReduce処理3と、“道路4”に対して集約した処理結果を処理対象とするReduce処理4とを、スレーブノード102#2に割り当てる。
たとえば、Reduce処理1は、(道路1,(四輪車,四輪車,四輪車))から、“四輪車”の個数を計数し、(道路1,3)を出力する。また、Reduce処理2は、(道路2,(四輪車,四輪車))から、“四輪車”の個数を計数し、(道路2,2)を出力する。また、Reduce処理3は、(道路3,(四輪車))から、“四輪車”の個数を計数し、(道路3,1)を出力する。また、Reduce処理4は、(道路4,(四輪車,四輪車))から、“四輪車”の個数を計数し、(道路4,2)を出力する。なお、Reduce処理は、独立したスプリットに対して処理を行うため、それぞれ独立して動作することが可能である。
次に、MapReduce処理が実行されるタイミングについて図10と図11を用いて説明する。図10では、スプリットに末尾情報が付与されていなく、順次入力されたスプリットを一度に処理する場合のMapReduce処理が実行されるタイミングについて説明する。図11では、実施の形態1の特徴となる動作である、順次入力されたスプリットを逐次実行する場合のMapReduce処理が実行されるタイミングについて説明する。
以下、図10と図11に共通する説明を行う。図10と図11では、時刻0から時刻8tまでの時間帯を示しており、時刻0〜時刻8tの時間間隔は等間隔とし、1つの時間間隔をtとする。また、Map処理の処理時間を2tとし、シャッフル&ソート処理とReduce処理の処理時間を、1tとする。また、Map処理、シャッフル&ソート処理、Reduce処理は、スレーブノード102#1、2にて実行されるとする。また、計測ファイル111が分割されたスプリット1がデータベース110に入力される時刻を時刻0とし、計測ファイル112が分割されたスプリット2がデータベース110に入力される時刻を時刻tとする。また、計測ファイル113が分割されたスプリット3がデータベース110に入力される時刻を時刻2tとし、計測ファイル113が分割されたスプリット4がデータベース110に入力される時刻を時刻3tとする。
また、14:11から14:15の計測ファイルを用いて渋滞情報を算出するというジョブID:1が付与されたジョブがジョブクライアント301に登録されているものとする。また、図10および図11には時刻14:11〜時刻14:13の計測ファイルに対する処理を図示していないが、スレーブノード102#1〜nのいずれかのスレーブノード102にて処理しているものとする。
図10は、順次入力されたスプリットを一度に処理するMapReduce処理の処理例を示す説明図である。図10に示す分散処理システム100は、時刻4tになり、14:11から14:15の計測ファイルが分割されたスプリットが揃った時点にて、ジョブID:1のジョブを実行開始する。時刻4tにて、ジョブトラッカー501は、計測ファイル111のスプリット1を処理対象とするMap処理1と、計測ファイル113のスプリット3を処理対象とするMap処理3をスレーブノード102#1に割り当てる。さらに、ジョブトラッカー501は、計測ファイル112のスプリット2を処理対象とするMap処理2と、計測ファイル113のスプリット4を処理対象とするMap処理4をスレーブノード102#2に割り当てる。
時刻4tから時刻5tにかけて、スレーブノード102#1は、Map処理1を実行する。Map処理1の完了後、時刻6tから時刻7tにかけて、スレーブノード102#1は、Map処理3を実行する。同様に、時刻4tから時刻5tにかけて、スレーブノード102#2は、Map処理2を実行する。Map処理2の完了後、時刻6tから時刻7tにかけて、スレーブノード102#1は、Map処理4を実行する。
Map処理1〜4が完了した後、時刻8tにて、ジョブトラッカー501は、Map処理結果1とMap処理結果3を処理対象とするシャッフル&ソート処理1をスレーブノード102#1に割り当てる。同様に、時刻8tにて、ジョブトラッカー501は、Map処理結果2とMap処理結果4を処理対象とするシャッフル&ソート処理2をスレーブノード102#2に割り当てる。
時刻8tにて、スレーブノード102#1は、シャッフル&ソート処理1を実行する。シャッフル&ソート処理1が完了後、時刻9tにて、スレーブノード102#1は、Reduce処理1を実行する。同様に、時刻8tにて、スレーブノード102#2は、シャッフル&ソート処理2を実行する。シャッフル&ソート処理2が完了後、時刻9tにて、スレーブノード102#2は、Reduce処理2を実行する。このように、順次入力されたファイルを一度に処理するMapReduce処理の場合、ジョブID:1の処理時間は9tとなる。
図11は、順次入力されたスプリットを逐次処理するMapReduce処理の具体例を示す説明図である。図11に示す分散処理システム100は、時刻0にて、ジョブID:1のジョブの処理対象となる、計測ファイル111のスプリット1がデータベース110に入力された時点にて、ジョブID:1のジョブを実行開始する。スプリット1がデータベース110に入力された場合、ジョブトラッカー501は、スプリット1を処理対象とするMap処理1をスレーブノード102#1に割り当てる。時刻tから時刻2tにかけて、スレーブノード102#1は、Map処理1を実行する。
時刻tにて、計測ファイル112が分割されたスプリット2が入力された場合、ジョブトラッカー501は、スプリット2を処理対象とするMap処理2をスレーブノード102#2に割り当てる。時刻2tから時刻3tにかけて、スレーブノード102#2は、Map処理2を実行する。
時刻2tにて、計測ファイル113が分割されたスプリット3が入力された場合、ジョブトラッカー501は、スプリット3を処理対象とするMap処理3をスレーブノード102#1に割り当てる。また、時刻3tにて、計測ファイル113が分割されたスプリット4が入力された場合、ジョブトラッカー501は、計測ファイル113のスプリット4を処理対象とするMap処理4をスレーブノード102#2に割り当てる。時刻3tから時刻4tにかけて、スレーブノード102#1は、Map処理3を実行する。Map処理2の完了後、時刻4tから時刻5tにかけて、スレーブノード102#2は、Map処理4を実行する。
Map処理1〜4が完了した後、時刻6tにて、ジョブトラッカー501は、Map処理結果1とMap処理結果3を処理対象とするシャッフル&ソート処理1をスレーブノード102#1に割り当てる。同様に、時刻6tにて、ジョブトラッカー501は、Map処理結果2とMap処理結果4を処理対象とするシャッフル&ソート処理2をスレーブノード102#2に割り当てる。
時刻6tにて、スレーブノード102#1は、シャッフル&ソート処理1を実行する。シャッフル&ソート処理1が完了後、時刻7tにて、スレーブノード102#1は、Reduce処理1を実行する。同様に、時刻6tにて、スレーブノード102#2は、シャッフル&ソート処理2を実行する。シャッフル&ソート処理2が完了後、スレーブノード102#2は、Reduce処理2を実行する。このように、入力されたファイルを逐次処理するMapReduce処理の場合、ジョブID:1の処理時間は7tとなる。図10の動作と比較して、図11の動作では、Map処理を先行して処理することができるため、ジョブにかかる処理の時間短縮が可能となる。続けて、図11にて示した動作を行うMapReduce処理を図12、図13を用いて説明する。
図12および図13は、MapReduce処理手順の一例を示すフローチャート(その1)および(その2)である。MapReduce処理は、ジョブの実行要求を受け付けた場合に実行する処理である。また、図12と図13では、MapReduce処理を実行するスレーブノード102がスレーブノード102#1、2の2台にて実行する場合を想定して説明する。また、マスタノード101では、ジョブトラッカー501とジョブスケジューラ502が連携して、MapReduce処理を実行する。また、スレーブノード102#1、2では、タスクトラッカー511と、Mapタスク514と、Reduceタスク515が連携して、MapReduce処理を実行する。
図12に示すフローチャートにて、ジョブトラッカー501は、準備処理を実行する(ステップS1201)。準備処理の詳細は、図14にて後述する。準備処理の実行後、ジョブトラッカー501とジョブスケジューラ502は、初期化処理を実行する(ステップS1202)。初期化処理の詳細は、図15にて後述する。初期化処理の終了後、ジョブスケジューラ502は、スプリットがHDFSに入力されたことを検出したか否かを判断する(ステップS1203)。入力されたスプリットがない場合(ステップS1203:No)、ジョブスケジューラ502は、一定時間経過後、ステップS1203の処理を再び実行する。
入力されたスプリットがある場合(ステップS1203:Yes)、ジョブスケジューラ502は、Mapタスク生成処理を実行する(ステップS1204)。Mapタスク生成処理の詳細は、図16にて後述する。Mapタスク生成処理の終了後、ジョブトラッカー501は、Mapタスク割当処理を実行する(ステップS1205)。Mapタスク割当処理の詳細は、図17にて後述する。また、Mapタスクが割り当てられたスレーブノード102は、図13にて示す処理に移行する。
たとえば、ステップS1205の1回目の処理にて、Mapタスク514がスレーブノード102#1に割り当てられた場合、タスクトラッカー511#1とMapタスク514#1は、図13に示すステップS1301の処理を実行する。また、ステップS1205の2回目の処理にて、Mapタスク514がスレーブノード102#2に割り当てられた場合、タスクトラッカー511#2とMapタスク514#2は、図13に示すステップS1303の処理を実行する。
Mapタスク割当処理の終了後、ジョブスケジューラ502は、末尾情報が付与されたスプリットを検出したか否かを判断する(ステップS1206)。末尾情報が付与されたスプリットを検出したか否かを判断する例としては、たとえば、後述するステップS1605の処理によって末尾情報が付与されたスプリットを検出したことを記憶しているか否かを判断することである。末尾情報が付与されたスプリットを検出していない場合(ステップS1206:No)、ジョブスケジューラ502は、ステップS1203の処理に移行する。末尾情報が付与されたスプリットを検出した場合(ステップS1206:Yes)、ジョブトラッカー501は、図13に示すステップS1305の処理に移行する。なお、ステップS1206:Yesの場合、ジョブスケジューラ502は、初期化処理内の、後述するステップS1503が行われるまで、内部キューを一定時間おきに参照する。
次に、図13に示すフローチャートにて、タスクトラッカー511#1とMapタスク514#1は、Map処理を実行する(ステップS1301)。Map処理の詳細は、図18にて後述する。Map処理の終了後、タスクトラッカー511#1は、Map処理の完了をマスタノード101に通知する(ステップS1302)。同様に、タスクトラッカー511#2とMapタスク514#2は、Map処理を実行する(ステップS1303)。Map処理の終了後、タスクトラッカー511#2は、Map処理の完了をマスタノード101に通知する(ステップS1304)。
ステップS1206の終了後、ジョブトラッカー501は、Map処理の完了を受け付けたか否かを判断する(ステップS1305)。Map処理の完了を受け付けていない場合(ステップS1305:No)、ジョブトラッカー501は、一定時間経過後、ステップS1305の処理を再び実行する。Map処理の完了を受け付けた場合(ステップS1305:Yes)、ジョブトラッカー501は、Map処理が完了したスレーブノード102に対して、Map処理結果の送信を指示する(ステップS1306)。
Map処理結果の送信指示を受け付けたタスクトラッカー511#1は、Map処理結果をスレーブノード102#2に送信する(ステップS1307)。このとき、送信対象となるMap処理結果は、スレーブノード102#2にて実行される予定のシャッフル&ソート処理およびReduce処理の処理対象となるデータである。同様に、Map処理結果の送信指示を受け付けたタスクトラッカー511#2は、Map処理結果をスレーブノード102#1に送信する(ステップS1308)。
ステップS1306の実行終了後、ジョブトラッカー501は、Map処理の完了を同一ジョブIDの全てのMap処理から受け付けたか否かを判断する(ステップS1309)。同一ジョブIDのMap処理にて、まだ完了を受け付けていないMap処理がある場合(ステップS1309:No)、ステップS1305の処理に移行する。同一ジョブIDの全てのMap処理から完了を受け付けた場合(ステップS1309:Yes)、ジョブトラッカー501は、該当のジョブIDのシャッフル&ソート処理の実行をジョブトラッカー501に指示する(ステップS1310)。ステップS1310の終了後、ジョブトラッカー501は、MapReduce処理を終了する。
シャッフル&ソート処理の実行指示を受け付けたタスクトラッカー511#1は、Reduceタスク515#1にシャッフル&ソート処理を実行させる(ステップS1311)。シャッフル&ソート処理の詳細は、図19にて後述する。シャッフル&ソート処理の実行後、Reduceタスク515#1は、Reduce処理を実行する(ステップS1312)。Reduce処理の詳細は、図20にて後述する。Reduce処理の終了後、タスクトラッカー511#1は、MapReduce処理を終了する。なお、Reduceタスク515#1も、Reduce処理終了後に、処理を終了する。
また、シャッフル&ソート処理の実行指示を受け付けたタスクトラッカー511#2は、Reduceタスク515#2にシャッフル&ソート処理を実行させる(ステップS1313)。シャッフル&ソート処理の実行後、Reduceタスク515#2は、Reduce処理を実行する(ステップS1314)。Reduce処理の終了後、タスクトラッカー511#2は、MapReduce処理を終了する。MapReduce処理を実行することにより、分散処理システム100は、ジョブの実行に関して、入力されたスプリットを検出した時に順次Map処理を実行することができ、ジョブの実行にかかる処理時間を短縮することができる。
次に、図14〜図20にて、MapReduce処理にて呼び出される処理のフローチャートを説明する。図14〜図20では、実行主体が1つのソフトウェアによる装置である場合、表示の簡略化のため、各ステップ内の実行主体の表記を省略する。
図14は、準備処理手順の一例を示すフローチャートである。準備処理は、ジョブを実行する前に実行しておく処理である。また、準備処理は、マスタノード101のジョブトラッカー501が実行する。
ジョブトラッカー501は、ジョブクライアント301から、“プログラム名+ダミー入力ファイル名”となるジョブ実行要求を受け付ける(ステップS1401)。次に、ジョブトラッカー501は、ジョブIDを生成する(ステップS1402)。続けて、ジョブトラッカー501は、生成したジョブIDをジョブクライアント301に通知する(ステップS1403)。ジョブトラッカー501は、ジョブのダミー入力スプリットをパラメータとして、MapReduceプログラム521を開始する(ステップS1404)。ステップS1404の実行完了後、ジョブトラッカー501は、準備処理を終了する。準備処理を実行することにより、分散処理システム100は、ジョブの実行を開始できる。
また、ステップS1401の処理にて、“プログラム名+実ファイル名”となるジョブ実行要求を受け付けた場合、分散処理システム100は、図10にて示したMapReduce処理を実行してもよい。この場合、ジョブトラッカー501は、ステップS1403の実行後、実ファイルから、入力スプリットを算出する。具体的な算出処理として、ジョブトラッカー501は、実ファイルを64[MB]ごとに分割して、入力スプリットを算出する。また、分散処理システム100は、ステップS1203の処理を行わず、Yesのルートを処理する。また、ジョブトラッカー501は、ステップS1206の処理を、「実ファイル名が分割されたスプリットを全て読み込んだか?」とする。
また、ステップS1401の処理にて、“プログラム名+実ファイル名+ダミー入力ファイル名”となるジョブ実行要求を受け付けた場合、分散処理システム100は、既に入力済みのスプリットに対して図10にて示したMapReduce処理を実行してもよい。続けて、分散処理システム100は、これから入力されてくるスプリットに対して図10にて示したMapReduce処理を実行してもよい。
このような処理を行う場合、ジョブトラッカー501は、ステップS1403の実行後、実ファイルから、入力スプリット数を算出する。また、分散処理システム100は、ステップS1203の処理を行わず、Yesのルートを処理する。また、ジョブトラッカー501は、ステップS1206の処理を、「実ファイル名が分割されたスプリットを全て読み込んだか」とする。全て読み込んだ後、ジョブトラッカー501は、ステップS1203の処理を行う。さらに、ジョブトラッカー501は、ステップS1206の処理を、「末尾情報が付与されたスプリットを検出したか?」とする。
図15は、初期化処理手順の一例を示すフローチャートである。初期化処理は、ジョブの初期化を行う処理である。また、初期化処理は、マスタノード101のジョブトラッカー501と、ジョブスケジューラ502とが連携して実行する。ジョブトラッカー501は、ジョブクライアント301から、ジョブの初期化要求を受け付ける(ステップS1501)。次に、ジョブトラッカー501は、初期化したジョブを内部キューに格納する(ステップS1502)。ステップS1503の処理完了後、ジョブトラッカー501は、初期化処理を終了する。
ジョブスケジューラ502は、内部キューにジョブがあるか否かを一定周期にて判断している。ステップS1502の実行後、ジョブスケジューラ502は、内部キューからジョブを取り出す(ステップS1503)。ステップS1503の処理完了後、ジョブスケジューラ502は、初期化処理を終了する。初期化処理を実行することにより、分散処理システム100は、実行要求のあったジョブ順に処理を実行することができる。
図16は、Mapタスク生成処理手順の一例を示すフローチャートである。Mapタスク生成処理は、スレーブノード102に割り当てるMapタスク514を生成する処理である。また、Mapタスク生成処理は、ジョブスケジューラ502が実行する。
ジョブスケジューラ502は、HDFSに入力されたスプリットを取得する(ステップS1601)。次に、ジョブスケジューラ502は、スプリットを処理対象とする1つのMapタスク514を生成する(ステップS1602)。続いて、ジョブスケジューラ502は、生成したMapタスク514に、ジョブIDを付与する(ステップS1603)。次に、ジョブスケジューラ502は、スプリットに末尾情報が付与されているか否かを判断する(ステップS1604)。
末尾情報が付与されている場合(ステップS1604:Yes)、ジョブスケジューラ502は、末尾情報が付与されたスプリットを検出したことを記憶する(ステップS1605)。ステップS1605の処理完了後、または、末尾情報が付与されていない場合(ステップS1604:No)、ジョブスケジューラ502は、Mapタスク生成処理を終了する。Mapタスク生成処理を実行することにより、分散処理システム100は、スレーブノード102に割り当てるMapタスク514を生成できる。
図17は、Mapタスク割当処理手順の一例を示すフローチャートである。Mapタスク割当処理は、スレーブノード102にMapタスク514を割り当てる処理である。また、Mapタスク割当処理は、ジョブスケジューラ502によるMapタスク514の生成後、ジョブトラッカー501が実行する。
ジョブトラッカー501は、タスクトラッカー511から受け付けたハートビート通信を参照して、Mapタスク514の割当先を決定する(ステップS1701)。ハートビート通信は、各スレーブノード102にて新たに実行可能なタスク数を含む。たとえば、あるスレーブノード102が、実行可能なタスク数の最大が5であり、Mapタスク514およびReduceタスク515が計3つ実行中であるとする。この場合、あるスレーブノード102は、ハートビート通信に、新たに実行可能なタスク数が2であるという情報を含めてマスタノード101に通知する。ジョブトラッカー501は、スレーブノード102#1〜nのうち、たとえば、新たに実行可能なタスク数が最も大きいスレーブノード102を、Mapタスク514の割当先に決定する。
ステップS1701の処理完了後、ジョブトラッカー501は、決定した割当先に、Mapタスク514を割り当てる(ステップS1702)。ステップS1702の処理完了後、ジョブトラッカー501は、Mapタスク割当処理を終了する。Mapタスク割当処理を実行することにより、分散処理システム100は、Map処理を各スレーブノード102に分散することができる。
図18〜図20では、スレーブノード102にて行われる処理についてのフローチャートを示す。図18〜図20にて示すフローチャートは、スレーブノード102#1〜nのうちのいずれのスレーブノード102も行う。以下では、説明の簡略化のため、スレーブノード102#1が実行する場合を例にして説明する。
図18は、Map処理手順の一例を示すフローチャートである。Map処理は、処理対象となるスプリットから、(key,Value)を生成する処理である。また、Map処理は、タスクトラッカー511#1と、スレーブノード102#1に割り当てられたMapタスク514#1とが連携して実行する。
タスクトラッカー511#1は、ジョブプログラムをHDFSからスレーブノード102#1のローカル記憶領域にコピーする(ステップS1801)。次に、タスクトラッカー511#1は、スプリットをHDFSから、スレーブノード102#1のローカル記憶領域にコピーする(ステップS1802)。ステップS1802の処理完了後、タスクトラッカー511#1は、Map処理を終了する。
続けて、Mapタスク514#1は、スプリットを処理対象として、ジョブプログラム内のMap処理を実行する(ステップS1803)。ステップS1803の処理完了後、Mapタスク514#1は、Map処理を終了する。Map処理を実行することにより、分散処理システム100は、分割されたスプリットに対して、他のスプリットとは独立してジョブの処理を実行することができる。
図19は、シャッフル&ソート処理手順の一例を示すフローチャートである。シャッフル&ソート処理は、Map処理の処理結果を処理対象として、1つ以上の処理結果に集約する処理である。また、シャッフル&ソート処理は、スレーブノード102#1に割り当てられたReduceタスク515#1が実行する。
Reduceタスク515#1は、各Mapタスクの処理結果となるレコードに含まれるジョブIDが同一となるレコードを処理対象に設定する(ステップS1901)。次に、Reduceタスク515#1は、処理対象を、Keyフィールドの値が同一のレコード同士で集約する(ステップS1902)。続けて、Reduceタスク515#1は、Keyフィールドをもとに、並び替える(ステップS1903)。次に、Reduceタスク515#1は、処理結果を、Reduce処理に送信する(ステップS1904)。ステップS1904の処理完了後、Reduceタスク515#1は、シャッフル&ソート処理を終了する。シャッフル&ソート処理の処理結果を用いることにより、スレーブノード102は、次に実行するReduce処理を実行しやすくする。
図20は、Reduce処理手順の一例を示すフローチャートである。Reduce処理は、集約された処理結果を処理対象として、ジョブの処理結果を出力する処理である。また、Reduce処理は、Reduceタスク515#1が実行する。
Reduceタスク515は、Keyフィールドの値が同一となるレコード群を処理対象として、ジョブプログラム内のReduce処理を実行する(ステップS2001)。次に、Reduceタスク515は、Reduce処理の処理結果を出力する(ステップS2002)。ステップS2002の処理完了後、Reduceタスク515は、Reduce処理を終了する。Reduce処理を実行することにより、分散処理システム100は、ジョブクライアント301にジョブの実行を要求した装置に出力結果を提示することができる。
以上説明したように、実施の形態1にかかる割当装置によれば、データベース110に順次入力されるスプリットに対してMap処理を逐次割り当て、ジョブを区切る末尾情報が付いたスプリットまでのMap処理完了後にシャッフル処理に移行する。スプリットに対して逐次Map処理を割り当てることと、末尾情報が付与されたスプリットまでシャッフル&ソート処理の実行を待つことにより、分散処理システム100は、同一ジョブのMap処理の実行時間帯の集中を避けることができる。
たとえば、分散処理システム100は、Map処理の実行時間帯の集中を避け、Map処理を先行して実行することにより、Map処理の実行待ちの時間が短縮されるため、同一ジョブの処理時間を短縮することができる。また、同一ジョブのMap処理の実行時間帯が集中する場合、データベース110へのアクセス負荷が増大し、スプリットを取得するのに時間がかかるため、Map処理が遅延してしまう。実施の形態1にかかる分散処理システム100は、同一ジョブのMap処理の実行時間帯の集中を避けることができるため、アクセス負荷が増大せず、Map処理の遅延を抑制できる。また、分散処理システム100は、現在のジョブに含まれるスプリットの個数を取得しなくとも、正しい処理結果を得ることができる。
また、実施の形態1にかかる割当装置によれば、開始要求を受け付けた場合、新たなスプリットが入力されたことを検出する処理の実行を開始してもよい。これにより、分散処理システム100は、開始要求となるダミーファイルを受け付けた場合に図11にて示したMapReduce処理を行い、実ファイルを受け付けた場合に図10にて示したMapReduce処理を行う、といった処理の切り替えが行える。図10にて示したMapReduce処理では、一度にMap処理を行うため、Map処理の処理結果を各スレーブノード102が保持する時間を短くすることができる。
たとえば、1日ごとの計測ファイルを1か月分用いて処理するジョブがあった場合、図11に示したMapReduce処理は、初めの1日目の計測ファイルに対するMap処理の処理結果を、1か月分保持し続けることになる。このようなジョブを実行する場合、分散処理システム100は、初めに実スプリットを受け付けることにより、図10にて示したMapReduce処理を実行できる。また、開始要求を受け付けることにより、これからMap処理の割当を行うことが事前にわかるため、割当装置は、割当の準備をすることができる。たとえば、データベース110がHDFSであれば、タスクが割り当てられていないスレーブノード102があるか否かを事前に調べておくことができる。
また、分散処理システム100は、入力済みのスプリットに対して図10にて示したMapReduce処理を行い、続けて、これから入力されるスプリットに対して図11にて示したMapReduce処理を行ってもよい。たとえば、1日ごとの計測ファイルを1か月分用いて処理するジョブがあり、29日目にてジョブを開始する場合を想定する。このとき、分散処理システム100は、1〜29日目の計測ファイルに対して図10にて示したMapReduce処理を行う。次に、分散処理システム100は、30日目の計測ファイルが入力されるのを待ち、入力されたら計測ファイルが分割されたスプリットに対して図11にて示したMapReduce処理を行う。
また、実施の形態1にかかる割当装置によれば、ジョブIDとMap処理をスレーブノード102に割り当てるとともに、ジョブIDとReduce処理をスレーブノード102に割り当ててもよい。これにより、ジョブトラッカー501は、スレーブノード102内に記憶されているMap処理の処理結果が複数のジョブ分存在する場合、集約対象となるスプリットを、ジョブIDを用いて指定することができる。
(実施の形態2)
実施の形態1にかかる分散処理システム100では、データベース110に順次入力されたスプリットに対して、末尾情報が付与されたスプリットを検出するまで同一のジョブとしてMap処理を実行している。しかし、データベース110に入力されるスプリットの順番が期待した通りとはならない場合も有り得る。たとえば、ジョブトラッカー501が、計測ファイル113を分割してスプリット3、末尾情報が付与されたスプリット4という順序でデータベース110に入力したとする。このとき、スプリット3が入力の途中で送信エラーとなって再送となった場合、スプリット4がスプリット3より先にデータベース110に入力されることになる。また、スプリット4のデータサイズが小さく、スプリット3より先に入力完了した場合も、スプリット4がスプリット3より先にデータベース110に入力されることになる。
上述した現象が発生した場合、実施の形態1にかかる分散処理システム100では、スプリット3を次のジョブの処理対象として扱うため、期待する処理結果を得られない場合がある。そこで、実施の形態2にかかる分散処理システム100は、スプリットの入力される順番が保証されていなくとも、正しい処理結果が得られるようにする。なお、実施の形態1において説明した箇所と同様の箇所については、同一符号を付して図示および説明を省略する。
図21は、実施の形態2にかかる分散処理システムの動作例を示す説明図である。図21に示す、実施の形態2にかかる分散処理システム2100は、実施の形態2にかかるマスタノード2101と、スレーブノード102と、データベース110と、を含む。図21では、分散処理システム2100の時刻t1における状態と、時刻t2における状態とを表示する。なお、時刻t1、時刻t2の順に時間が経過しているとする。また、分散処理システム2100では、マスタノード2101が、計測ファイルをスプリットに分割するとする。
図21に示す時刻t1の前に、マスタノード2101は、渋滞情報を算出するというジョブの実行要求を受け付けているとする。このとき、マスタノード2101は、ジョブに対して、ジョブID:1を生成する。次に、マスタノード2101は、14:11〜14:14の計測ファイルを受け付ける。このとき、マスタノード2101は、14:11〜14:14の計測ファイルを分割し、各スプリットにジョブID:1を示す情報を付与する。また、マスタノード2101は、各スプリットの個数を記憶しておく。時刻t1の前の時点にて、マスタノード2101は、14:11〜14:14のスプリットの個数が10であったとして記憶したとする。続けて、マスタノード2101は、10個のスプリットを処理対象とするMap処理をスレーブノード102#1とスレーブノード102#2に、それぞれ割り当てる。
図21に示す時刻t1において、マスタノード2101は、14:15の計測ファイル113を受け付けた場合、計測ファイル113を4つのスプリットに分割する。また、マスタノード2101は、14:15の計測ファイル113がジョブID:1の末尾のファイルであることを判断し、ジョブID:1の処理対象となる一連のスプリットの個数が10+4=14であると記憶する。なお、計測ファイル113がジョブID:1の末尾のファイルであることを判断する方法としては、たとえば、ジョブクライアント301が、計測ファイル113をジョブID:1の末尾のファイルであることをマスタノード2101に通知することである。
スプリットの分割後、マスタノード2101は、分割したスプリット11〜14にジョブID:1を付与する。続けて、マスタノード2101は、スプリット11〜14をデータベース110に入力する。このとき、データベース110にスプリット11〜14を入力する順序はどのような順序であってもよい。マスタノード2101は、データベース110にスプリット11〜14のいずれかのスプリットが入力されたことを検出すると、いずれかのスプリットを処理対象とするMap処理をスレーブノード102#1、2に割り当てる。
また、マスタノード2101は、データベース110に入力されたスプリットの個数を計数し、計数したジョブID:1の処理対象となる一連のスプリットの個数と比較する。一連のスプリットの個数と入力されたスプリットの個数とが一致した場合、マスタノード2101は、いずれかのスプリットが一連のスプリットの末尾のスプリットであると判断する。判断後の動作について、時刻t2にて説明する。
図21に示す時刻t2において、マスタノード2101は、Map処理結果の属性をもとに、Map処理の処理結果を集約するシャッフル&ソート処理1、2を、スレーブノード102#1と、スレーブノード102#2に割り当てる。このように、分散処理システム2100は、データベースに順次入力されるデータに対してMap処理を逐次実行し、入力されたスプリットの個数と、一連のスプリットの個数とが一致した場合、シャッフル処理に移行する。これにより、分散処理システム2100は、スプリットの入力される順番が保証されていなくとも、正しい処理結果を得ることができる。以下、図22〜図25を用いて、実施の形態2にかかる分散処理システム2100の説明を行う。
(マスタノード2101の機能構成)
図22は、実施の形態2にかかるマスタノードの機能構成例を示すブロック図である。実施の形態2にかかるマスタノード2101は、受付部801と、検出部802と、生成部803と、第1の割当部804と、第2の割当部806と、第1の判断部2201と、第2の判断部2202とを含む。
制御部となる受付部801〜第1の割当部804、第2の割当部806、第1の判断部2201、第2の判断部2202は、記憶装置に記憶されたプログラムをCPU401が実行することにより、機能を実現する。記憶装置とは、具体的には、たとえば、図4に示したROM402、RAM403、磁気ディスク405などである。または、IF406を経由して他のCPUが実行することにより、受付部801〜第1の割当部804、第2の割当部806、第1の判断部2201、第2の判断部2202の機能を実現してもよい。実施の形態2にかかる受付部801〜第1の割当部804は、実施の形態1にかかる受付部801〜第1の割当部804と同一の機能であるため、説明を省略する。
第1の判断部2201は、次に示す条件を満たす場合、データ群に含まれるスプリットの個数とデータベース110に入力されたスプリットの個数とに基づいて、スプリット群がデータベース110に入力されたか否かを判断する。条件は、検出部802によって新たなスプリットが入力されたことが検出された場合である。スプリット群は、たとえば、1つのファイルである。また、データベース110に入力されたスプリットの個数は、マスタノード2101のローカル記憶領域に入力された個数であってもよい。
たとえば、第1の判断部2201は、ファイルに含まれるスプリットの個数と入力されたスプリットの個数が一致した場合、ファイルが分割されたスプリット群がデータベース110に入力されたと判断する。また、第1の判断部2201は、ファイルに含まれるスプリットの個数と入力されたスプリットの個数が異なった場合、ファイルが分割されたスプリット群のうちデータベース110に入力されていないスプリットがあると判断する。
また、第1の判断部2201は、検出部802によって新たなスプリットが入力されたことが検出された場合、データベース110に入力されたスプリットの個数をインクリメントしてもよい。たとえば、現在のデータベース110に入力されたスプリットの個数が10であり、検出部802によって新たなスプリットが入力されたことが検出された場合、第1の判断部2201は、入力されたスプリットの個数を11にインクリメントする。
また、第1の判断部2201は、第1の割当部804によってノード群のうちのいずれかのノードにMap処理が割り当てられた場合、データベース110に入力されたデータの個数をインクリメントしてもよい。たとえば、現在のデータベース110に入力されたスプリットの個数が10であり、第1の割当部804によっていずれかのノードにMap処理が割り当てられた場合、判断部2201は、入力されたスプリットの個数を11にインクリメントする。なお、判断結果は、RAM403、磁気ディスク405などの記憶領域に記憶される。
第2の判断部2202は、検出部802によって新たなスプリットが入力されたことが検出された場合、スプリット群がMap処理の処理対象となる一連のスプリット群の末尾のスプリット群であるか否かを判断する。たとえば、マスタノード2101がジョブクライアントから末尾のファイルを送信したことを受け付けた場合に末尾のファイルを受け付けたことを記憶しておく。第2の判断部2202は、末尾のファイルを受け付けたことを記憶する記憶領域を参照して、末尾のファイルを受け付けていた場合、スプリット群の分割元であるファイルが、Map処理の処理対象となる一連のファイルの末尾のファイルであると判断する。
第2の割当部806は、次に示す条件を満たす場合、ノード群のうちのいずれかのノードに、Reduce処理を割り当てる。条件は、第1の判断部2201によってスプリット群がデータベース110に入力されたと判断されており、かつ、第2の判断部2202によってスプリット群が一連のスプリット群の末尾のスプリット群であると判断された場合である。なお、実施の形態2にかかる第2の割当部806は、実施の形態1にかかる第2の割当部806と比較して、実行する契機が異なるだけであるため、詳細の説明を省略する。
以下、図23〜図25を用いて実施の形態2にかかるMapReduce処理と、実施の形態2にかかるMapReduce処理から呼び出される処理について説明する。なお、実施の形態2にかかるMapReduce処理手順の一例を示すフローチャート(その2)は、図13にて示したMapReduce処理手順の一例を示すフローチャート(その2)と同一であるため、説明を省略する。また、実施の形態2にかかる準備処理と、初期化処理と、Mapタスク割当処理と、シャッフル&ソート処理と、Reduce処理とは、実施の形態1にかかる同名の処理と同一の処理内容であるため、説明を省略する。
図23は、実施の形態2にかかるMapReduce処理手順の一例を示すフローチャート(その1)である。実施の形態2にかかるMapReduce処理のうち、ステップS2301、ステップS2302、ステップS2305、ステップS2307、ステップS2308は、ステップS1201〜ステップS1205と同一であるため、説明を省略する。
ステップS2302の終了後、ジョブスケジューラ502は、入力された現在のジョブIDのスプリットの個数を0に設定する(ステップS2303)。ステップS2303の実行後、ジョブトラッカー501は、ファイル受付処理を実行する(ステップS2304)。ファイル受付処理は、図24にて後述する。ステップS2304の実行後、ジョブスケジューラ502は、ステップS2305の処理を実行する。また、入力されたスプリットがある場合(ステップS2305:Yes)、ジョブスケジューラ502は、入力された現在のジョブIDのスプリットの個数をインクリメントする(ステップS2306)。ステップS2306の実行完了後、ジョブスケジューラ502は、ステップS2307の処理を実行する。
なお、ステップS2306について、ジョブスケジューラ502は、入力されたスプリットに現在のジョブIDを示す情報とは異なる情報が付与されてない場合、現在のジョブIDの入力されたデータの個数をインクリメントしない。そして、ジョブスケジューラ502は、ステップS2304の処理に移行する。
また、ステップS2308の実行完了後、ジョブスケジューラ502は、末尾のスプリットを検出したか否か判断する(ステップS2309)。末尾のスプリットでない場合(ステップS2309:No)、ジョブスケジューラ502は、ステップS2304の処理に移行する。また、末尾のスプリットである場合(ステップS2309:Yes)、ジョブスケジューラ502は、MapReduce処理手順の一例を示すフローチャート(その2)に移行する。
図24は、ファイル受付処理手順の一例を示すフローチャートである。ファイル受付処理は、初期化処理の後に行う処理である。また、ファイル受付処理は、マスタノード2101のジョブトラッカー501が実行する。
ジョブトラッカー501は、ジョブクライアント301からファイルを受け付けたか否かを判断する(ステップS2401)。ファイルを受け付けた場合(ステップS2401:Yes)、ジョブトラッカー501は、ファイルをスプリットに分割する(ステップS2402)。次に、ジョブトラッカー501は、現在のジョブIDのスプリットの個数を更新する(ステップS2403)。具体的に、ジョブトラッカー501は、ステップS2402にて、現在のジョブIDのスプリットの個数に、分割したスプリットの個数を加算する。
続けて、ジョブトラッカー501は、スプリットにジョブIDを示す情報を付与する(ステップS2404)。ジョブIDを示す情報は、スプリットの内容とは区別可能な値であって、ジョブIDが記載された情報である。たとえば、ジョブIDが1である場合、ジョブIDを示す情報は、<1>となる。次に、ジョブトラッカー501は、現在のジョブIDの末尾のファイルを受け付けたか否かを判断する(ステップS2405)。末尾のファイルを受け付けた場合(ステップS2405:Yes)、ジョブトラッカー501は、現在のジョブIDの末尾のファイルを受け付けたことを記憶する(ステップS2406)。ステップS2406の実行終了後、ジョブトラッカー501は、ファイル受付処理を終了する。
ジョブクライアント301からファイルを受け付けていない場合(ステップS2401:No)、または、末尾のファイルを受け付けていない場合(ステップS2405:No)、ジョブトラッカー501は、ファイル受付処理を終了する。ファイル受付処理を実行することにより、分散処理システム2100は、入力されたスプリットにジョブIDを示す情報を付与することができる。
図25は、実施の形態2にかかるMapタスク生成処理手順の一例を示すフローチャートである。実施の形態2にかかるMapタスク生成処理のうち、ステップS2501〜S2503は、ステップS1601〜ステップS1603と同一であるため、説明を省略する。
ステップS2503の実行完了後、ジョブスケジューラ502は、入力されたスプリットの個数と現在のジョブIDのスプリットの個数が一致するか否かを判断する(ステップS2504)。個数が一致する場合(ステップS2504:Yes)、ジョブスケジューラ502は、続けて、現在のジョブIDの末尾のファイルを受け付けているか否かを判断する(ステップS2505)。現在のジョブIDの末尾のファイルを受け付けている場合(ステップS2505:Yes)、ジョブスケジューラ502は、末尾のスプリットを検出したことを記憶する(ステップS2506)。個数が一致しない場合(ステップS2504:No)、または、現在のジョブIDの末尾のファイルを受け付けていない場合(ステップS2505:No)、ジョブスケジューラ502は、Mapタスク生成処理を終了する。なお、図23にて示したステップS2306の処理は、ステップS2501の次からステップS2504の前までのタイミングで行われてもよい。
以上説明したように、実施の形態2にかかる割当装置によれば、スプリットを分割する際にジョブIDを示す情報を付与し、分割時のスプリットの個数と入力されたスプリットの個数が一致し、かつ末尾のファイルを受け付けた場合、シャッフル処理に移行する。これにより、分散処理システム2100は、スプリットの入力された順番が保証されていなくとも、正しい処理結果を得ることができる。
たとえば、分割時のスプリットの個数が3であり、スプリットの入力された順番が、ジョブID:1の1番目のスプリット、ジョブID:1の2番目のスプリット、ジョブID:2の1番目のスプリット、ジョブID:1の3番目のスプリット、となったとする。ジョブID:1の2番目のスプリットが入力されたことを検出した時点において、割当装置は、入力されたスプリットが現在のジョブID:1ではないので、Map処理を割り当てない。
続けて、ジョブID:1の3番目のスプリットが入力されたことを検出した時点において、割当装置は、入力されたスプリットが現在のジョブID:1となるため、Map処理を割り当てる。ジョブID:1の1=3番目のスプリットを処理対象とするMap処理の完了後、割当装置は、シャッフル&ソート処理を実行する。これにより、割当装置は、入力されたスプリットが次のジョブと混合していても、正しい処理結果を得ることができる。
また、実施の形態2にかかる割当装置によれば、入力されたスプリットの個数を、記憶部に入力されたことを検出した場合にインクリメントしてもよいし、Map処理を割り当てた場合にインクリメントしてもよい。これにより、割当装置は、入力されたスプリットの個数を数えることができる。
なお、実施の形態1、2で説明した割当方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本割当プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本割当プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態1、2に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
第1の処理の処理対象となるデータが順次入力される記憶部に、データが入力されたことを検出し、
前記データが入力されたことを検出した場合、通信可能なノード群のうちのいずれかのノードに前記データを処理対象とする前記第1の処理を割り当て、
前記データが入力されたことを検出した場合、前記データに、前記第1の処理の処理対象となる一連のデータの末尾のデータであることを示す末尾情報が付与されているか否かを判断し、
前記データに前記末尾情報が付与されていると判断した場合、前記ノード群のうちのいずれかのノードに、前記一連のデータの各々のデータを処理対象として実行された前記第1の処理の処理結果を処理対象とする第2の処理を割り当てる、
処理を実行させることを特徴とする割当プログラム。
(付記2)前記コンピュータに、
前記第1の処理の処理対象に固有の識別情報を生成する処理を実行させ、
前記第1の処理を割り当てる処理は、
前記データが入力されたことを検出した場合、前記ノード群のうちのいずれかのノードに、生成した前記識別情報とともに、前記データを処理対象とする前記第1の処理を割り当て、
前記第2の処理を割り当てる処理は、
前記データに前記末尾情報が付与されていると判断した場合、前記ノード群のうちのいずれかのノードに、前記識別情報とともに、前記第1の処理の処理結果を処理対象とする第2の処理を割り当てることを特徴とする付記1に記載の割当プログラム。
(付記3)前記第2の処理を割り当てる処理は、
前記データに前記末尾情報が付与されていると判断した場合、前記ノード群のうちのいずれかのノードに、前記第1の処理の処理結果の属性をもとに前記第1の処理の処理結果を集約した1以上の処理結果を処理対象とする第2の処理を割り当てる、
処理を実行させることを特徴とする付記1または2に記載の割当プログラム。
(付記4)コンピュータに、
第1の処理の処理対象となるデータ群の各々のデータが順次入力される記憶部に、データが入力されたことを検出し、
前記データが入力されたことを検出した場合、通信可能なノード群のうちのいずれかのノードに前記データを処理対象とする前記第1の処理を割り当て、
前記データが入力されたことを検出した場合、前記データ群に含まれるデータの個数と、前記記憶部に入力されたデータの個数とに基づいて、前記データ群が前記記憶部に入力されたか否かを判断し、
前記データが入力されたことを検出した場合、前記データ群が前記第1の処理の処理対象となる一連のデータ群の末尾のデータ群であるか否かを判断し、
前記データ群が前記記憶部に入力されたと判断し、かつ、前記データ群が前記一連のデータ群の末尾のデータ群であると判断した場合、前記ノード群のうちのいずれかのノードに、前記一連のデータ群の各々のデータを処理対象として実行された前記第1の処理の処理結果を処理対象とする第2の処理を割り当てる、
処理を実行させることを特徴とする割当プログラム。
(付記5)前記コンピュータに、
前記第1の処理の処理対象に固有の識別情報を生成する処理を実行させ、
前記第1の処理を割り当てる処理は、
前記データが入力されたことを検出した場合、前記ノード群のうちのいずれかのノードに、生成した前記識別情報とともに、前記データを処理対象とする前記第1の処理を割り当て、
前記第2の処理を割り当てる処理は、
前記データ群が前記記憶部に入力されたと判断し、かつ、前記データ群が前記一連のデータ群の末尾のデータ群であると判断した場合、前記ノード群のうちのいずれかのノードに、前記識別情報とともに、前記第1の処理の処理結果を処理対象とする第2の処理を割り当てることを特徴とする付記4に記載の割当プログラム。
(付記6)前記コンピュータに、
前記データが入力されたことを検出した場合、前記記憶部に入力されたデータの個数をインクリメントする処理を実行させ、
前記データ群が前記記憶部に入力されたか否かを判断する処理は、
前記データが入力されたことを検出した場合、前記データ群に含まれるデータの個数と、インクリメントした前記記憶部に入力されたデータの個数とに基づいて、前記データ群が前記記憶部に入力されたか否かを判断することを特徴とする付記4または5に記載の割当プログラム。
(付記7)前記コンピュータに、
前記ノード群のうちのいずれかのノードに前記第1の処理が割り当てられた場合、前記記憶部に入力されたデータの個数をインクリメントする処理を実行させ、
前記データ群が前記記憶部に入力されたか否かを判断する処理は、
前記データが入力されたことを検出した場合、前記一連のデータに含まれるデータの個数と、インクリメントした前記記憶部に入力されたデータの個数とに基づいて、前記データ群が前記記憶部に入力されたか否かを判断することを特徴とする付記4または5に記載の割当プログラム。
(付記8)前記第2の処理を割り当てる処理は、
前記データ群が前記記憶部に入力されたと判断し、かつ、前記データ群が前記一連のデータ群の末尾のデータ群であると判断した場合、前記ノード群のうちのいずれかのノードに、前記第1の処理の処理結果の属性をもとに前記第1の処理の処理結果を集約した1以上の処理結果を処理対象とする第2の処理を割り当てることを特徴とする付記4〜7のいずれか一つに記載の割当プログラム。
(付記9)第1の処理の処理対象となるデータが順次入力される記憶部に、データが入力されたことを検出する検出部と、
前記検出部によって前記データが入力されたことが検出された場合、通信可能なノード群のうちのいずれかのノードに前記データを処理対象とする前記第1の処理を割り当てる第1の割当部と、
前記データが入力されたことが検出された場合、前記データに、前記第1の処理の処理対象となる一連のデータの末尾のデータであることを示す末尾情報が付与されているか否かを判断する判断部と、
前記判断部によって前記データに前記末尾情報が付与されていると判断された場合、前記ノード群のうちのいずれかのノードに、前記一連のデータの各々のデータを処理対象として実行された前記第1の処理の処理結果を処理対象とする第2の処理を割り当てる第2の割当部と、
を有することを特徴とする割当装置。
(付記10)第1の処理の処理対象となるデータ群の各々のデータが順次入力される記憶部に、データが入力されたことを検出する検出部と、
前記検出部によって前記データが入力されたことが検出された場合、通信可能なノード群のうちのいずれかのノードに前記データを処理対象とする前記第1の処理を割り当てる第1の割当部と、
前記検出部によって前記データが入力されたことが検出された場合、前記データ群に含まれるデータの個数と、前記記憶部に入力されたデータの個数とに基づいて、前記データ群が前記記憶部に入力されたか否かを判断する第1の判断部と、
前記検出部によって前記データが入力されたことが検出された場合、前記データ群が前記第1の処理の処理対象となる一連のデータ群の末尾のデータ群であるか否かを判断する第2の判断部と、
前記第1の判断部によって前記データ群が前記記憶部に入力されたと判断され、かつ、前記第2の判断部によって前記データ群が前記一連のデータ群の末尾のデータ群であると判断された場合、前記ノード群のうちのいずれかのノードに、前記一連のデータ群の各々のデータを処理対象として実行された前記第1の処理の処理結果を処理対象とする第2の処理を割り当てる第2の割当部と、
を有することを特徴とする割当装置。
(付記11)コンピュータが、
第1の処理の処理対象となるデータが順次入力される記憶部に、データが入力されたことを検出し、
前記データが入力されたことを検出した場合、通信可能なノード群のうちのいずれかのノードに前記データを処理対象とする前記第1の処理を割り当て、
前記データが入力されたことを検出した場合、前記データに、前記第1の処理の処理対象となる一連のデータの末尾のデータであることを示す末尾情報が付与されているか否かを判断し、
前記データに前記末尾情報が付与されていると判断した場合、前記ノード群のうちのいずれかのノードに、前記一連のデータの各々のデータを処理対象として実行された前記第1の処理の処理結果を処理対象とする第2の処理を割り当てる、
処理を実行することを特徴とする割当方法。
(付記12)コンピュータが、
第1の処理の処理対象となるデータ群の各々のデータが順次入力される記憶部に、データが入力されたことを検出し、
前記データが入力されたことを検出した場合、通信可能なノード群のうちのいずれかのノードに前記データを処理対象とする前記第1の処理を割り当て、
前記データが入力されたことを検出した場合、前記データ群に含まれるデータの個数と、前記記憶部に入力されたデータの個数とに基づいて、前記データ群が前記記憶部に入力されたか否かを判断し、
前記データが入力されたことを検出した場合、前記データ群が前記第1の処理の処理対象となる一連のデータ群の末尾のデータ群であるか否かを判断し、
前記データ群が前記記憶部に入力されたと判断し、かつ、前記データ群が前記一連のデータ群の末尾のデータ群であると判断した場合、前記ノード群のうちのいずれかのノードに、前記一連のデータ群の各々のデータを処理対象として実行された前記第1の処理の処理結果を処理対象とする第2の処理を割り当てる、
処理を実行することを特徴とする割当方法。