【国等の委託研究の成果に係る記載事項】(出願人による申告)独立行政法人新エネルギー・産業技術総合開発機構「グリーンネットワーク・システム技術研究開発プロジェクト(グリーンITプロジェクト)/エネルギー利用最適化データセンタ基盤技術の研究開発/サーバの最適構成とクラウド・コンピューティング環境における進化するアーキテクチャーの開発/クラウド・コンピューティング技術」委託研究、産業技術力強化法第19条の適用を受ける特許出願
(58)【調査した分野】(Int.Cl.,DB名)
前記パイプマスタの前記ワーカ制御部は、前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカは、保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
請求項3に記載の分散実行システム。
【発明を実施するための形態】
【0021】
以下、本発明の実施の形態について説明する。なお、以下に挙げる実施形態は例示であり、本発明は以下の実施形態の構成に限定されない。
【0022】
本実施形態における分散実行システムは、パイプを介して接続される第1分散プログラム及び第2分散プログラムを実行する。第1分散プログラム及び第2分散プログラムは、異なるノード上で動作してもよいし、1つのノード上で動作してもよい。
【0023】
本実施形態における分散実行システムは、第1分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、第2分散プログラムで実現される入力側ワーカと同じノード上で動作し、当該出力側パイプワーカから出力側ワーカの出力データを受信し、この出力データを当該入力側ワーカに渡す入力側パイプワーカと、を備える。ここで、出力側ワーカ及び入力側ワーカはそれぞれソフトウェア構成要素である。ソフトウェア構成要素とは、メモリ上のデータ(プログラム)がプロセッサ(例えば、CPU(Central Processing Unit)、DSP(Digital Signal Processor)等)で実行されることにより実現される、タスク、プロセス、スレッドのようなソフトウェア部品(断片)である。
【0024】
上記出力側パイプワーカは、出力側ワーカから、出力データと共にその出力データが入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、プログラム接続部により取得されたシーケンス番号と情報取得部により取得された回復シーケンス番号とを比較し、当該回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送しない第1通信部と、を含む。
【0025】
本実施形態では、第1分散プログラムで実現される出力側ワーカの出力データは、出力側パイプワーカ及び入力側パイプワーカを介して、第2分散プログラムで実現される入力側ワーカへ入力される。このとき、出力データが入力側ワーカへ送られる順番を示すシーケンス番号が、その出力データと共に出力側ワーカから出力側パイプワーカへ送られる。出力側パイプワーカでは、出力側ワーカから送られたシーケンス番号が、入力側ワーカの実行状態に対応する回復シーケンス番号と比較され、回復シーケンス番号以前の出力順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送されない。
【0026】
これにより、入力側ワーカ及び出力側ワーカの少なくとも一方の実行状態が以前の状態に戻された場合に、出力側ワーカと入力側ワーカとの間でその状態回復前に既に行われた通信は再度行われない。言い換えれば、入力側ワーカ及び出力側ワーカの少なくとも一方の実行状態が以前の状態に戻された場合であっても、回復後の両者の実行状態に合った通信のみが行われる。従って、本実施形態によれば、各分散プログラムが異なる時点の実行状態に戻された場合であっても、回復後の各分散プログラムの実行状態に不整合が生じることを防ぐことができ、ひいては、パイプで相互に接続された複数の分散プログラムを含む分散実行システム(プログラムシステム)の信頼性を向上させることができる。
【0027】
以下、上述の実施形態について更に詳細を説明する。
【0028】
[第1実施形態]
〔システム構成〕
図1は、第1実施形態における分散実行システムの構成例を概念的に示す図である。第1実施形態における分散実行システム1は、パイププログラム、このパイププログラムにより実現されるパイプを介して相互に接続する第1分散プログラム及び第2分散プログラムを実行する。
【0029】
分散実行システム1は、ハードウェア構成として、複数のノード70(スペアノード75を含む)を有する。ノード70は、コンピュータと呼ぶこともできる。ノード70は、CPU(Central Processing Unit)、メモリ、入出力インタフェース等を含み、メモリに格納された各種プログラムを実行するためのハードウェア要素群を示す概念である。ノード70は、パーソナルコンピュータのような1台のコンピュータ装置であってもよいし、CPUボードといった1台のハードウェア装置に複数装着可能な単位であってもよい。分散プログラムやパイププログラムは、例えば、CD(Compact Disc)、メモリカード等のような可搬型記録媒体や、ハードディスク、ROM(Read Only Memory)等の或るノード70上のメモリに格納される。
【0030】
ここでは2つの分散プログラムを対象とするが、本実施形態は、パイプを介して相互に通信可能に接続されていれば、分散プログラムの数を制限しない。また、第1分散プログラム及び第2分散プログラムが異なるノード70上で動作する場合を例に挙げる。
【0031】
第1実施形態における分散実行システム1は、ソフトウェア構成要素として、出力側プログラムマスタ10、出力側プログラムワーカ15、入力側プログラムマスタ20、入力側プログラムワーカ25、パイプマスタ30、出力側パイプワーカ40、入力側パイプワーカ50、パイプ情報ディレクトリ35、実行状態データベース60等を有する。以降、出力側プログラムマスタ10を出力側マスタ10と表記し、出力側プログラムワーカ15を出力側ワーカ15と表記し、入力側プログラムマスタ20を入力側マスタ20と表記し、入力側プログラムワーカ25を入力側ワーカ25と表記し、実行状態データベース60を実行状態DB60と表記する。
【0032】
第1分散プログラムが或るノード70上で実行されると、分散実行システム1は、任意のノード70上に出力側マスタ10を起動させ、出力側マスタ10が指定されたノード70上に出力側ワーカ15を起動させる。同様に、第2分散プログラムが或るノード70上で実行されると、分散実行システム1は、任意のノード70上に入力側マスタ20を起動させ、入力側マスタ20が指定されたノード70上に入力側ワーカ25を起動させる。例えば、
図1の例に示されるように、複数の出力側ワーカ15及び複数の入力側ワーカ25がそれぞれ異なるノード70上で起動する。出力側マスタ10及び入力側マスタ20は、例えば、設定ファイルを参照することにより、出力側ワーカ15及び入力側ワーカ25を起動するノード70を特定してもよい。また、本実施形態は、出力側ワーカ15及び入力側ワーカ25の数を限定しない。
【0033】
第1実施形態では、説明の便宜のため、第1分散プログラムにより実現される出力側ワーカ15が出力するデータを、第2分散プログラムにより実現される入力側ワーカ25が入力として取得する例を示すが、相互にデータをやりとりする形態であってもよい。
【0034】
パイプが利用される場合、分散実行システム1において、パイプを作成するためのコマンドが実行される。そのコマンドには、パイプの名前等が指定される。そのコマンドは、第1分散プログラム又は第2分散プログラムから呼ばれるようにしてもよい。そのコマンドが実行されると、分散実行システム1は、適当なノード70にパイプマスタ30を起動する。分散実行システム1は、更に、起動されたパイプマスタ30に接続するための情報をそのパイプの名前と関連付けてパイプ情報ディレクトリ35に格納する。パイプマスタ30に接続するための情報(接続情報)には、パイプマスタ30が動作しているノード70のIP(Internet Protocol)アドレスやパイプマスタ30が接続を受け付けるポート番号等が含まれる。なお、パイプの名前をそれら接続情報を含む形態(URL等)とすれば、パイプ情報ディレクトリ35は省かれてもよい。
【0035】
第1分散プログラム及び第2分散プログラムでは、利用したいパイプの名前、そのパイプの利用形態が指定されている。パイプの利用形態には、そのパイプを入力のために利用するか、又は、そのパイプを出力のために利用するかが指定される。
【0036】
出力側マスタ10及び入力側マスタ20は、パイプ情報ディレクトリ35を検索することにより、パイプマスタ30への接続情報を取得し、この接続情報を用いてパイプマスタ30にそれぞれ接続する。ここで、接続するとは、通信可能な状態とすることを意味する。更に、出力マスタ10及び入力側マスタ20は、パイプの利用形態及びワーカを起動したノード70の情報をパイプマスタ30に通知する。
【0037】
パイプマスタ30は、出力側マスタ10及び入力側マスタ20から通知された情報に基づいて、各ノード70上で、出力側パイプワーカ40及び入力側パイプワーカ50を起動する。これにより、出力側パイプワーカ40は、出力側ワーカ15と同じノード70上で動作し、入力側パイプワーカ50は、入力側ワーカ25と同じノード上で動作する。パイプマスタ30は、起動された各パイプワーカに接続するための情報(接続情報)を出力側マスタ10及び入力側マスタ20に通知する。パイプワーカへの接続情報としては、例えば、ソケットが利用される場合には、ポート番号が利用される。
【0038】
出力側ワーカ15及び入力側ワーカ25は、出力側マスタ10又は入力側マスタ20から通知されるパイプワーカへの接続情報を取得し、この接続情報を用いて、出力側パイプワーカ40又は入力側パイプワーカ50に接続する。出力側ワーカ15は、出力データと共にその出力データの出力順番を示すシーケンス番号を、接続された出力側パイプワーカ40に送る。入力側ワーカ25は、接続された入力側パイプワーカ50から、出力側ワーカ15の出力データを取得する。パイプを経由して通信される出力データは、単純なバイト列ではなく、例えば、意味を持ったまとまり(以下レコードと呼ぶ)の単位で送受信される。
【0039】
出力側パイプワーカ40は、接続された出力側ワーカ15から、出力データと共にその出力データの出力順番を示すシーケンス番号を取得し、出力データ及びシーケンス番号を入力側パイプワーカ50に転送する。入力側パイプワーカ50は、出力側パイプワーカ40から送られた出力データ及びシーケンス番号を受信し、それら受信されたデータを入力側ワーカ25に送る。
【0040】
出力側パイプワーカ40は、入力側パイプワーカ50へ送信された出力データに対応する最新シーケンス番号を保持する。入力側パイプワーカ50は、出力側パイプワーカ40から送信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ40毎の最新シーケンス番号を保持する。なお、出力側パイプワーカ40及び入力側パイプワーカ50は、出力データ自体を内部で保持(バッファリング)しないものとする。これは、障害時にパイプ自身の実行状態を回復しなくて良いようにするためである。
【0041】
出力側マスタ10及び入力側マスタ20は、ソフトウェア構成要素として、
図1に示されるような同一の構成を有する。即ち、出力側マスタ10は、保存制御部11、ワーカ制御部12を有し、入力側マスタ20は、保存制御部21、ワーカ制御部22を有する。パイプマスタ30は、ソフトウェア構成要素として、管理データベース(DB)31、ワーカ制御部32等を有する。
【0042】
ワーカ制御部12及び22は、出力側ワーカ15及び入力側ワーカ25に対する上述のような制御処理、パイプマスタ30に対する上述のような通信処理等を行う。パイプマスタ30のワーカ制御部32は、出力側パイプワーカ40及び入力側パイプワーカ50に対する上述のような制御処理、出力側マスタ10及び入力側マスタ20に対する上述のような通信処理等を行う。
【0043】
保存制御部11及び21は、出力側ワーカ15及び入力側ワーカ25の実行状態の保存及び回復に関する処理等を行う。
【0044】
管理DB31は、出力側ワーカ15及び入力側ワーカ25で保存された実行状態を特定するための状態特定情報(例えば実行状態名)と、その実行状態保存時に各出力側パイプワーカ40に保持されていた各シーケンス番号とを関連付けた状態で格納する。管理DB31は、関連保持部に対応する。
【0045】
出力側ワーカ15及び入力側ワーカ25は、ソフトウェア構成要素として、
図1に示されるような同一の構成を有する。即ち、出力側ワーカ15は、状態回復部17、パイプ接続部18、連携処理部19を有し、入力側ワーカ25は、状態回復部27、パイプ接続部28、連携処理部29を有する。また、出力側パイプワーカ40及び入力側パイプワーカ50は、ソフトウェア構成要素として、
図1に示されるような同一の構成を有する。即ち、出力側パイプワーカ40は、プログラム接続部41、通信部42、連携処理部49を有し、入力側パイプワーカ50は、プログラム接続部51、通信部52、連携処理部59を有する。
【0046】
パイプ接続部18及びプログラム接続部41は、出力側ワーカ15と出力側パイプワーカ40との間の接続及びデータの授受を遂行する。同様に、パイプ接続部28及びプログラム接続部51は、入力側ワーカ25と入力側パイプワーカ50との間の接続及びデータの授受を遂行する。通信部42及び52は、出力側パイプワーカ40と入力側パイプワーカ50との間の通信を遂行する。プログラム接続部41又は通信部42が出力側パイプワーカ40の保持部に相当する。また、プログラム接続部51又は通信部52が入力側パイプワーカ50の保持部に相当する。
【0047】
状態回復部17及び27は、出力側ワーカ15及び入力側ワーカ25の実行状態の保存及び回復に関する処理等を行う。連携処理部19及び29は、出力側マスタ10及び入力側マスタ20と出力側ワーカ15及び入力側ワーカ25との間でデータを送受信する。連携処理部49及び59は、パイプマスタ30と出力側パイプワーカ40及びパイプマスタ30と入力側パイプワーカ50との間でデータを送受信する。連携処理部49は、情報取得部に相当する。
【0048】
実行状態DB60は、出力側ワーカ15及び入力側ワーカ25に関する任意の時点の実行状態を保存する。言い換えれば、実行状態DB60は、出力側ワーカ15及び入力側ワーカ25を或る時点の実行状態に戻すための、各時点の回復データをそれぞれ格納する。なお、本実施形態は、実行状態の保存形態を限定しない。実行状態DB60に格納されるデータは、障害発生時等に、出力側ワーカ15及び入力側ワーカ25が或る正常時点の実行状態に戻れるのであれば、どのようなデータであってもよい。
【0049】
〔動作例〕
以下、第1実施形態における分散実行システム1の動作例について、
図2から
図5を用いて、場面毎にそれぞれ説明する。
図2から
図5では、分散実行システム1上で実行されるパイププログラム及び分散プログラムが示されている。
【0050】
図2は、第1実施形態における分散実行システム1のプログラム起動時の動作例を示すシーケンス図である。
図2に示されるように、ユーザは、分散実行システム1においてパイプ作成コマンドを実行する(S201)。このパイプ作成コマンドにはパイプ名等が指定される。ここでは、パイプ作成コマンドを実行する主体をユーザとしたが、分散プログラムやその他のプログラムがその内部でパイプ作成コマンドを実行するようにしてもよい。
【0051】
パイプ作成コマンドの実行により、分散実行システム1はパイプマスタ30を起動する(S202)。続いて、分散実行システム1は、起動されたパイプマスタ30に接続するための情報をパイプ名と関連付けてパイプ情報ディレクトリ35に登録する(S203)。
【0052】
次に、ユーザは、分散実行システム1において、利用したいパイプ名と入力又は出力の種別とを指定して分散プログラムを実行する(S205)。これにより、
図2から
図5に示されるように、第1分散プログラム及び第2分散プログラムが実行される。
【0053】
分散実行システム1は、指定された種別に応じたプログラムマスタを適切なノード70上に起動する(S206)。
図1の例では、出力種別の指定に応じて、出力側マスタ10が起動され、入力種別の指定に応じて、入力側マスタ20が起動される。引き続き、起動されたプログラムマスタは、任意のノード70上にプログラムワーカを起動する(S206)。
図1の例では、出力側マスタ10が複数のノード70上に出力側ワーカ15を起動し、入力側マスタ20が複数のノード70上に入力側ワーカ25を起動する。
【0054】
プログラムマスタは、指定されたパイプ名を用いてパイプ情報ディレクトリ35からパイプマスタ30への接続情報を抽出する。プログラムマスタは、抽出された接続情報を用いて、パイプマスタ30に接続する(S207)。パイプマスタ30は、プログラムマスタからの接続を受け付ける(S208)。なお、パイプマスタ30とプログラムマスタとの間の接続は、例えば、プロセス間通信を実現するための一般的な周知のシーケンスにより実現される。結果、出力側マスタ10及び入力側マスタ20は、パイプマスタ30とそれぞれ接続する。
【0055】
プログラムマスタは、パイプマスタ30との接続に成功すると、プログラムワーカを起動したノード70の情報をパイプマスタ30に通知する(S208)。具体的には、出力側マスタ10は、各出力側ワーカ15を起動した各ノード70の情報をそれぞれパイプマスタ30に通知し、入力側マスタ20は、各入力側ワーカ25を起動した各ノード70の情報をそれぞれパイプマスタ30に通知する。
【0056】
パイプマスタ30は、プログラムマスタからの通知に応じて、各プログラムワーカが動作するノード70上で、指定された種別(入力又は出力)に応じたパイプワーカを起動する(S209)。具体的には、パイプマスタ30は、各出力側ワーカ15が動作するノード70上に各出力側パイプワーカ40をそれぞれ起動し、各入力側ワーカ25が動作するノード70上に各入力側パイプワーカ50をそれぞれ起動する。
【0057】
パイプマスタ30は、起動された各パイプワーカに接続するための情報をプログラムマスタに通知する(S210)。これにより、出力側マスタ10は、各出力側パイプワーカ40に接続するための情報を取得し、入力側マスタ20は、各入力側パイプワーカ50に接続するための情報を取得する。
【0058】
プログラムマスタは、各パイプワーカに接続するための情報を各プログラムワーカにそれぞれ通知する(S211)。プログラムワーカは、通知された接続情報を用い、パイプワーカに接続する(S212)。結果、出力側ワーカ15は出力側パイプワーカ40に接続し、入力側ワーカ25は入力側パイプワーカ50に接続する。
【0059】
図3は、第1実施形態における分散実行システム1のプログラム実行時の動作例を示すシーケンス図である。プログラムワーカ間でパイプを介した通信が行われる場合、
図3に示される(S301)から(S304)の処理が実行される。
【0060】
出力側ワーカ15は、出力側パイプワーカ40に渡す出力データに対して、その出力データが入力側ワーカ25に送られる順番を示す番号(シーケンス番号)を付す。出力側ワーカ15は、出力データと共にその出力データに関するシーケンス番号を、接続された出力側パイプワーカ40に送る(S301)。
【0061】
出力側パイプワーカ40は、出力側ワーカ15から受け取った出力データ及びそのシーケンス番号を入力側パイプワーカ50に転送する(S302)。
【0062】
入力側パイプワーカ50は、出力側パイプワーカ40から出力データ及びシーケンス番号を受け取り、当該出力データを入力側ワーカ25に渡す(S302)。このとき、出力側パイプワーカ40及び入力側パイプワーカ50は、やりとりされたシーケンス番号のうち少なくとも最新のシーケンス番号を保持する(S303)。
【0063】
入力側ワーカ25は、出力側ワーカ15からの出力データをレコード単位で取得する(S304)。
【0064】
各プログラムワーカは、任意のタイミングで、自身の実行状態を実行状態DB60にそれぞれ保存する。出力側ワーカ15の実行状態が保存される場合、
図3に示される(S310)から(S314)の処理が実行される。
【0065】
出力側マスタ10の保存制御部11は、任意のタイミングで、各出力側ワーカ15に実行状態を保存するようそれぞれ指示する。任意のタイミングは、例えば、所定の周期である。各出力側ワーカ15では、連携処理部19が、出力側マスタ10からの指示を受けると、状態回復部17が、自身(出力側ワーカ15)の動作を停止させ、そのときの実行状態を、その実行状態を特定し得る状態特定情報と共に、実行状態DB60に保存する(S310)。状態特定情報は、実行状態を示す名前(文字列)であってもよいし、識別数値(ID)であってもよい。
【0066】
出力側マスタ10の保存制御部11は、各出力側ワーカ15から、実行状態保存の完了の通知を受けると、実行状態保存の完了を各状態特定情報と共にパイプマスタ30に通知する(S311)。
【0067】
なお、ここでは、出力側マスタ10が各出力側ワーカ15に対して実行状態の保存を指示する例を示したが、各出力側ワーカ15が所定のタイミングで実行状態の保存をそれぞれ独自に開始するようにしてもよい。
【0068】
パイプマスタ30は、出力側マスタ10から実行状態保存の完了の通知を受けると、各出力側パイプワーカ40から、そのときの最新のシーケンス番号をそれぞれ収集する(S312)。パイプマスタ30は、各出力側ワーカ15で保存された実行状態を特定するための各状態特定情報と、収集された各シーケンス番号とを、対応する出力側パイプワーカ40の情報と関連付けた状態で管理DB31にそれぞれ格納する(S313)。パイプマスタ30は、処理(S313)の完了を出力側マスタ10に通知する。
【0069】
出力側マスタ10では、パイプマスタ30から処理の完了の通知を受けると、保存制御部11が、各出力側ワーカ15に動作の再開を指示する。これにより、各出力側ワーカ15はそれぞれ動作を再開する(S314)。
【0070】
一方、入力側ワーカ25の実行状態が保存される場合、
図3に示される(S320)から(S326)の処理が実行される。この場合、入力側マスタ20の保存制御部21が、任意のタイミングで、パイプマスタ30に通信の停止を要求する(S320)。この任意のタイミングは、入力側ワーカ25の実行状態が保存されるタイミングであり、例えば、所定の周期である。
【0071】
パイプマスタ30は、通信停止の要求を受けると、各出力側パイプワーカ40に、各出力側ワーカ15からの出力データの送信を停止するようそれぞれ指示する(S321)。これにより、出力側ワーカ15から出力側パイプワーカ40に出力データ及びシーケンス番号が送られなくなる。
【0072】
入力側マスタ20では、パイプマスタ30から送信停止の指示の完了を知らされると、保存制御部21が、各入力側ワーカ25に実行状態を保存するようそれぞれ指示する。各入力側ワーカ25では、連携処理部29が、入力側マスタ20からの指示を受けると、状態回復部27が、自身(入力側ワーカ25)の処理を停止させ、そのときの実行状態を、実行状態を特定し得る状態特定情報と共に、実行状態DB60に保存する(S322)。
【0073】
入力側マスタ20の保存制御部21は、各入力側ワーカ25から、実行状態保存の完了の通知を受けると、実行状態保存の完了を各状態特定情報と共にパイプマスタ30に通知する(S323)。
【0074】
パイプマスタ30は、入力側マスタ20から実行状態保存の完了の通知を受けると、各出力側パイプワーカ40から、そのときの最新のシーケンス番号をそれぞれ収集する(S324)。パイプマスタ30は、各入力側ワーカ25で保存された実行状態を特定する各状態特定情報と、収集された各シーケンス番号とを、対応する出力側パイプワーカ40の情報と関連付けた状態で管理DB31にそれぞれ格納する(S325)。パイプマスタ30は、処理(S325)の完了を入力側マスタ20に通知する。
【0075】
入力側マスタ20では、パイプマスタ30から処理の完了の通知を受けると、保存制御部21が、各入力側ワーカ25に動作の再開を指示する。これにより、各入力側ワーカ25はそれぞれ動作を再開する(S326)。
【0076】
図4は、第1実施形態における分散実行システム1の出力側分散プログラムでの障害発生時の動作例を示すシーケンス図である。
【0077】
障害発生時には、出力側マスタ10(ワーカ制御部12)が、障害の発生した出力側ワーカ15を検知する(S401)。例えば、ワーカ制御部12は、各出力側ワーカ15を常時監視する。なお、出力側マスタ10による障害の検知は、出力側ワーカ15からの通知により実現されてもよい。出力側ワーカ15の障害は、その出力側ワーカ15が動作するノード70のハードウェア障害などにより生じる。障害の検知手法は周知な手法が用いられれば良い。出力側マスタ10のワーカ制御部12は、少なくとも1つの出力側ワーカ15の障害を検知すると、全出力側ワーカ15の実行を停止させる(S401)。以降、障害の発生した出力側ワーカ15を障害ワーカと表記する。
【0078】
出力側マスタ10は、障害ワーカが動作するノード70の代替として、全ノード70の中からスペアノード75を特定する(S402)。出力側マスタ10(ワーカ制御部12)は、スペアノード75上に障害ワーカ(出力側ワーカ15)の代替となる出力側ワーカ15を新たに起動する(S402)。以降、このスペアノード75上に新たに起動された出力側ワーカ15を代替ワーカと表記する。出力側マスタ10は、障害の発生とスペアノード75に関する情報とをパイプマスタ30に通知する(S402)。
【0079】
パイプマスタ30は、出力側マスタ10からの通知に基づいて、スペアノード75上で出力側パイプワーカ40を新たに起動する(S403)。
【0080】
続いて、パイプマスタ30は、各入力側パイプワーカ50から、保持される最新のシーケンス番号を収集する(S404)。このとき、パイプマスタ30は、各最新のシーケンス番号に関し、送信元の出力側パイプワーカ40の情報も合せて収集するようにしてもよい。パイプマスタ30は、各入力側パイプワーカ50から収集されたシーケンス番号に基づいて、出力側パイプワーカ40毎のシーケンス番号の最大値を取得し、これを回復シーケンス番号として各出力側パイプワーカ40にそれぞれ通知する(S405)。通知対象とされる出力側パイプワーカ40には、スペアノード75上で新たに起動された出力側パイプワーカ40も含まれる。
【0081】
パイプマスタ30は、スペアノード75に新たに起動された出力側パイプワーカ40に接続するための情報と共に、実行再開要求を出力側マスタ10に通知する(S406)。
【0082】
出力側マスタ10(ワーカ制御部12)は、パイプマスタ30からの通知に基づいて、代替ワーカに、スペアノード75に新たに起動された出力側パイプワーカ40に接続するための情報を伝える(S407)。続いて、出力側マスタ10(保存制御部11)は、停止させていた各出力側ワーカ15(代替ワーカも含む)に、実行状態の回復及び再開を指示する。
【0083】
各出力側ワーカ15では、出力側マスタ10からの指示に応じて、状態回復部17が、実行状態DB60に格納されるデータを用いて、その出力側ワーカ15の実行状態を最近保存された状態に戻し、その出力側ワーカ15の実行を再開させる(S408)。このとき、代替ワーカは、障害の発生した出力側ワーカ15に関して保存されている実行状態に設定され、実行を開始する。
【0084】
これにより、代替ワーカを含む各出力側ワーカ15は、回復された状態に応じたシーケンス番号及び出力データを各出力側パイプワーカ40にそれぞれ送る(S409)。このとき、実行状態の回復により、各出力側ワーカ15で付番されていたシーケンス番号もその回復された状態に戻っている。
【0085】
各出力側パイプワーカ40は、処理(S405)でパイプマスタ30から通知された回復シーケンス番号以前のシーケンス番号と共に送られてくる出力データについては無視する(S410)。各出力側パイプワーカ40は、当該回復シーケンス番号より後のシーケンス番号と共に送られてくる出力データについては入力側パイプワーカ50へ転送する(S411)。
【0086】
これにより、当該回復シーケンス番号以前のシーケンス番号が付された出力データは、入力側ワーカ25へ送られず、当該回復シーケンス番号より後のシーケンス番号が付された出力データから入力側ワーカ25へ送られ始める(S412)。
【0087】
ここで、当該回復シーケンス番号に対応する出力データは、出力側ワーカ15で障害が発生する前に、既に、出力側ワーカ15から入力側ワーカ25に送られている。当該回復シーケンス番号は、入力側パイプワーカ50で保持されていたため、既に、出力側パイプワーカ40から入力側パイプワーカ50に送られた最新の出力データに対応する。よって、上述のような動作により、出力側ワーカ15と入力側ワーカ25との間で、その状態回復前に既に行われた通信は再度行われない。
【0088】
一方、障害の発生していない各入力側ワーカ25は、その最新の出力データを受けた以降の実行状態となっている。上述のように、出力側パイプワーカ40により最新の出力データ以前の出力データは無視されるため、異常の発生した第1分散プログラムと正常な第2分散プログラムとの間で、実行状態に合った通信のみが行われる。従って、障害回復後の各分散プログラムの実行状態に不整合は生じない。
【0089】
図5は、第1実施形態における分散実行システム1の入力側分散プログラムでの障害発生時の動作例を示すシーケンス図である。
【0090】
処理(S501)から処理(S503)は、
図4に示される処理(S401)から処理(S403)と、障害発生箇所(入力側か出力側か)のみの違いしかないため、ここでは説明を省略する。
【0091】
パイプマスタ30は、スペアノード75上に入力側パイプワーカ50を新たに起動させると(S503)、各入力側ワーカ25の最新保存実行状態と関連付けられて保存されるシーケンス番号を管理DB31からそれぞれ抽出する(S504)。パイプマスタ30は、抽出された各シーケンス番号を、回復シーケンス番号として、対応する出力側パイプワーカ40にそれぞれ送る(S505)。
【0092】
更に、パイプマスタ30は、抽出された各シーケンス番号以前のシーケンス番号と関連付けられて格納される、各出力側ワーカ15の状態特定情報を管理DB31からそれぞれ抽出する(S506)。
【0093】
パイプマスタ30は、抽出された各状態特定情報と共に、実行停止要求を出力側マスタ10に通知する(S507)。これにより、出力側マスタ10(ワーカ制御部12)は、各出力側ワーカ15の実行を停止させ、その完了をパイプマスタ30に返信する(S508)。
【0094】
パイプマスタ30は、各出力側ワーカ15の停止を確認すると、スペアノード75上に新たに起動された入力側パイプワーカ50への接続情報と共に、実行再開要求を入力側マスタ20に送る(S509)。
【0095】
処理(S510)及び処理(S511)は、
図4に示される処理(S407)及び処理(S408)と、障害発生箇所(入力側か出力側か)のみの違いしかないため、ここでは説明を省略する。入力側マスタ20は、各入力側ワーカ25の再開が完了すると、それをパイプマスタ30へ通知する(S512)。
【0096】
パイプマスタ30は、入力側マスタ20からの通知により各入力側ワーカ25の再開を確認すると、実行再開要求を出力側マスタ10へ送る(S513)。
【0097】
出力側マスタ10は、パイプマスタ30からの通知に応じて、停止させていた各出力側ワーカ15に、各状態特定情報が示す実行状態への回復及び再開を指示する。これにより、各出力側ワーカ15では、状態回復部17が、実行状態DB60に格納されるデータを用いて、当該状態特定情報により特定される実行状態に、その出力側ワーカ15の実行状態を戻し、その出力側ワーカ15の動作を再開させる(S514)。
【0098】
以降、処理(S515)から処理(S518)は、
図4に示す処理(S409)から処理(S412)と同じであるため、ここでは説明を省略する。
【0099】
このように、入力側分散プログラムにおいて障害が発生した場合には、代替ワーカを含む各入力側ワーカ25は、最近保存された実行状態にそれぞれ戻り(S511)、各出力側ワーカ15は、各入力側ワーカ25が戻った状態以前の実行状態にそれぞれ戻り(S506、S514)、各出力側パイプワーカ40には、入力側ワーカ25の実行状態に対応するシーケンス番号(回復シーケンス番号)がそれぞれ設定される(S505)。結果、第2分散プログラムにより実現される入力側ワーカ25において障害が発生した場合であっても、出力側ワーカ15で障害が発生した場合と同様に、実行状態回復後に見合った通信以降から再開され、障害回復後の各分散プログラムの実行状態に不整合は生じない。
【0100】
上述のような第1実施形態における分散実行システム1の作用について、
図6から
図8を用いて説明する。
図6から
図8では、ノードX、ノードY及びノードZ上の各々において出力側ワーカ15及び出力側パイプワーカ40が動作し、ノードP、ノードQ及びノードR上の各々において入力側ワーカ25及び入力側パイプワーカ50が動作する例が示される。ここでは、動作するノードの符号を用いて、出力側ワーカ、出力側パイプワーカ、入力側ワーカ、入力側パイプワーカを示すものとする。例えば、ノードX上で動作する出力側ワーカ15及び出力側パイプワーカ40は、出力側ワーカX及び出力側パイプワーカXと表記する。
【0101】
図6は、第1実施形態における分散実行システム1のプログラム実行時の作用例を概念的に示す図である。
図6に示されるように、出力側ワーカXから入力側ワーカPには、シーケンス番号5及びそれに対応する出力データが既に送信されており、出力側ワーカYから入力側ワーカQには、シーケンス番号3及びそれに対応する出力データが既に送信されており、出力側ワーカZから入力側ワーカRには、シーケンス番号7及びそれに対応する出力データが既に送信されているものと仮定する。更に、
図6に示される各プログラムワーカの実行状態が実行状態DB60に格納されているものと仮定する。
【0102】
図7は、第1実施形態における分散実行システム1の出力側分散プログラムで障害発生時の作用例を概念的に示す図である。
図6に示される状態において、出力側のノードYで障害が発生した場合、出力側ワーカYの障害が検知された後、出力側ワーカX、Y及びZの実行が停止される。更に、ノードYの代替としてスペアノードY'が確保され、そのスペアノードY'上で、出力側ワーカY'及び出力側パイプワーカY'が新たに起動される。そして、出力側パイプワーカXには、入力側パイプワーカ50に保持されていた最新シーケンス番号5が回復シーケンス番号として通知される。同様に、出力側パイプワーカY'には、最新シーケンス番号3が回復シーケンス番号として通知され、出力側パイプワーカZには、最新シーケンス番号7が回復シーケンス番号として通知される。
【0103】
その後、出力側ワーカXは、直近に保存された実行状態3に回復し、出力側ワーカZは、直近に保存された実行状態6に回復する。スペアノードY'上に起動された出力側ワーカY'は、出力側ワーカYにおいて直近に保存された実行状態2に回復する。このとき、入力側ワーカP、Q及びRは、シーケンス番号5、3及び7に対応するデータを受信した以降の実行状態でそれぞれ動作している。
【0104】
出力側ワーカX、Y'及びZは、実行の再開により、回復した実行状態に応じて、シーケンス番号3、2及び6に対応する通信を開始しようとする。これに対して、出力側パイプワーカX、Y'及びZは、通知された回復シーケンス番号以前のシーケンス番号に対応する通信を無視する。具体的には、出力側パイプワーカXは、シーケンス番号5以前のシーケンス番号3から5と共に送られる出力データを無視する。出力側パイプワーカY'は、シーケンス番号3以前のシーケンス番号2及び3と共に送られる出力データを無視する。出力側パイプワーカZは、シーケンス番号7以前のシーケンス番号6及び7と共に送られる出力データを無視する。
【0105】
ここで、出力側パイプワーカ40での出力データの無視とは、その出力データの送信元である出力側ワーカ15には正常に送信されたと認識させつつ、その出力データを入力側パイプワーカ50へ転送しないことを意味する。その無視された出力データは、出力側パイプワーカ40において削除されてもよい。
【0106】
結果、入力側ワーカP、Q及びRの実行状態に適合するシーケンス番号以降の通信が行われる。
【0107】
図8は、第1実施形態における分散実行システム1の入力側分散プログラムで障害発生時の作用例を概念的に示す図である。
図6に示される状態において、入力側のノードQで障害が発生した場合、入力側ワーカQの障害が検知された後、入力側ワーカP、Q及びR、並びに、出力側ワーカX、Y及びZの実行が停止される。更に、ノードQの代替としてスペアノードQ'が確保され、そのスペアノードQ'上で、入力側ワーカQ'及び入力側パイプワーカQ'が新たに起動される。そして、入力側ワーカP、Q'及びRは、直近に保存された実行状態4、3及び4に回復し、出力側パイプワーカX、Y及びZには、入力側ワーカP、Q'及びRの回復状態に対応するシーケンス番号4、3及び4が回復シーケンス番号として通知される。
【0108】
一方で、出力側ワーカX、Y及びZは、入力側ワーカP、Q'及びRの回復状態以前の実行状態として、実行状態3、2及び2に回復する。ここで、出力側ワーカZに関しては、
図6に示されるように、直近に保存された実行状態6のデータ及びその前に保存された実行状態2のデータが実行状態DB60に保存されている。ところが、直近に保存された実行状態6は、入力側ワーカRが回復する状態4より新しいため、出力側ワーカZは、実行状態2に回復する。
【0109】
出力側ワーカX、Y及びZは、実行の再開により、回復した実行状態に応じて、シーケンス番号3、2及び2に対応する通信を開始しようとする。これに対して、出力側パイプワーカX、Y及びZは、通知された回復シーケンス番号以前のシーケンス番号に対応する通信を無視する。具体的には、出力側パイプワーカXは、シーケンス番号4以前のシーケンス番号3及び4と共に送られる出力データを無視する。出力側パイプワーカYは、シーケンス番号3以前のシーケンス番号2及び3と共に送られる出力データを無視する。出力側パイプワーカZは、シーケンス番号4以前のシーケンス番号2から4と共に送られる出力データを無視する。結果、入力側ワーカP、Q'及びRの実行状態に適合するシーケンス番号以降の通信が行われる。
【0110】
なお、上述の第1実施形態では、各プログラムワーカが動作するノード70において障害が発生することが想定されている。これは、ワーカが動作するノード70は多数存在するため、そのうちの一つで障害が発生する確率が高いためである。マスタが動作するノード70はプログラム及びパイプの数だけしか存在しないため、障害が起こる確率は低い。
【0111】
[第1実施形態の補足]
上述の説明では特に明記していなかったが、
図9A及び
図9Bに示されるように、出力側パイプワーカ40と入力側パイプワーカ50との接続形態は、1対1であってもよいし、1対多であってもよいし、多対1であってもよい。
図9Aは、出力側パイプワーカ40と入力側パイプワーカ50との1対1の接続形態及び1対多の接続形態を概念的に示す図である。
図9Bは、出力側パイプワーカ40と入力側パイプワーカ50との多対1の接続形態を概念的に示す図である。
【0112】
図9Aの例では、ノードYの出力側パイプワーカ40が、ノードQの入力側パイプワーカ50及びノードRの入力側パイプワーカ50に接続されている。この場合、例えば、パイプマスタ30のワーカ制御部32が、出力側パイプワーカ40にデータの割り振りを指示する。パイプマスタ30の指示に応じて、出力側パイプワーカ40の通信部42は、プログラム接続部41によりノードYの出力側ワーカ15から取得されたシーケンス番号及び出力データの送信先を2つの入力側パイプワーカ50間で切り替える。
【0113】
障害回復時に、出力側パイプワーカ40に通知される回復シーケンス番号は、上述したように、出力側パイプワーカ40毎のシーケンス番号の最大値とされる(
図4のS405参照)。例えば、ノードQの入力側パイプワーカ50に保持される最新シーケンス番号が6であり、ノードRの入力側パイプワーカ50に保持される最新シーケンス番号が4である場合には、ノードYの出力側パイプワーカ40に関するシーケンス番号の最大値は6であるため、シーケンス番号6が回復シーケンス番号としてノードYの出力側パイプワーカ40に通知される。
【0114】
図9Bの例では、ノードX及びノードZの各出力側パイプワーカ40が、ノードQの入力側パイプワーカ50に接続されている。このような形態は、例えば、次のような場合に適用される。ノードXの出力側ワーカ15がノードP宛てに、ノードYの出力側ワーカ15がノードQ宛てに、ノードZの出力側ワーカ15がノードR宛てにそれぞれデータを出力している場合に、ノードYの出力側ワーカ15が処理を終了したと仮定する。この場合、ノードQの入力側ワーカ25は入力されるデータがなくなるため処理を停止させる。これではリソースの有効活用が図れないため、他のノード(ノードX及びZ)からの出力データをノードQで処理させる。これが
図9Bの例に示される形態である。
【0115】
この形態は、例えば、入力されるデータがなくなったノードQの入力側パイプワーカ50がパイプマスタ30に依頼することにより、実現される。パイプマスタ30は、この依頼を受けると、データの出力を継続している出力側パイプワーカ40の少なくとも1つを選択し、その出力側パイプワーカ40に、入力データがなくなった依頼元の入力側パイプワーカ50にデータを分配するよう指示する。
【0116】
この形態では、入力側パイプワーカ50は、シーケンス番号及び出力データの送信元となる出力側パイプワーカ40を特定し得る情報と共に、その出力側パイプワーカ40に関する最新シーケンス番号を保持するようにすればよい。即ち、ノードQの入力側パイプワーカ50は、ノードYの出力側パイプワーカ40から送られてきたシーケンス番号の中の最新シーケンス番号、ノードXの出力側パイプワーカ40から送られてきたシーケンス番号の中の最新シーケンス番号、ノードZの出力側パイプワーカ40から送られてきたシーケンス番号の中の最新シーケンス番号をそれぞれ保持する。
【0117】
上述の説明では、1つの出力側の第1分散プログラムと1つの入力側の第2分散プログラムとが1つのパイプを介してデータを授受する例が示された。上述の第1実施形態の各構成は、1つの出力側の分散プログラムと複数の入力側の分散プログラムとが接続される形態に対しても同様に、適用可能である。
図10は、複数のプログラムがパイプを介して接続する形態の例を論理的に示す図である。
図10では、プログラムマスタとプログラムワーカとの区別、パイプマスタとパイプワーカとの区別を省略し、論理的にプログラムとパイプがどのように接続されているかのみが示されている。
【0118】
図11は、出力側のプログラムC及びFと入力側のプログラムDとの接続を持つ分散実行システム1の構成例を概念的に示す図である。
図11に示されるように、プログラムワーカCは、出力側パイプワーカU及び入力側パイプワーカUを介して、その出力データをプログラムワーカDに送り、プログラムワーカFは、出力側パイプワーカW及び入力側パイプワーカWを介して、その出力データをプログラムワーカDに送る。このとき、入力側のプログラムワーカDは、入力側パイプワーカU及びWと接続される。
【0119】
図10及び
図11の例におけるプログラムDのように、複数のパイプと接続しているプログラムの場合、実行状態の保存を行う際は接続しているすべてのパイプのパイプマスタに対して、実行状態の保存を行ったことを伝える。すなわち、プログラムDが実行状態の保存を行う際は、パイプU、V及びWの各パイプマスタ30に対し、実行状態の保存を行ったことを伝える。パイプマスタ30の動作は上述のとおりである。
【0120】
第1実施形態の説明では、入力側のプログラム(上述の第2分散プログラム)のワーカ障害時には、出力側のプログラム(上述の第1分散プログラム)の各ワーカの実行状態も戻した。実行状態を戻すべき出力側のプログラムが更に別のパイプを介しての入力側のプログラムであった場合、当該別のパイプを介した出力側のプログラムの各ワーカの実行状態も戻す。
図10の例では、プログラムEのワーカに障害が発生した場合、パイプVのパイプマスタ30を経由してプログラムDの実行状態を戻し、更に、プログラムDはパイプU及びWの入力側プログラムでもあるため、それぞれのパイプマスタ30を経由して、プログラムC及びプログラムFの実行状態も戻す。
【0121】
図10及び
図11の例のような形態を持つ分散実行システム1についてもその動作は、
図2から
図5に示されるとおりである。但し、複数のパイプに接続されている分散プログラムの動作は、通知先及び通知元等が複数のパイプマスタとなる。例えば、処理(S401)及び処理(S501)におけるパイプマスタに通知する処理は、接続されている複数のパイプのパイプマスタに対してそれぞれ行われる。また、処理(S408)及び処理(S511)に関しては、接続されているすべてのパイプマスタからの処理終了の通知を受けたことを確認した後に、最近保存した実行状態に回復され、実行が再開される。また、自身のプログラムが入力側となるすべてのパイプマスタに対し、実行の再開が通知される。
【0122】
分散実行システム1は、
図10の例においてプログラムEのワーカに障害が発生した場合、パイプVを介してその出力側となるプログラムDの回復を行うと共に、パイプU及びWを介して出力側となるプログラムC及びFの回復も行う。この場合の分散実行システム1の動作も基本的には
図5と同様となる。プログラムEとプログラムDとの関係が、
図5の分散プログラム(入力側)と分散プログラム(出力側)との関係となり、プログラムDとプログラムCとの関係及びプログラムDとプログラムFとの関係が、
図5の分散プログラム(入力側)と分散プログラム(出力側)との関係となる。
【0123】
具体的には、プログラムDは、処理(S508)でパイプマスタ30から実行停止要求を受けるが、これを処理(S501)に相当するものとして、処理(S501)の障害検知、処理(S502)及び処理(S503)を除き、処理(S501)以降の処理を行う。出力側の処理から入力側の処理に切り替えたプログラムDは、処理(S501)において処理を停止させた後、プログラムD自身が入力側プログラムである場合のパイプマスタ30(パイプU及びW)に対して通知を行う(S502に相当)。プログラムDは、この通知に、回復する実行状態を特定するための状態特定情報を含める。
【0124】
パイプU及びWの各パイプマスタ30は、処理(S505)から処理(S509)をそれぞれ実行する。処理(S506)では、各パイプマスタ30は、上述のように通知された状態特定情報で特定される実行状態以前の状態を示す状態特定情報を管理DB31から抽出する。これにより、上流のプログラムC及びFは、この抽出された状態特定情報で特定される実行状態に回復する。プログラムDは、処理(S511)において、その実行状態に回復して実行を再開する。
【0125】
[第2実施形態]
第2実施形態における分散実行システム1は、分散プログラムとパイププログラムとの接続形態にループが含まれる場合にも適応する。
図12は、複数のプログラムがパイプを介して接続する形態にループが含まれる場合の例を論理的に示す図である。
【0126】
図12の例では、
図10の例と異なり、分散プログラムとパイププログラムとの接続形態にループが含まれる。即ち、全てのプログラムが入力側及び出力側の両方の役割を持つ。この場合、出力側の分散プログラムの状態を、入力側の分散プログラムが回復する以前の状態に回復させる操作がループし、収束しなくなる。
【0127】
そこで、第2実施形態における分散実行システム1では、実行状態の保存を各分散プログラムで任意に行うのではなく、リーダとなる分散プログラム(以降、リーダプログラムと表記する)からの指示により各分散プログラムは実行状態の保存を行う。なお、第2実施形態は、リーダプログラムの決定方法を制限せず、例えば、プログラム起動時にリーダプログラムが指定されるようにしてもよい。
【0128】
以下、第2実施形態における分散実行システム1の動作について、第1実施形態と異なる内容を中心に説明し、第1実施形態と同じ内容については適宜省略する。また、以下の説明では、入力側の分散プログラムにとっての出力側の分散プログラムを上流と表記し、出力側の分散プログラムにとっての入力側の分散プログラムを下流と表記する場合もある。
【0129】
まず、実行状態保存時の動作について説明する。この動作は、
図3の処理(S310)から処理(S313)、処理(S320)から処理(S326)に相当する。
【0130】
リーダプログラムは、実行状態保存時には、自身の実行を停止させた後、上流及び下流の各分散プログラムに、実行状態の保存を要求する。なお、各分散プログラムは、実行の停止中に、上流の分散プログラムからパイプを介して取得されたデータを受付可能であるとする。例えば、
図11において、プログラムBがリーダプログラムである場合、プログラムBは、上流のプログラムA及び下流のプログラムCに実行状態の保存をそれぞれ要求する。プログラムBからプログラムAに実行状態の保存が要求される場合、具体的には、分散実行システム1は次のように動作する。プログラムBのプログラムマスタが、パイプXのパイプマスタに当該要求を行い、パイプXのパイプマスタが、プログラムAのプログラムマスタに当該要求を行う。以降、プログラム間の要求の伝達を述べる際、プログラムマスタ及びパイプマスタの動作については省略する。
【0131】
リーダプログラムは、保存される実行状態を特定し得る状態特定情報(例えば名前)と共に、実行状態保存要求を各分散プログラムにそれぞれ送る。
【0132】
実行状態保存要求を受けた分散プログラムは、まず、自身の実行を停止させる。その後、当該分散プログラムは、その実行状態保存要求の送信元が下流のプログラムである場合、その送信元に実行の停止を伝える。
図12の例では、リーダプログラムBから実行状態保存要求を受けたプログラムA及びCのうち、プログラムAは実行の停止をプログラムBに伝えるが、プログラムCはそれを伝えない。
【0133】
実行状態保存要求を受けた分散プログラムは、更に、その実行状態保存要求の送信元以外の、パイプを介して接続される他の分散プログラムの全てに実行状態保存要求を送信する。
【0134】
図12の例のようにループが含まれる場合には、実行状態保存要求を複数回受け取る分散プログラムが生じる。このような分散プログラムは、自身が実行状態保存要求の処理中であるか否かを判断し、処理中の場合には、2回目以降の実行状態保存要求に対しては他の分散プログラムへの実行状態保存要求の送信を行わない。但し、そのような分散プログラムは、その実行状態保存要求の送信元が下流のプログラムである場合、その送信元に実行の停止を伝える。
【0135】
実行状態保存要求に応じて自身の実行を停止し、更に他の分散プログラムに実行状態保存要求を送信した分散プログラムは、送信先の分散プログラムのうち全ての上流の分散プログラムから実行の停止を伝えられることにより、自身の実行状態を保存する。これは、全ての上流のプログラムが停止したことでパイプを介してデータが入力されてこないことが保証されるからであり、これにより、実行状態保存中にパイプを介したデータ入力により自身の実行状態が変更されないことが保証される。
【0136】
図12の例では、リーダプログラムBは、プログラムAから実行の停止を伝えられてから、自身の実行状態を保存する。プログラムCは、上流のプログラム(例えばプログラムB)には実行状態保存要求を送っていないため、他のプログラムから実行停止が伝えられることを待たず、自身の実行状態を保存する。プログラムAは、上流のプログラムCに実行状態保存要求を送っているため、プログラムCから実行の停止が伝えられることを待って、自身の実行状態を保存する。
【0137】
各分散プログラムは、実行状態の保存が完了すると、実行状態保存の完了を、その実行状態を特定するための状態特定情報と共に、上流側のパイプマスタ30に伝える(S311)。この通知に応じて、パイプマスタ30は、第1実施形態と同様に、処理(S312)及び処理(S313)を行った後、上流の分散プログラムに実行状態の保存の完了を伝える。
【0138】
各分散プログラムは、全ての下流のプログラムから実行状態の保存の完了通知を受けると、実行を再開する(S314)。
図12の例では、プログラムBは、プログラムCからの実行状態保存完了通知を待ち、実行を再開する。プログラムAは、プログラムBからの当該通知を待ち、プログラムCは、プログラムAからの当該通知を待つ。
【0139】
次に、障害発生時の動作について説明する。この動作は、
図4及び
図5の各処理に相当する。出力側(上流)のプログラムに障害が発生した場合の動作は、第1実施形態(
図4)と同様であるため、ここでは説明を省略する。
【0140】
第2実施形態では、入力側(下流)のプログラムに障害が発生した場合には、入力側プログラムが回復する実行状態と同じタイミングの実行状態に、出力側プログラムも回復させる。よって、処理(S506)では、処理(S505)で抽出されたシーケンス番号と同じシーケンス番号と関連付けられて格納される、出力側プログラムの状態特定情報が抽出される。これは、上述のとおり実行状態の保存を行う際、上流のプログラムと下流のプログラムとで実行状態の保存を同期して行っているからである。
【0141】
[ハードウェア構成の変形例]
上述の第1実施形態及び第2実施形態では、出力側の分散プログラム(例えば、第1分散プログラム)が、出力側マスタ10及び出力側ワーカ15を実現し、入力側の分散プログラム(例えば、第2分散プログラム)が、入力側マスタ20及び入力側ワーカ25を実現する例を示した。しかしながら、本発明はこのような各形態に限定されない。
【0142】
図13は、ノード70と分散プログラムとの関連を概念的に示す図である。
図13に示されるように、出力側マスタ10、入力側マスタ20及びパイプマスタ30は、マスタプログラム81がノード70(#1)で実行されることにより実現され、出力側ワーカ15、入力側ワーカ25、出力側パイプワーカ40及び入力側パイプワーカ50は、ワーカプログラム82がノード70(#2)等で実行されることにより実現され、スペアワーカは、ワーカプログラム82がスペアノード75で実行されることにより実現されてもよい。
【0143】
なお、上述の説明で用いた複数のフローチャートでは、複数の工程が順番に記載されているが、本実施形態で実行される各工程の実行順序は、その記載の順番に制限されない。本実施形態では、図示される工程の順番を内容的に支障のない範囲で変更することができる。また、上述の各実施形態は、内容が相反しない範囲で組み合わせることができる。
【0144】
上記の各実施形態の一部又は全部は、以下の付記のようにも特定され得る。但し、各実施形態が以下の記載に限定されるものではない。
【0145】
(付記1)パイプを介して接続される第1分散プログラム及び第2分散プログラムを実行する分散実行システムにおいて、
前記第1分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、
前記第2分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、
を備え、
前記出力側パイプワーカは、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、
前記プログラム接続部により取得されたシーケンス番号と前記情報取得部により取得された回復シーケンス番号とを比較し、前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない第1通信部と、
を含む、分散実行システム。
【0146】
(付記2)前記入力側パイプワーカは、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信する第2通信部と、
前記第2通信部により受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持する保持部と、
を含み、
前記分散実行システムは、
前記入力側パイプワーカの前記保持部により保持される最新シーケンス番号を取得し、取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送るワーカ制御部を含むパイプマスタ、
を更に備える付記1に記載の分散実行システム。
【0147】
(付記3)前記出力側パイプワーカは、
前記第1通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持する保持部、
を更に含み、
前記出力側ワーカ及び前記入力側ワーカは、各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタは、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカの前記保持部に保持される最新シーケンス番号を取得し、取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持する関連保持部、
を更に含み、
前記パイプマスタの前記ワーカ制御部は、前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて前記関連保持部に保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記2に記載の分散実行システム。
【0148】
(付記4)前記パイプマスタの前記ワーカ制御部は、前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカは、保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
付記3に記載の分散実行システム。
【0149】
(付記5)前記第2分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカの前記第1通信部は、前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタの前記ワーカ制御部は、前記各入力側パイプワーカの各保持部により保持される最新シーケンス番号をそれぞれ収集し、収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記1から4のいずれか1つに記載の分散実行システム。
【0150】
(付記6)パイプで相互に接続される複数の分散プログラムを実行する分散実行システムにおいて、
前記複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを備え、
前記複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
分散実行システム。
【0151】
(付記7)複数のコンピュータが、
パイプを介して第2分散プログラムと接続される第1分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカを起動し、
前記第2分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカを起動し、
前記出力側パイプワーカが、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得し、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得し、
前記シーケンス番号と回復シーケンス番号とを比較し、
前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない、
ことを含む分散プログラム実行方法。
【0152】
(付記8)前記入力側パイプワーカが、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信し、
前記受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持し、
前記複数のコンピュータの中の少なくとも1つが、
パイプマスタを起動し、
前記パイプマスタが、
前記入力側パイプワーカにより保持される最新シーケンス番号を取得し、
前記取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
ことを更に含む付記7に記載の分散プログラム実行方法。
【0153】
(付記9)前記出力側パイプワーカが、
前記第1通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持し、
前記出力側ワーカ及び前記入力側ワーカが、
各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタが、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカに保持される最新シーケンス番号を取得し、
前記取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持し、
前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
ことを更に含む付記8に記載の分散プログラム実行方法。
【0154】
(付記10)前記パイプマスタが、
前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカが、
保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
ことを更に含む付記9に記載の分散プログラム実行方法。
【0155】
(付記11)前記第2分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカが、
前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタが、
前記各入力側パイプワーカにより保持される最新シーケンス番号をそれぞれ収集し、
前記収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、
前記抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
ことを更に含む付記7から10のいずれか1つに記載の分散プログラム実行方法。
【0156】
(付記12)複数のコンピュータが、
パイプで相互に接続される複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを起動し、
前記複数の分散プログラムの中のリーダプログラムが、
リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカが、
プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、
前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、
前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、
上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
ことを含む分散プログラム実行方法。
【0157】
(付記13)パイプを介して接続される第1分散プログラム及び第2分散プログラムを実行する複数のコンピュータに、
前記第1分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、
前記第2分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、
を実現させ、
前記出力側パイプワーカは、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、
前記プログラム接続部により取得されたシーケンス番号と前記情報取得部により取得された回復シーケンス番号とを比較し、前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない第1通信部と、
を含む、分散実行プログラム。
【0158】
(付記14)前記入力側パイプワーカは、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信する第2通信部と、
前記第2通信部により受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持する保持部と、
を含み、
前記複数のコンピュータの中の少なくとも1つに、
前記入力側パイプワーカの前記保持部により保持される最新シーケンス番号を取得し、取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送るワーカ制御部を含むパイプマスタ、
を更に実現させる付記13に記載の分散実行プログラム。
【0159】
(付記15)前記出力側パイプワーカは、
前記第1通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持する保持部、
を更に含み、
前記出力側ワーカ及び前記入力側ワーカは、各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタは、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカの前記保持部に保持される最新シーケンス番号を取得し、取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持する関連保持部、
を更に含み、
前記パイプマスタの前記ワーカ制御部は、前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて前記関連保持部に保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記14に記載の分散実行プログラム。
【0160】
(付記16)前記パイプマスタの前記ワーカ制御部は、前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカは、保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
付記15に記載の分散実行プログラム。
【0161】
(付記17)前記第2分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカの前記第1通信部は、前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタの前記ワーカ制御部は、前記各入力側パイプワーカの各保持部により保持される最新シーケンス番号をそれぞれ収集し、収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記13から16のいずれか1つに記載の分散実行プログラム。
【0162】
(付記18)パイプで相互に接続される複数の分散プログラムを実行する複数のコンピュータに、
前記複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを、
実現させ、
前記複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
分散実行プログラム。
【0163】
(付記19)付記13から18のいずれか1つに記載のプログラムを記録したコンピュータが読み取り可能な記録媒体。
【0164】
この出願は、2011年7月7日に出願された日本出願特願2011−150619号を基礎とする優先権を主張し、その開示の全てをここに取り込む。