(57)【特許請求の範囲】
【請求項１】
パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する分散実行システムにおいて、
前記第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、
前記第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、
を備え、
前記出力側パイプワーカは、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、
前記プログラム接続部により取得されたシーケンス番号と前記情報取得部により取得された回復シーケンス番号とを比較し、前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない第１通信部と、
を含む、分散実行システム。
【請求項２】
前記入力側パイプワーカは、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信する第２通信部と、
前記第２通信部により受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持する保持部と、
を含み、
前記分散実行システムは、
前記入力側パイプワーカの前記保持部により保持される最新シーケンス番号を取得し、取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送るワーカ制御部を含むパイプマスタ、
を更に備える請求項１に記載の分散実行システム。
【請求項３】
前記出力側パイプワーカは、
前記第１通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持する保持部、
を更に含み、
前記出力側ワーカ及び前記入力側ワーカは、各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタは、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカの前記保持部に保持される最新シーケンス番号を取得し、取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持する関連保持部、
を更に含み、
前記パイプマスタの前記ワーカ制御部は、前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて前記関連保持部に保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
請求項２に記載の分散実行システム。
【請求項４】
前記パイプマスタの前記ワーカ制御部は、前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカは、保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
請求項３に記載の分散実行システム。
【請求項５】
前記第２分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカの前記第１通信部は、前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタの前記ワーカ制御部は、前記各入力側パイプワーカの各保持部により保持される最新シーケンス番号をそれぞれ収集し、収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
請求項２から４のいずれか１項に記載の分散実行システム。
【請求項６】
パイプで相互に接続される複数の分散プログラムを実行する分散実行システムにおいて、
前記複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを備え、
前記複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
分散実行システム。
【請求項７】
複数のコンピュータが、
パイプを介して第２分散プログラムと接続される第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカを起動し、
前記第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカを起動し、
前記出力側パイプワーカが、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得し、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得し、
前記シーケンス番号と回復シーケンス番号とを比較し、
前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない、
ことを含む分散プログラム実行方法。
【請求項８】
複数のコンピュータが、
パイプで相互に接続される複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを起動し、
前記複数の分散プログラムの中のリーダプログラムが、
リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカが、
プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、
前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、
前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、
上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
ことを含む分散プログラム実行方法。
【請求項９】
パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する複数のコンピュータに、
前記第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、
前記第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、
を実現させ、
前記出力側パイプワーカは、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、
前記プログラム接続部により取得されたシーケンス番号と前記情報取得部により取得された回復シーケンス番号とを比較し、前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない第１通信部と、
を含む、分散実行プログラム。
【請求項１０】
パイプで相互に接続される複数の分散プログラムを実行する複数のコンピュータに、
前記複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを、
実現させ、
前記複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
分散実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パイプを用いた複数の分散プログラムの実行技術に関する。
【背景技術】
【０００２】
独立に開発された複数の分散プログラムを組み合わせて実行する場合、例えば、非特許文献１に記載されるＭａｐＲｅｄｕｃｅのようなシステムを用いて、分散プログラムが実現される。ＭａｐＲｅｄｕｃｅで記述された複数のプログラムを組み合わせて実行するためには、これらのプログラム間のデータの受け渡しにファイルを用いる必要がある。すなわち、あるプログラムの実行結果がファイルに書き出され、そのファイルを介して、当該実行結果が別のプログラムの入力とされる。【０００３】
しかしながら、プログラム間のデータの受け渡しにファイルを用いるのは、効率上問題がある。通常、前のプログラムが完全に終了してから、次のプログラムの実行が開始される。ところが、前のプログラムが一部の出力を行った段階で、次のプログラムの実行を開始すれば、これらのプログラムは並列に実行され得る。【０００４】
逐次プログラムに関し、「パイプ」という概念が知られている。パイプを用いた場合、或るプログラムの出力をメモリを通じて別のプログラムの入力とすることができ、前のプログラムの完全終了を待たずして次のプログラムの実行を開始することが可能となる。そこで、パイプを分散プログラムにおいて利用し、これを用いて複数の分散プログラムを組み合わせて実行することが考えられる。【０００５】
一方、分散プログラムを実現する上ではシステムの高信頼化が必要となる。多数のサーバ上でプログラムを実行した場合における１つのサーバで障害が起こる確率は、単体のサーバ上で逐次にプログラムを実行した場合に比べて大きくなるからである。【０００６】
ＭａｐＲｅｄｕｃｅは、プログラム間の入出力が高信頼化されたファイルシステムを介することを前提として高信頼化を実現しているため、プログラム間の入出力にパイプを用いる場合には、高信頼化を実現することはできない。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】Jeffrey Dean and Sanjay Ghemawat, "MapReduce: Simplified Data Processing on Large Clusters", OSDI, pages 137-150, 2004
【発明の概要】
【０００８】
上述のように、従来技術では、独立して動作する複数の分散プログラムをパイプで接続することで構成されるシステムにおいて、高信頼性を実現することは難しい。例えば、各プログラムが独立して実行状態をそれぞれ保存し、各プログラムの実行状態を以前保存された実行状態に戻すことで信頼性を高める形態が考えられる。しかしながら、このような形態では、実行状態を保存する時点が各プログラムで異なる場合には、回復後の各プログラムの実行状態に不整合が生じるため信頼性を高めることができない。
【０００９】
本発明は、上述の事項に鑑みてなされたものであり、パイプで相互に接続された複数の分散プログラムを実行するシステムの信頼性を向上させる技術を提供する。
【００１０】
本発明の各態様では、上述した課題を解決するために、それぞれ以下の構成を採用する。
【００１１】
第１の態様は、パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する分散実行システムに関する。第１の態様に係る分散実行システムは、第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、出力側パイプワーカから出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、を備え、上記出力側パイプワーカは、出力側ワーカから、出力データと共にその出力データが入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、上記プログラム接続部により取得されたシーケンス番号と上記情報取得部により取得された回復シーケンス番号とを比較し、回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送しない第１通信部と、を含む。
【００１２】
第２の態様は、パイプで相互に接続される複数の分散プログラムを実行する分散実行システムに関する。第２の態様に係る分散実行システムは、複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを備え、複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、上流のプログラムワーカ及び下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに実行状態保存要求を転送し、実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する。
【００１３】
第３の態様は、分散プログラム実行方法に関する。第３の態様に係る分散プログラム実行方法では、複数のコンピュータが、パイプを介して第２分散プログラムと接続される第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカを起動し、第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、出力側パイプワーカから出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカを起動する。更に、上記出力側パイプワーカが、出力側ワーカから、出力データと共にその出力データが入力側ワーカへ送られる順番を示すシーケンス番号を取得し、入力側ワーカの実行状態に対応する回復シーケンス番号を取得し、シーケンス番号と回復シーケンス番号とを比較し、回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送しない。
【００１４】
第４の態様は、分散プログラム実行方法に関する。第４の態様に係る分散プログラム実行方法では、複数のコンピュータが、パイプで相互に接続される複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを起動し、複数の分散プログラムの中のリーダプログラムが、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、上流のプログラムワーカ及び下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、実行状態保存要求を受信した各プログラムワーカが、プログラムワーカ自身の実行を停止させると共に、実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに実行状態保存要求を転送し、実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する。
【００１５】
第５の態様は、分散実行プログラムに関する。第５態様に係る分散実行プログラムは、パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する複数のコンピュータに、第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、出力側パイプワーカから出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、を実現させ、出力側パイプワーカは、出力側ワーカから、出力データと共にその出力データが入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、プログラム接続部により取得されたシーケンス番号と情報取得部により取得された回復シーケンス番号とを比較し、回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送しない第１通信部と、を含む。
【００１６】
第６の態様は、分散実行プログラムに関する。第６態様に係る分散実行プログラムは、パイプで相互に接続される複数の分散プログラムを実行する複数のコンピュータに、複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを、実現させ、複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、上流のプログラムワーカ及び下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに実行状態保存要求を転送し、実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する。
【００１７】
なお、本発明の別態様としては、上記第５態様及び上記第６態様に係る分散実行プログラムを格納するコンピュータが読み取り可能な記録媒体であってもよい。この記録媒体は、非一時的な有形の媒体を含む。
【００１８】
上記各態様によれば、パイプで相互に接続された複数の分散プログラムを実行するシステムの信頼性を向上させる技術を提供することができる。
【図面の簡単な説明】
【００１９】
上述した目的、およびその他の目的、特徴および利点は、以下に述べる好適な実施の形態、およびそれに付随する以下の図面によってさらに明らかになる。【００２０】
【図１】図１は、第１実施形態における分散実行システムの構成例を概念的に示す図である。
【図２】図２は、第１実施形態における分散実行システムのプログラム起動時の動作例を示すシーケンス図である。
【図３】図３は、第１実施形態における分散実行システムのプログラム実行時の動作例を示すシーケンス図である。
【図４】図４は、第１実施形態における分散実行システムの出力側分散プログラムでの障害発生時の動作例を示すシーケンス図である。
【図５】図５は、第１実施形態における分散実行システムの入力側分散プログラムでの障害発生時の動作例を示すシーケンス図である。
【図６】図６は、第１実施形態における分散実行システムのプログラム実行時の作用例を概念的に示す図である。
【図７】図７は、第１実施形態における分散実行システムの出力側分散プログラムで障害発生時の作用例を概念的に示す図である。
【図８】図８は、第１実施形態における分散実行システムの入力側分散プログラムで障害発生時の作用例を概念的に示す図である。
【図９Ａ】図９Ａは、出力側パイプワーカと入力側パイプワーカとの１対１の接続形態及び１対多の接続形態を概念的に示す図である。
【図９Ｂ】図９Ｂは、出力側パイプワーカと入力側パイプワーカとの多対１の接続形態を概念的に示す図である。
【図１０】図１０は、複数のプログラムがパイプを介して接続する形態の例を論理的に示す図である。
【図１１】図１１は、出力側のプログラムＣ及びＦと入力側のプログラムＤとの接続を持つ分散実行システムの構成例を概念的に示す図である。
【図１２】図１２は、複数のプログラムがパイプを介して接続する形態にループが含まれる場合の例を論理的に示す図である。
【図１３】図１３は、ノードと分散プログラムとの関連を概念的に示す図である。
【発明を実施するための形態】
【００２１】
以下、本発明の実施の形態について説明する。なお、以下に挙げる実施形態は例示であり、本発明は以下の実施形態の構成に限定されない。
【００２２】
本実施形態における分散実行システムは、パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する。第１分散プログラム及び第２分散プログラムは、異なるノード上で動作してもよいし、１つのノード上で動作してもよい。
【００２３】
本実施形態における分散実行システムは、第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、当該出力側パイプワーカから出力側ワーカの出力データを受信し、この出力データを当該入力側ワーカに渡す入力側パイプワーカと、を備える。ここで、出力側ワーカ及び入力側ワーカはそれぞれソフトウェア構成要素である。ソフトウェア構成要素とは、メモリ上のデータ（プログラム）がプロセッサ（例えば、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）等）で実行されることにより実現される、タスク、プロセス、スレッドのようなソフトウェア部品（断片）である。
【００２４】
上記出力側パイプワーカは、出力側ワーカから、出力データと共にその出力データが入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、プログラム接続部により取得されたシーケンス番号と情報取得部により取得された回復シーケンス番号とを比較し、当該回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送しない第１通信部と、を含む。
【００２５】
本実施形態では、第１分散プログラムで実現される出力側ワーカの出力データは、出力側パイプワーカ及び入力側パイプワーカを介して、第２分散プログラムで実現される入力側ワーカへ入力される。このとき、出力データが入力側ワーカへ送られる順番を示すシーケンス番号が、その出力データと共に出力側ワーカから出力側パイプワーカへ送られる。出力側パイプワーカでは、出力側ワーカから送られたシーケンス番号が、入力側ワーカの実行状態に対応する回復シーケンス番号と比較され、回復シーケンス番号以前の出力順番を示すシーケンス番号と共に取得された出力データについては入力側パイプワーカへ転送されない。
【００２６】
これにより、入力側ワーカ及び出力側ワーカの少なくとも一方の実行状態が以前の状態に戻された場合に、出力側ワーカと入力側ワーカとの間でその状態回復前に既に行われた通信は再度行われない。言い換えれば、入力側ワーカ及び出力側ワーカの少なくとも一方の実行状態が以前の状態に戻された場合であっても、回復後の両者の実行状態に合った通信のみが行われる。従って、本実施形態によれば、各分散プログラムが異なる時点の実行状態に戻された場合であっても、回復後の各分散プログラムの実行状態に不整合が生じることを防ぐことができ、ひいては、パイプで相互に接続された複数の分散プログラムを含む分散実行システム（プログラムシステム）の信頼性を向上させることができる。
【００２７】
以下、上述の実施形態について更に詳細を説明する。
【００２８】
［第１実施形態］
〔システム構成〕
図１は、第１実施形態における分散実行システムの構成例を概念的に示す図である。第１実施形態における分散実行システム１は、パイププログラム、このパイププログラムにより実現されるパイプを介して相互に接続する第１分散プログラム及び第２分散プログラムを実行する。
【００２９】
分散実行システム１は、ハードウェア構成として、複数のノード７０（スペアノード７５を含む）を有する。ノード７０は、コンピュータと呼ぶこともできる。ノード７０は、ＣＰＵ（Central Processing Unit）、メモリ、入出力インタフェース等を含み、メモリに格納された各種プログラムを実行するためのハードウェア要素群を示す概念である。ノード７０は、パーソナルコンピュータのような１台のコンピュータ装置であってもよいし、ＣＰＵボードといった１台のハードウェア装置に複数装着可能な単位であってもよい。分散プログラムやパイププログラムは、例えば、ＣＤ（Compact Disc）、メモリカード等のような可搬型記録媒体や、ハードディスク、ＲＯＭ（Read Only Memory）等の或るノード７０上のメモリに格納される。
【００３０】
ここでは２つの分散プログラムを対象とするが、本実施形態は、パイプを介して相互に通信可能に接続されていれば、分散プログラムの数を制限しない。また、第１分散プログラム及び第２分散プログラムが異なるノード７０上で動作する場合を例に挙げる。
【００３１】
第１実施形態における分散実行システム１は、ソフトウェア構成要素として、出力側プログラムマスタ１０、出力側プログラムワーカ１５、入力側プログラムマスタ２０、入力側プログラムワーカ２５、パイプマスタ３０、出力側パイプワーカ４０、入力側パイプワーカ５０、パイプ情報ディレクトリ３５、実行状態データベース６０等を有する。以降、出力側プログラムマスタ１０を出力側マスタ１０と表記し、出力側プログラムワーカ１５を出力側ワーカ１５と表記し、入力側プログラムマスタ２０を入力側マスタ２０と表記し、入力側プログラムワーカ２５を入力側ワーカ２５と表記し、実行状態データベース６０を実行状態ＤＢ６０と表記する。
【００３２】
第１分散プログラムが或るノード７０上で実行されると、分散実行システム１は、任意のノード７０上に出力側マスタ１０を起動させ、出力側マスタ１０が指定されたノード７０上に出力側ワーカ１５を起動させる。同様に、第２分散プログラムが或るノード７０上で実行されると、分散実行システム１は、任意のノード７０上に入力側マスタ２０を起動させ、入力側マスタ２０が指定されたノード７０上に入力側ワーカ２５を起動させる。例えば、図１の例に示されるように、複数の出力側ワーカ１５及び複数の入力側ワーカ２５がそれぞれ異なるノード７０上で起動する。出力側マスタ１０及び入力側マスタ２０は、例えば、設定ファイルを参照することにより、出力側ワーカ１５及び入力側ワーカ２５を起動するノード７０を特定してもよい。また、本実施形態は、出力側ワーカ１５及び入力側ワーカ２５の数を限定しない。
【００３３】
第１実施形態では、説明の便宜のため、第１分散プログラムにより実現される出力側ワーカ１５が出力するデータを、第２分散プログラムにより実現される入力側ワーカ２５が入力として取得する例を示すが、相互にデータをやりとりする形態であってもよい。
【００３４】
パイプが利用される場合、分散実行システム１において、パイプを作成するためのコマンドが実行される。そのコマンドには、パイプの名前等が指定される。そのコマンドは、第１分散プログラム又は第２分散プログラムから呼ばれるようにしてもよい。そのコマンドが実行されると、分散実行システム１は、適当なノード７０にパイプマスタ３０を起動する。分散実行システム１は、更に、起動されたパイプマスタ３０に接続するための情報をそのパイプの名前と関連付けてパイプ情報ディレクトリ３５に格納する。パイプマスタ３０に接続するための情報（接続情報）には、パイプマスタ３０が動作しているノード７０のＩＰ（Internet Protocol）アドレスやパイプマスタ３０が接続を受け付けるポート番号等が含まれる。なお、パイプの名前をそれら接続情報を含む形態（ＵＲＬ等）とすれば、パイプ情報ディレクトリ３５は省かれてもよい。
【００３５】
第１分散プログラム及び第２分散プログラムでは、利用したいパイプの名前、そのパイプの利用形態が指定されている。パイプの利用形態には、そのパイプを入力のために利用するか、又は、そのパイプを出力のために利用するかが指定される。
【００３６】
出力側マスタ１０及び入力側マスタ２０は、パイプ情報ディレクトリ３５を検索することにより、パイプマスタ３０への接続情報を取得し、この接続情報を用いてパイプマスタ３０にそれぞれ接続する。ここで、接続するとは、通信可能な状態とすることを意味する。更に、出力マスタ１０及び入力側マスタ２０は、パイプの利用形態及びワーカを起動したノード７０の情報をパイプマスタ３０に通知する。
【００３７】
パイプマスタ３０は、出力側マスタ１０及び入力側マスタ２０から通知された情報に基づいて、各ノード７０上で、出力側パイプワーカ４０及び入力側パイプワーカ５０を起動する。これにより、出力側パイプワーカ４０は、出力側ワーカ１５と同じノード７０上で動作し、入力側パイプワーカ５０は、入力側ワーカ２５と同じノード上で動作する。パイプマスタ３０は、起動された各パイプワーカに接続するための情報（接続情報）を出力側マスタ１０及び入力側マスタ２０に通知する。パイプワーカへの接続情報としては、例えば、ソケットが利用される場合には、ポート番号が利用される。
【００３８】
出力側ワーカ１５及び入力側ワーカ２５は、出力側マスタ１０又は入力側マスタ２０から通知されるパイプワーカへの接続情報を取得し、この接続情報を用いて、出力側パイプワーカ４０又は入力側パイプワーカ５０に接続する。出力側ワーカ１５は、出力データと共にその出力データの出力順番を示すシーケンス番号を、接続された出力側パイプワーカ４０に送る。入力側ワーカ２５は、接続された入力側パイプワーカ５０から、出力側ワーカ１５の出力データを取得する。パイプを経由して通信される出力データは、単純なバイト列ではなく、例えば、意味を持ったまとまり（以下レコードと呼ぶ）の単位で送受信される。
【００３９】
出力側パイプワーカ４０は、接続された出力側ワーカ１５から、出力データと共にその出力データの出力順番を示すシーケンス番号を取得し、出力データ及びシーケンス番号を入力側パイプワーカ５０に転送する。入力側パイプワーカ５０は、出力側パイプワーカ４０から送られた出力データ及びシーケンス番号を受信し、それら受信されたデータを入力側ワーカ２５に送る。
【００４０】
出力側パイプワーカ４０は、入力側パイプワーカ５０へ送信された出力データに対応する最新シーケンス番号を保持する。入力側パイプワーカ５０は、出力側パイプワーカ４０から送信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ４０毎の最新シーケンス番号を保持する。なお、出力側パイプワーカ４０及び入力側パイプワーカ５０は、出力データ自体を内部で保持（バッファリング）しないものとする。これは、障害時にパイプ自身の実行状態を回復しなくて良いようにするためである。
【００４１】
出力側マスタ１０及び入力側マスタ２０は、ソフトウェア構成要素として、図１に示されるような同一の構成を有する。即ち、出力側マスタ１０は、保存制御部１１、ワーカ制御部１２を有し、入力側マスタ２０は、保存制御部２１、ワーカ制御部２２を有する。パイプマスタ３０は、ソフトウェア構成要素として、管理データベース（ＤＢ）３１、ワーカ制御部３２等を有する。
【００４２】
ワーカ制御部１２及び２２は、出力側ワーカ１５及び入力側ワーカ２５に対する上述のような制御処理、パイプマスタ３０に対する上述のような通信処理等を行う。パイプマスタ３０のワーカ制御部３２は、出力側パイプワーカ４０及び入力側パイプワーカ５０に対する上述のような制御処理、出力側マスタ１０及び入力側マスタ２０に対する上述のような通信処理等を行う。
【００４３】
保存制御部１１及び２１は、出力側ワーカ１５及び入力側ワーカ２５の実行状態の保存及び回復に関する処理等を行う。
【００４４】
管理ＤＢ３１は、出力側ワーカ１５及び入力側ワーカ２５で保存された実行状態を特定するための状態特定情報（例えば実行状態名）と、その実行状態保存時に各出力側パイプワーカ４０に保持されていた各シーケンス番号とを関連付けた状態で格納する。管理ＤＢ３１は、関連保持部に対応する。
【００４５】
出力側ワーカ１５及び入力側ワーカ２５は、ソフトウェア構成要素として、図１に示されるような同一の構成を有する。即ち、出力側ワーカ１５は、状態回復部１７、パイプ接続部１８、連携処理部１９を有し、入力側ワーカ２５は、状態回復部２７、パイプ接続部２８、連携処理部２９を有する。また、出力側パイプワーカ４０及び入力側パイプワーカ５０は、ソフトウェア構成要素として、図１に示されるような同一の構成を有する。即ち、出力側パイプワーカ４０は、プログラム接続部４１、通信部４２、連携処理部４９を有し、入力側パイプワーカ５０は、プログラム接続部５１、通信部５２、連携処理部５９を有する。
【００４６】
パイプ接続部１８及びプログラム接続部４１は、出力側ワーカ１５と出力側パイプワーカ４０との間の接続及びデータの授受を遂行する。同様に、パイプ接続部２８及びプログラム接続部５１は、入力側ワーカ２５と入力側パイプワーカ５０との間の接続及びデータの授受を遂行する。通信部４２及び５２は、出力側パイプワーカ４０と入力側パイプワーカ５０との間の通信を遂行する。プログラム接続部４１又は通信部４２が出力側パイプワーカ４０の保持部に相当する。また、プログラム接続部５１又は通信部５２が入力側パイプワーカ５０の保持部に相当する。
【００４７】
状態回復部１７及び２７は、出力側ワーカ１５及び入力側ワーカ２５の実行状態の保存及び回復に関する処理等を行う。連携処理部１９及び２９は、出力側マスタ１０及び入力側マスタ２０と出力側ワーカ１５及び入力側ワーカ２５との間でデータを送受信する。連携処理部４９及び５９は、パイプマスタ３０と出力側パイプワーカ４０及びパイプマスタ３０と入力側パイプワーカ５０との間でデータを送受信する。連携処理部４９は、情報取得部に相当する。
【００４８】
実行状態ＤＢ６０は、出力側ワーカ１５及び入力側ワーカ２５に関する任意の時点の実行状態を保存する。言い換えれば、実行状態ＤＢ６０は、出力側ワーカ１５及び入力側ワーカ２５を或る時点の実行状態に戻すための、各時点の回復データをそれぞれ格納する。なお、本実施形態は、実行状態の保存形態を限定しない。実行状態ＤＢ６０に格納されるデータは、障害発生時等に、出力側ワーカ１５及び入力側ワーカ２５が或る正常時点の実行状態に戻れるのであれば、どのようなデータであってもよい。
【００４９】
〔動作例〕
以下、第１実施形態における分散実行システム１の動作例について、図２から図５を用いて、場面毎にそれぞれ説明する。図２から図５では、分散実行システム１上で実行されるパイププログラム及び分散プログラムが示されている。
【００５０】
図２は、第１実施形態における分散実行システム１のプログラム起動時の動作例を示すシーケンス図である。図２に示されるように、ユーザは、分散実行システム１においてパイプ作成コマンドを実行する（Ｓ２０１）。このパイプ作成コマンドにはパイプ名等が指定される。ここでは、パイプ作成コマンドを実行する主体をユーザとしたが、分散プログラムやその他のプログラムがその内部でパイプ作成コマンドを実行するようにしてもよい。
【００５１】
パイプ作成コマンドの実行により、分散実行システム１はパイプマスタ３０を起動する（Ｓ２０２）。続いて、分散実行システム１は、起動されたパイプマスタ３０に接続するための情報をパイプ名と関連付けてパイプ情報ディレクトリ３５に登録する（Ｓ２０３）。
【００５２】
次に、ユーザは、分散実行システム１において、利用したいパイプ名と入力又は出力の種別とを指定して分散プログラムを実行する（Ｓ２０５）。これにより、図２から図５に示されるように、第１分散プログラム及び第２分散プログラムが実行される。
【００５３】
分散実行システム１は、指定された種別に応じたプログラムマスタを適切なノード７０上に起動する（Ｓ２０６）。図１の例では、出力種別の指定に応じて、出力側マスタ１０が起動され、入力種別の指定に応じて、入力側マスタ２０が起動される。引き続き、起動されたプログラムマスタは、任意のノード７０上にプログラムワーカを起動する（Ｓ２０６）。図１の例では、出力側マスタ１０が複数のノード７０上に出力側ワーカ１５を起動し、入力側マスタ２０が複数のノード７０上に入力側ワーカ２５を起動する。
【００５４】
プログラムマスタは、指定されたパイプ名を用いてパイプ情報ディレクトリ３５からパイプマスタ３０への接続情報を抽出する。プログラムマスタは、抽出された接続情報を用いて、パイプマスタ３０に接続する（Ｓ２０７）。パイプマスタ３０は、プログラムマスタからの接続を受け付ける（Ｓ２０８）。なお、パイプマスタ３０とプログラムマスタとの間の接続は、例えば、プロセス間通信を実現するための一般的な周知のシーケンスにより実現される。結果、出力側マスタ１０及び入力側マスタ２０は、パイプマスタ３０とそれぞれ接続する。
【００５５】
プログラムマスタは、パイプマスタ３０との接続に成功すると、プログラムワーカを起動したノード７０の情報をパイプマスタ３０に通知する（Ｓ２０８）。具体的には、出力側マスタ１０は、各出力側ワーカ１５を起動した各ノード７０の情報をそれぞれパイプマスタ３０に通知し、入力側マスタ２０は、各入力側ワーカ２５を起動した各ノード７０の情報をそれぞれパイプマスタ３０に通知する。
【００５６】
パイプマスタ３０は、プログラムマスタからの通知に応じて、各プログラムワーカが動作するノード７０上で、指定された種別（入力又は出力）に応じたパイプワーカを起動する（Ｓ２０９）。具体的には、パイプマスタ３０は、各出力側ワーカ１５が動作するノード７０上に各出力側パイプワーカ４０をそれぞれ起動し、各入力側ワーカ２５が動作するノード７０上に各入力側パイプワーカ５０をそれぞれ起動する。
【００５７】
パイプマスタ３０は、起動された各パイプワーカに接続するための情報をプログラムマスタに通知する（Ｓ２１０）。これにより、出力側マスタ１０は、各出力側パイプワーカ４０に接続するための情報を取得し、入力側マスタ２０は、各入力側パイプワーカ５０に接続するための情報を取得する。
【００５８】
プログラムマスタは、各パイプワーカに接続するための情報を各プログラムワーカにそれぞれ通知する（Ｓ２１１）。プログラムワーカは、通知された接続情報を用い、パイプワーカに接続する（Ｓ２１２）。結果、出力側ワーカ１５は出力側パイプワーカ４０に接続し、入力側ワーカ２５は入力側パイプワーカ５０に接続する。
【００５９】
図３は、第１実施形態における分散実行システム１のプログラム実行時の動作例を示すシーケンス図である。プログラムワーカ間でパイプを介した通信が行われる場合、図３に示される（Ｓ３０１）から（Ｓ３０４）の処理が実行される。
【００６０】
出力側ワーカ１５は、出力側パイプワーカ４０に渡す出力データに対して、その出力データが入力側ワーカ２５に送られる順番を示す番号（シーケンス番号）を付す。出力側ワーカ１５は、出力データと共にその出力データに関するシーケンス番号を、接続された出力側パイプワーカ４０に送る（Ｓ３０１）。
【００６１】
出力側パイプワーカ４０は、出力側ワーカ１５から受け取った出力データ及びそのシーケンス番号を入力側パイプワーカ５０に転送する（Ｓ３０２）。
【００６２】
入力側パイプワーカ５０は、出力側パイプワーカ４０から出力データ及びシーケンス番号を受け取り、当該出力データを入力側ワーカ２５に渡す（Ｓ３０２）。このとき、出力側パイプワーカ４０及び入力側パイプワーカ５０は、やりとりされたシーケンス番号のうち少なくとも最新のシーケンス番号を保持する（Ｓ３０３）。
【００６３】
入力側ワーカ２５は、出力側ワーカ１５からの出力データをレコード単位で取得する（Ｓ３０４）。
【００６４】
各プログラムワーカは、任意のタイミングで、自身の実行状態を実行状態ＤＢ６０にそれぞれ保存する。出力側ワーカ１５の実行状態が保存される場合、図３に示される（Ｓ３１０）から（Ｓ３１４）の処理が実行される。
【００６５】
出力側マスタ１０の保存制御部１１は、任意のタイミングで、各出力側ワーカ１５に実行状態を保存するようそれぞれ指示する。任意のタイミングは、例えば、所定の周期である。各出力側ワーカ１５では、連携処理部１９が、出力側マスタ１０からの指示を受けると、状態回復部１７が、自身（出力側ワーカ１５）の動作を停止させ、そのときの実行状態を、その実行状態を特定し得る状態特定情報と共に、実行状態ＤＢ６０に保存する（Ｓ３１０）。状態特定情報は、実行状態を示す名前（文字列）であってもよいし、識別数値（ＩＤ）であってもよい。
【００６６】
出力側マスタ１０の保存制御部１１は、各出力側ワーカ１５から、実行状態保存の完了の通知を受けると、実行状態保存の完了を各状態特定情報と共にパイプマスタ３０に通知する（Ｓ３１１）。
【００６７】
なお、ここでは、出力側マスタ１０が各出力側ワーカ１５に対して実行状態の保存を指示する例を示したが、各出力側ワーカ１５が所定のタイミングで実行状態の保存をそれぞれ独自に開始するようにしてもよい。
【００６８】
パイプマスタ３０は、出力側マスタ１０から実行状態保存の完了の通知を受けると、各出力側パイプワーカ４０から、そのときの最新のシーケンス番号をそれぞれ収集する（Ｓ３１２）。パイプマスタ３０は、各出力側ワーカ１５で保存された実行状態を特定するための各状態特定情報と、収集された各シーケンス番号とを、対応する出力側パイプワーカ４０の情報と関連付けた状態で管理ＤＢ３１にそれぞれ格納する（Ｓ３１３）。パイプマスタ３０は、処理（Ｓ３１３）の完了を出力側マスタ１０に通知する。
【００６９】
出力側マスタ１０では、パイプマスタ３０から処理の完了の通知を受けると、保存制御部１１が、各出力側ワーカ１５に動作の再開を指示する。これにより、各出力側ワーカ１５はそれぞれ動作を再開する（Ｓ３１４）。
【００７０】
一方、入力側ワーカ２５の実行状態が保存される場合、図３に示される（Ｓ３２０）から（Ｓ３２６）の処理が実行される。この場合、入力側マスタ２０の保存制御部２１が、任意のタイミングで、パイプマスタ３０に通信の停止を要求する（Ｓ３２０）。この任意のタイミングは、入力側ワーカ２５の実行状態が保存されるタイミングであり、例えば、所定の周期である。
【００７１】
パイプマスタ３０は、通信停止の要求を受けると、各出力側パイプワーカ４０に、各出力側ワーカ１５からの出力データの送信を停止するようそれぞれ指示する（Ｓ３２１）。これにより、出力側ワーカ１５から出力側パイプワーカ４０に出力データ及びシーケンス番号が送られなくなる。
【００７２】
入力側マスタ２０では、パイプマスタ３０から送信停止の指示の完了を知らされると、保存制御部２１が、各入力側ワーカ２５に実行状態を保存するようそれぞれ指示する。各入力側ワーカ２５では、連携処理部２９が、入力側マスタ２０からの指示を受けると、状態回復部２７が、自身（入力側ワーカ２５）の処理を停止させ、そのときの実行状態を、実行状態を特定し得る状態特定情報と共に、実行状態ＤＢ６０に保存する（Ｓ３２２）。
【００７３】
入力側マスタ２０の保存制御部２１は、各入力側ワーカ２５から、実行状態保存の完了の通知を受けると、実行状態保存の完了を各状態特定情報と共にパイプマスタ３０に通知する（Ｓ３２３）。
【００７４】
パイプマスタ３０は、入力側マスタ２０から実行状態保存の完了の通知を受けると、各出力側パイプワーカ４０から、そのときの最新のシーケンス番号をそれぞれ収集する（Ｓ３２４）。パイプマスタ３０は、各入力側ワーカ２５で保存された実行状態を特定する各状態特定情報と、収集された各シーケンス番号とを、対応する出力側パイプワーカ４０の情報と関連付けた状態で管理ＤＢ３１にそれぞれ格納する（Ｓ３２５）。パイプマスタ３０は、処理（Ｓ３２５）の完了を入力側マスタ２０に通知する。
【００７５】
入力側マスタ２０では、パイプマスタ３０から処理の完了の通知を受けると、保存制御部２１が、各入力側ワーカ２５に動作の再開を指示する。これにより、各入力側ワーカ２５はそれぞれ動作を再開する（Ｓ３２６）。
【００７６】
図４は、第１実施形態における分散実行システム１の出力側分散プログラムでの障害発生時の動作例を示すシーケンス図である。
【００７７】
障害発生時には、出力側マスタ１０（ワーカ制御部１２）が、障害の発生した出力側ワーカ１５を検知する（Ｓ４０１）。例えば、ワーカ制御部１２は、各出力側ワーカ１５を常時監視する。なお、出力側マスタ１０による障害の検知は、出力側ワーカ１５からの通知により実現されてもよい。出力側ワーカ１５の障害は、その出力側ワーカ１５が動作するノード７０のハードウェア障害などにより生じる。障害の検知手法は周知な手法が用いられれば良い。出力側マスタ１０のワーカ制御部１２は、少なくとも１つの出力側ワーカ１５の障害を検知すると、全出力側ワーカ１５の実行を停止させる（Ｓ４０１）。以降、障害の発生した出力側ワーカ１５を障害ワーカと表記する。
【００７８】
出力側マスタ１０は、障害ワーカが動作するノード７０の代替として、全ノード７０の中からスペアノード７５を特定する（Ｓ４０２）。出力側マスタ１０（ワーカ制御部１２）は、スペアノード７５上に障害ワーカ（出力側ワーカ１５）の代替となる出力側ワーカ１５を新たに起動する（Ｓ４０２）。以降、このスペアノード７５上に新たに起動された出力側ワーカ１５を代替ワーカと表記する。出力側マスタ１０は、障害の発生とスペアノード７５に関する情報とをパイプマスタ３０に通知する（Ｓ４０２）。
【００７９】
パイプマスタ３０は、出力側マスタ１０からの通知に基づいて、スペアノード７５上で出力側パイプワーカ４０を新たに起動する（Ｓ４０３）。
【００８０】
続いて、パイプマスタ３０は、各入力側パイプワーカ５０から、保持される最新のシーケンス番号を収集する（Ｓ４０４）。このとき、パイプマスタ３０は、各最新のシーケンス番号に関し、送信元の出力側パイプワーカ４０の情報も合せて収集するようにしてもよい。パイプマスタ３０は、各入力側パイプワーカ５０から収集されたシーケンス番号に基づいて、出力側パイプワーカ４０毎のシーケンス番号の最大値を取得し、これを回復シーケンス番号として各出力側パイプワーカ４０にそれぞれ通知する（Ｓ４０５）。通知対象とされる出力側パイプワーカ４０には、スペアノード７５上で新たに起動された出力側パイプワーカ４０も含まれる。
【００８１】
パイプマスタ３０は、スペアノード７５に新たに起動された出力側パイプワーカ４０に接続するための情報と共に、実行再開要求を出力側マスタ１０に通知する（Ｓ４０６）。
【００８２】
出力側マスタ１０（ワーカ制御部１２）は、パイプマスタ３０からの通知に基づいて、代替ワーカに、スペアノード７５に新たに起動された出力側パイプワーカ４０に接続するための情報を伝える（Ｓ４０７）。続いて、出力側マスタ１０（保存制御部１１）は、停止させていた各出力側ワーカ１５（代替ワーカも含む）に、実行状態の回復及び再開を指示する。
【００８３】
各出力側ワーカ１５では、出力側マスタ１０からの指示に応じて、状態回復部１７が、実行状態ＤＢ６０に格納されるデータを用いて、その出力側ワーカ１５の実行状態を最近保存された状態に戻し、その出力側ワーカ１５の実行を再開させる（Ｓ４０８）。このとき、代替ワーカは、障害の発生した出力側ワーカ１５に関して保存されている実行状態に設定され、実行を開始する。
【００８４】
これにより、代替ワーカを含む各出力側ワーカ１５は、回復された状態に応じたシーケンス番号及び出力データを各出力側パイプワーカ４０にそれぞれ送る（Ｓ４０９）。このとき、実行状態の回復により、各出力側ワーカ１５で付番されていたシーケンス番号もその回復された状態に戻っている。
【００８５】
各出力側パイプワーカ４０は、処理（Ｓ４０５）でパイプマスタ３０から通知された回復シーケンス番号以前のシーケンス番号と共に送られてくる出力データについては無視する（Ｓ４１０）。各出力側パイプワーカ４０は、当該回復シーケンス番号より後のシーケンス番号と共に送られてくる出力データについては入力側パイプワーカ５０へ転送する（Ｓ４１１）。
【００８６】
これにより、当該回復シーケンス番号以前のシーケンス番号が付された出力データは、入力側ワーカ２５へ送られず、当該回復シーケンス番号より後のシーケンス番号が付された出力データから入力側ワーカ２５へ送られ始める（Ｓ４１２）。
【００８７】
ここで、当該回復シーケンス番号に対応する出力データは、出力側ワーカ１５で障害が発生する前に、既に、出力側ワーカ１５から入力側ワーカ２５に送られている。当該回復シーケンス番号は、入力側パイプワーカ５０で保持されていたため、既に、出力側パイプワーカ４０から入力側パイプワーカ５０に送られた最新の出力データに対応する。よって、上述のような動作により、出力側ワーカ１５と入力側ワーカ２５との間で、その状態回復前に既に行われた通信は再度行われない。
【００８８】
一方、障害の発生していない各入力側ワーカ２５は、その最新の出力データを受けた以降の実行状態となっている。上述のように、出力側パイプワーカ４０により最新の出力データ以前の出力データは無視されるため、異常の発生した第１分散プログラムと正常な第２分散プログラムとの間で、実行状態に合った通信のみが行われる。従って、障害回復後の各分散プログラムの実行状態に不整合は生じない。
【００８９】
図５は、第１実施形態における分散実行システム１の入力側分散プログラムでの障害発生時の動作例を示すシーケンス図である。
【００９０】
処理（Ｓ５０１）から処理（Ｓ５０３）は、図４に示される処理（Ｓ４０１）から処理（Ｓ４０３）と、障害発生箇所（入力側か出力側か）のみの違いしかないため、ここでは説明を省略する。
【００９１】
パイプマスタ３０は、スペアノード７５上に入力側パイプワーカ５０を新たに起動させると（Ｓ５０３）、各入力側ワーカ２５の最新保存実行状態と関連付けられて保存されるシーケンス番号を管理ＤＢ３１からそれぞれ抽出する（Ｓ５０４）。パイプマスタ３０は、抽出された各シーケンス番号を、回復シーケンス番号として、対応する出力側パイプワーカ４０にそれぞれ送る（Ｓ５０５）。
【００９２】
更に、パイプマスタ３０は、抽出された各シーケンス番号以前のシーケンス番号と関連付けられて格納される、各出力側ワーカ１５の状態特定情報を管理ＤＢ３１からそれぞれ抽出する（Ｓ５０６）。
【００９３】
パイプマスタ３０は、抽出された各状態特定情報と共に、実行停止要求を出力側マスタ１０に通知する（Ｓ５０７）。これにより、出力側マスタ１０（ワーカ制御部１２）は、各出力側ワーカ１５の実行を停止させ、その完了をパイプマスタ３０に返信する（Ｓ５０８）。
【００９４】
パイプマスタ３０は、各出力側ワーカ１５の停止を確認すると、スペアノード７５上に新たに起動された入力側パイプワーカ５０への接続情報と共に、実行再開要求を入力側マスタ２０に送る（Ｓ５０９）。
【００９５】
処理（Ｓ５１０）及び処理（Ｓ５１１）は、図４に示される処理（Ｓ４０７）及び処理（Ｓ４０８）と、障害発生箇所（入力側か出力側か）のみの違いしかないため、ここでは説明を省略する。入力側マスタ２０は、各入力側ワーカ２５の再開が完了すると、それをパイプマスタ３０へ通知する（Ｓ５１２）。
【００９６】
パイプマスタ３０は、入力側マスタ２０からの通知により各入力側ワーカ２５の再開を確認すると、実行再開要求を出力側マスタ１０へ送る（Ｓ５１３）。
【００９７】
出力側マスタ１０は、パイプマスタ３０からの通知に応じて、停止させていた各出力側ワーカ１５に、各状態特定情報が示す実行状態への回復及び再開を指示する。これにより、各出力側ワーカ１５では、状態回復部１７が、実行状態ＤＢ６０に格納されるデータを用いて、当該状態特定情報により特定される実行状態に、その出力側ワーカ１５の実行状態を戻し、その出力側ワーカ１５の動作を再開させる（Ｓ５１４）。
【００９８】
以降、処理（Ｓ５１５）から処理（Ｓ５１８）は、図４に示す処理（Ｓ４０９）から処理（Ｓ４１２）と同じであるため、ここでは説明を省略する。
【００９９】
このように、入力側分散プログラムにおいて障害が発生した場合には、代替ワーカを含む各入力側ワーカ２５は、最近保存された実行状態にそれぞれ戻り（Ｓ５１１）、各出力側ワーカ１５は、各入力側ワーカ２５が戻った状態以前の実行状態にそれぞれ戻り（Ｓ５０６、Ｓ５１４）、各出力側パイプワーカ４０には、入力側ワーカ２５の実行状態に対応するシーケンス番号（回復シーケンス番号）がそれぞれ設定される（Ｓ５０５）。結果、第２分散プログラムにより実現される入力側ワーカ２５において障害が発生した場合であっても、出力側ワーカ１５で障害が発生した場合と同様に、実行状態回復後に見合った通信以降から再開され、障害回復後の各分散プログラムの実行状態に不整合は生じない。
【０１００】
上述のような第１実施形態における分散実行システム１の作用について、図６から図８を用いて説明する。図６から図８では、ノードＸ、ノードＹ及びノードＺ上の各々において出力側ワーカ１５及び出力側パイプワーカ４０が動作し、ノードＰ、ノードＱ及びノードＲ上の各々において入力側ワーカ２５及び入力側パイプワーカ５０が動作する例が示される。ここでは、動作するノードの符号を用いて、出力側ワーカ、出力側パイプワーカ、入力側ワーカ、入力側パイプワーカを示すものとする。例えば、ノードＸ上で動作する出力側ワーカ１５及び出力側パイプワーカ４０は、出力側ワーカＸ及び出力側パイプワーカＸと表記する。
【０１０１】
図６は、第１実施形態における分散実行システム１のプログラム実行時の作用例を概念的に示す図である。図６に示されるように、出力側ワーカＸから入力側ワーカＰには、シーケンス番号５及びそれに対応する出力データが既に送信されており、出力側ワーカＹから入力側ワーカＱには、シーケンス番号３及びそれに対応する出力データが既に送信されており、出力側ワーカＺから入力側ワーカＲには、シーケンス番号７及びそれに対応する出力データが既に送信されているものと仮定する。更に、図６に示される各プログラムワーカの実行状態が実行状態ＤＢ６０に格納されているものと仮定する。
【０１０２】
図７は、第１実施形態における分散実行システム１の出力側分散プログラムで障害発生時の作用例を概念的に示す図である。図６に示される状態において、出力側のノードＹで障害が発生した場合、出力側ワーカＹの障害が検知された後、出力側ワーカＸ、Ｙ及びＺの実行が停止される。更に、ノードＹの代替としてスペアノードＹ'が確保され、そのスペアノードＹ'上で、出力側ワーカＹ'及び出力側パイプワーカＹ'が新たに起動される。そして、出力側パイプワーカＸには、入力側パイプワーカ５０に保持されていた最新シーケンス番号５が回復シーケンス番号として通知される。同様に、出力側パイプワーカＹ'には、最新シーケンス番号３が回復シーケンス番号として通知され、出力側パイプワーカＺには、最新シーケンス番号７が回復シーケンス番号として通知される。
【０１０３】
その後、出力側ワーカＸは、直近に保存された実行状態３に回復し、出力側ワーカＺは、直近に保存された実行状態６に回復する。スペアノードＹ'上に起動された出力側ワーカＹ'は、出力側ワーカＹにおいて直近に保存された実行状態２に回復する。このとき、入力側ワーカＰ、Ｑ及びＲは、シーケンス番号５、３及び７に対応するデータを受信した以降の実行状態でそれぞれ動作している。
【０１０４】
出力側ワーカＸ、Ｙ'及びＺは、実行の再開により、回復した実行状態に応じて、シーケンス番号３、２及び６に対応する通信を開始しようとする。これに対して、出力側パイプワーカＸ、Ｙ'及びＺは、通知された回復シーケンス番号以前のシーケンス番号に対応する通信を無視する。具体的には、出力側パイプワーカＸは、シーケンス番号５以前のシーケンス番号３から５と共に送られる出力データを無視する。出力側パイプワーカＹ'は、シーケンス番号３以前のシーケンス番号２及び３と共に送られる出力データを無視する。出力側パイプワーカＺは、シーケンス番号７以前のシーケンス番号６及び７と共に送られる出力データを無視する。
【０１０５】
ここで、出力側パイプワーカ４０での出力データの無視とは、その出力データの送信元である出力側ワーカ１５には正常に送信されたと認識させつつ、その出力データを入力側パイプワーカ５０へ転送しないことを意味する。その無視された出力データは、出力側パイプワーカ４０において削除されてもよい。
【０１０６】
結果、入力側ワーカＰ、Ｑ及びＲの実行状態に適合するシーケンス番号以降の通信が行われる。
【０１０７】
図８は、第１実施形態における分散実行システム１の入力側分散プログラムで障害発生時の作用例を概念的に示す図である。図６に示される状態において、入力側のノードＱで障害が発生した場合、入力側ワーカＱの障害が検知された後、入力側ワーカＰ、Ｑ及びＲ、並びに、出力側ワーカＸ、Ｙ及びＺの実行が停止される。更に、ノードＱの代替としてスペアノードＱ'が確保され、そのスペアノードＱ'上で、入力側ワーカＱ'及び入力側パイプワーカＱ'が新たに起動される。そして、入力側ワーカＰ、Ｑ'及びＲは、直近に保存された実行状態４、３及び４に回復し、出力側パイプワーカＸ、Ｙ及びＺには、入力側ワーカＰ、Ｑ'及びＲの回復状態に対応するシーケンス番号４、３及び４が回復シーケンス番号として通知される。
【０１０８】
一方で、出力側ワーカＸ、Ｙ及びＺは、入力側ワーカＰ、Ｑ'及びＲの回復状態以前の実行状態として、実行状態３、２及び２に回復する。ここで、出力側ワーカＺに関しては、図６に示されるように、直近に保存された実行状態６のデータ及びその前に保存された実行状態２のデータが実行状態ＤＢ６０に保存されている。ところが、直近に保存された実行状態６は、入力側ワーカＲが回復する状態４より新しいため、出力側ワーカＺは、実行状態２に回復する。
【０１０９】
出力側ワーカＸ、Ｙ及びＺは、実行の再開により、回復した実行状態に応じて、シーケンス番号３、２及び２に対応する通信を開始しようとする。これに対して、出力側パイプワーカＸ、Ｙ及びＺは、通知された回復シーケンス番号以前のシーケンス番号に対応する通信を無視する。具体的には、出力側パイプワーカＸは、シーケンス番号４以前のシーケンス番号３及び４と共に送られる出力データを無視する。出力側パイプワーカＹは、シーケンス番号３以前のシーケンス番号２及び３と共に送られる出力データを無視する。出力側パイプワーカＺは、シーケンス番号４以前のシーケンス番号２から４と共に送られる出力データを無視する。結果、入力側ワーカＰ、Ｑ'及びＲの実行状態に適合するシーケンス番号以降の通信が行われる。
【０１１０】
なお、上述の第１実施形態では、各プログラムワーカが動作するノード７０において障害が発生することが想定されている。これは、ワーカが動作するノード７０は多数存在するため、そのうちの一つで障害が発生する確率が高いためである。マスタが動作するノード７０はプログラム及びパイプの数だけしか存在しないため、障害が起こる確率は低い。
【０１１１】
［第１実施形態の補足］
上述の説明では特に明記していなかったが、図９Ａ及び図９Ｂに示されるように、出力側パイプワーカ４０と入力側パイプワーカ５０との接続形態は、１対１であってもよいし、１対多であってもよいし、多対１であってもよい。図９Ａは、出力側パイプワーカ４０と入力側パイプワーカ５０との１対１の接続形態及び１対多の接続形態を概念的に示す図である。図９Ｂは、出力側パイプワーカ４０と入力側パイプワーカ５０との多対１の接続形態を概念的に示す図である。
【０１１２】
図９Ａの例では、ノードＹの出力側パイプワーカ４０が、ノードＱの入力側パイプワーカ５０及びノードＲの入力側パイプワーカ５０に接続されている。この場合、例えば、パイプマスタ３０のワーカ制御部３２が、出力側パイプワーカ４０にデータの割り振りを指示する。パイプマスタ３０の指示に応じて、出力側パイプワーカ４０の通信部４２は、プログラム接続部４１によりノードＹの出力側ワーカ１５から取得されたシーケンス番号及び出力データの送信先を２つの入力側パイプワーカ５０間で切り替える。
【０１１３】
障害回復時に、出力側パイプワーカ４０に通知される回復シーケンス番号は、上述したように、出力側パイプワーカ４０毎のシーケンス番号の最大値とされる（図４のＳ４０５参照）。例えば、ノードＱの入力側パイプワーカ５０に保持される最新シーケンス番号が６であり、ノードＲの入力側パイプワーカ５０に保持される最新シーケンス番号が４である場合には、ノードＹの出力側パイプワーカ４０に関するシーケンス番号の最大値は６であるため、シーケンス番号６が回復シーケンス番号としてノードＹの出力側パイプワーカ４０に通知される。
【０１１４】
図９Ｂの例では、ノードＸ及びノードＺの各出力側パイプワーカ４０が、ノードＱの入力側パイプワーカ５０に接続されている。このような形態は、例えば、次のような場合に適用される。ノードＸの出力側ワーカ１５がノードＰ宛てに、ノードＹの出力側ワーカ１５がノードＱ宛てに、ノードＺの出力側ワーカ１５がノードＲ宛てにそれぞれデータを出力している場合に、ノードＹの出力側ワーカ１５が処理を終了したと仮定する。この場合、ノードＱの入力側ワーカ２５は入力されるデータがなくなるため処理を停止させる。これではリソースの有効活用が図れないため、他のノード（ノードＸ及びＺ）からの出力データをノードＱで処理させる。これが図９Ｂの例に示される形態である。
【０１１５】
この形態は、例えば、入力されるデータがなくなったノードＱの入力側パイプワーカ５０がパイプマスタ３０に依頼することにより、実現される。パイプマスタ３０は、この依頼を受けると、データの出力を継続している出力側パイプワーカ４０の少なくとも１つを選択し、その出力側パイプワーカ４０に、入力データがなくなった依頼元の入力側パイプワーカ５０にデータを分配するよう指示する。
【０１１６】
この形態では、入力側パイプワーカ５０は、シーケンス番号及び出力データの送信元となる出力側パイプワーカ４０を特定し得る情報と共に、その出力側パイプワーカ４０に関する最新シーケンス番号を保持するようにすればよい。即ち、ノードＱの入力側パイプワーカ５０は、ノードＹの出力側パイプワーカ４０から送られてきたシーケンス番号の中の最新シーケンス番号、ノードＸの出力側パイプワーカ４０から送られてきたシーケンス番号の中の最新シーケンス番号、ノードＺの出力側パイプワーカ４０から送られてきたシーケンス番号の中の最新シーケンス番号をそれぞれ保持する。
【０１１７】
上述の説明では、１つの出力側の第１分散プログラムと１つの入力側の第２分散プログラムとが１つのパイプを介してデータを授受する例が示された。上述の第１実施形態の各構成は、１つの出力側の分散プログラムと複数の入力側の分散プログラムとが接続される形態に対しても同様に、適用可能である。図１０は、複数のプログラムがパイプを介して接続する形態の例を論理的に示す図である。図１０では、プログラムマスタとプログラムワーカとの区別、パイプマスタとパイプワーカとの区別を省略し、論理的にプログラムとパイプがどのように接続されているかのみが示されている。
【０１１８】
図１１は、出力側のプログラムＣ及びＦと入力側のプログラムＤとの接続を持つ分散実行システム１の構成例を概念的に示す図である。図１１に示されるように、プログラムワーカＣは、出力側パイプワーカＵ及び入力側パイプワーカＵを介して、その出力データをプログラムワーカＤに送り、プログラムワーカＦは、出力側パイプワーカＷ及び入力側パイプワーカＷを介して、その出力データをプログラムワーカＤに送る。このとき、入力側のプログラムワーカＤは、入力側パイプワーカＵ及びＷと接続される。
【０１１９】
図１０及び図１１の例におけるプログラムＤのように、複数のパイプと接続しているプログラムの場合、実行状態の保存を行う際は接続しているすべてのパイプのパイプマスタに対して、実行状態の保存を行ったことを伝える。すなわち、プログラムＤが実行状態の保存を行う際は、パイプＵ、Ｖ及びＷの各パイプマスタ３０に対し、実行状態の保存を行ったことを伝える。パイプマスタ３０の動作は上述のとおりである。
【０１２０】
第１実施形態の説明では、入力側のプログラム（上述の第２分散プログラム）のワーカ障害時には、出力側のプログラム（上述の第１分散プログラム）の各ワーカの実行状態も戻した。実行状態を戻すべき出力側のプログラムが更に別のパイプを介しての入力側のプログラムであった場合、当該別のパイプを介した出力側のプログラムの各ワーカの実行状態も戻す。図１０の例では、プログラムＥのワーカに障害が発生した場合、パイプＶのパイプマスタ３０を経由してプログラムＤの実行状態を戻し、更に、プログラムＤはパイプＵ及びＷの入力側プログラムでもあるため、それぞれのパイプマスタ３０を経由して、プログラムＣ及びプログラムＦの実行状態も戻す。
【０１２１】
図１０及び図１１の例のような形態を持つ分散実行システム１についてもその動作は、図２から図５に示されるとおりである。但し、複数のパイプに接続されている分散プログラムの動作は、通知先及び通知元等が複数のパイプマスタとなる。例えば、処理（Ｓ４０１）及び処理（Ｓ５０１）におけるパイプマスタに通知する処理は、接続されている複数のパイプのパイプマスタに対してそれぞれ行われる。また、処理（Ｓ４０８）及び処理（Ｓ５１１）に関しては、接続されているすべてのパイプマスタからの処理終了の通知を受けたことを確認した後に、最近保存した実行状態に回復され、実行が再開される。また、自身のプログラムが入力側となるすべてのパイプマスタに対し、実行の再開が通知される。
【０１２２】
分散実行システム１は、図１０の例においてプログラムＥのワーカに障害が発生した場合、パイプＶを介してその出力側となるプログラムＤの回復を行うと共に、パイプＵ及びＷを介して出力側となるプログラムＣ及びＦの回復も行う。この場合の分散実行システム１の動作も基本的には図５と同様となる。プログラムＥとプログラムＤとの関係が、図５の分散プログラム（入力側）と分散プログラム（出力側）との関係となり、プログラムＤとプログラムＣとの関係及びプログラムＤとプログラムＦとの関係が、図５の分散プログラム（入力側）と分散プログラム（出力側）との関係となる。
【０１２３】
具体的には、プログラムＤは、処理（Ｓ５０８）でパイプマスタ３０から実行停止要求を受けるが、これを処理（Ｓ５０１）に相当するものとして、処理（Ｓ５０１）の障害検知、処理（Ｓ５０２）及び処理（Ｓ５０３）を除き、処理（Ｓ５０１）以降の処理を行う。出力側の処理から入力側の処理に切り替えたプログラムＤは、処理（Ｓ５０１）において処理を停止させた後、プログラムＤ自身が入力側プログラムである場合のパイプマスタ３０（パイプＵ及びＷ）に対して通知を行う（Ｓ５０２に相当）。プログラムＤは、この通知に、回復する実行状態を特定するための状態特定情報を含める。
【０１２４】
パイプＵ及びＷの各パイプマスタ３０は、処理（Ｓ５０５）から処理（Ｓ５０９）をそれぞれ実行する。処理（Ｓ５０６）では、各パイプマスタ３０は、上述のように通知された状態特定情報で特定される実行状態以前の状態を示す状態特定情報を管理ＤＢ３１から抽出する。これにより、上流のプログラムＣ及びＦは、この抽出された状態特定情報で特定される実行状態に回復する。プログラムＤは、処理（Ｓ５１１）において、その実行状態に回復して実行を再開する。
【０１２５】
［第２実施形態］
第２実施形態における分散実行システム１は、分散プログラムとパイププログラムとの接続形態にループが含まれる場合にも適応する。図１２は、複数のプログラムがパイプを介して接続する形態にループが含まれる場合の例を論理的に示す図である。
【０１２６】
図１２の例では、図１０の例と異なり、分散プログラムとパイププログラムとの接続形態にループが含まれる。即ち、全てのプログラムが入力側及び出力側の両方の役割を持つ。この場合、出力側の分散プログラムの状態を、入力側の分散プログラムが回復する以前の状態に回復させる操作がループし、収束しなくなる。
【０１２７】
そこで、第２実施形態における分散実行システム１では、実行状態の保存を各分散プログラムで任意に行うのではなく、リーダとなる分散プログラム（以降、リーダプログラムと表記する）からの指示により各分散プログラムは実行状態の保存を行う。なお、第２実施形態は、リーダプログラムの決定方法を制限せず、例えば、プログラム起動時にリーダプログラムが指定されるようにしてもよい。
【０１２８】
以下、第２実施形態における分散実行システム１の動作について、第１実施形態と異なる内容を中心に説明し、第１実施形態と同じ内容については適宜省略する。また、以下の説明では、入力側の分散プログラムにとっての出力側の分散プログラムを上流と表記し、出力側の分散プログラムにとっての入力側の分散プログラムを下流と表記する場合もある。
【０１２９】
まず、実行状態保存時の動作について説明する。この動作は、図３の処理（Ｓ３１０）から処理（Ｓ３１３）、処理（Ｓ３２０）から処理（Ｓ３２６）に相当する。
【０１３０】
リーダプログラムは、実行状態保存時には、自身の実行を停止させた後、上流及び下流の各分散プログラムに、実行状態の保存を要求する。なお、各分散プログラムは、実行の停止中に、上流の分散プログラムからパイプを介して取得されたデータを受付可能であるとする。例えば、図１１において、プログラムＢがリーダプログラムである場合、プログラムＢは、上流のプログラムＡ及び下流のプログラムＣに実行状態の保存をそれぞれ要求する。プログラムＢからプログラムＡに実行状態の保存が要求される場合、具体的には、分散実行システム１は次のように動作する。プログラムＢのプログラムマスタが、パイプＸのパイプマスタに当該要求を行い、パイプＸのパイプマスタが、プログラムＡのプログラムマスタに当該要求を行う。以降、プログラム間の要求の伝達を述べる際、プログラムマスタ及びパイプマスタの動作については省略する。
【０１３１】
リーダプログラムは、保存される実行状態を特定し得る状態特定情報（例えば名前）と共に、実行状態保存要求を各分散プログラムにそれぞれ送る。
【０１３２】
実行状態保存要求を受けた分散プログラムは、まず、自身の実行を停止させる。その後、当該分散プログラムは、その実行状態保存要求の送信元が下流のプログラムである場合、その送信元に実行の停止を伝える。図１２の例では、リーダプログラムＢから実行状態保存要求を受けたプログラムＡ及びＣのうち、プログラムＡは実行の停止をプログラムＢに伝えるが、プログラムＣはそれを伝えない。
【０１３３】
実行状態保存要求を受けた分散プログラムは、更に、その実行状態保存要求の送信元以外の、パイプを介して接続される他の分散プログラムの全てに実行状態保存要求を送信する。
【０１３４】
図１２の例のようにループが含まれる場合には、実行状態保存要求を複数回受け取る分散プログラムが生じる。このような分散プログラムは、自身が実行状態保存要求の処理中であるか否かを判断し、処理中の場合には、２回目以降の実行状態保存要求に対しては他の分散プログラムへの実行状態保存要求の送信を行わない。但し、そのような分散プログラムは、その実行状態保存要求の送信元が下流のプログラムである場合、その送信元に実行の停止を伝える。
【０１３５】
実行状態保存要求に応じて自身の実行を停止し、更に他の分散プログラムに実行状態保存要求を送信した分散プログラムは、送信先の分散プログラムのうち全ての上流の分散プログラムから実行の停止を伝えられることにより、自身の実行状態を保存する。これは、全ての上流のプログラムが停止したことでパイプを介してデータが入力されてこないことが保証されるからであり、これにより、実行状態保存中にパイプを介したデータ入力により自身の実行状態が変更されないことが保証される。
【０１３６】
図１２の例では、リーダプログラムＢは、プログラムＡから実行の停止を伝えられてから、自身の実行状態を保存する。プログラムＣは、上流のプログラム（例えばプログラムＢ）には実行状態保存要求を送っていないため、他のプログラムから実行停止が伝えられることを待たず、自身の実行状態を保存する。プログラムＡは、上流のプログラムＣに実行状態保存要求を送っているため、プログラムＣから実行の停止が伝えられることを待って、自身の実行状態を保存する。
【０１３７】
各分散プログラムは、実行状態の保存が完了すると、実行状態保存の完了を、その実行状態を特定するための状態特定情報と共に、上流側のパイプマスタ３０に伝える（Ｓ３１１）。この通知に応じて、パイプマスタ３０は、第１実施形態と同様に、処理（Ｓ３１２）及び処理（Ｓ３１３）を行った後、上流の分散プログラムに実行状態の保存の完了を伝える。
【０１３８】
各分散プログラムは、全ての下流のプログラムから実行状態の保存の完了通知を受けると、実行を再開する（Ｓ３１４）。図１２の例では、プログラムＢは、プログラムＣからの実行状態保存完了通知を待ち、実行を再開する。プログラムＡは、プログラムＢからの当該通知を待ち、プログラムＣは、プログラムＡからの当該通知を待つ。
【０１３９】
次に、障害発生時の動作について説明する。この動作は、図４及び図５の各処理に相当する。出力側（上流）のプログラムに障害が発生した場合の動作は、第１実施形態（図４）と同様であるため、ここでは説明を省略する。
【０１４０】
第２実施形態では、入力側（下流）のプログラムに障害が発生した場合には、入力側プログラムが回復する実行状態と同じタイミングの実行状態に、出力側プログラムも回復させる。よって、処理（Ｓ５０６）では、処理（Ｓ５０５）で抽出されたシーケンス番号と同じシーケンス番号と関連付けられて格納される、出力側プログラムの状態特定情報が抽出される。これは、上述のとおり実行状態の保存を行う際、上流のプログラムと下流のプログラムとで実行状態の保存を同期して行っているからである。
【０１４１】
［ハードウェア構成の変形例］
上述の第１実施形態及び第２実施形態では、出力側の分散プログラム（例えば、第１分散プログラム）が、出力側マスタ１０及び出力側ワーカ１５を実現し、入力側の分散プログラム（例えば、第２分散プログラム）が、入力側マスタ２０及び入力側ワーカ２５を実現する例を示した。しかしながら、本発明はこのような各形態に限定されない。
【０１４２】
図１３は、ノード７０と分散プログラムとの関連を概念的に示す図である。図１３に示されるように、出力側マスタ１０、入力側マスタ２０及びパイプマスタ３０は、マスタプログラム８１がノード７０（＃１）で実行されることにより実現され、出力側ワーカ１５、入力側ワーカ２５、出力側パイプワーカ４０及び入力側パイプワーカ５０は、ワーカプログラム８２がノード７０（＃２）等で実行されることにより実現され、スペアワーカは、ワーカプログラム８２がスペアノード７５で実行されることにより実現されてもよい。
【０１４３】
なお、上述の説明で用いた複数のフローチャートでは、複数の工程が順番に記載されているが、本実施形態で実行される各工程の実行順序は、その記載の順番に制限されない。本実施形態では、図示される工程の順番を内容的に支障のない範囲で変更することができる。また、上述の各実施形態は、内容が相反しない範囲で組み合わせることができる。
【０１４４】
上記の各実施形態の一部又は全部は、以下の付記のようにも特定され得る。但し、各実施形態が以下の記載に限定されるものではない。
【０１４５】
（付記１）パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する分散実行システムにおいて、
前記第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、
前記第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、
を備え、
前記出力側パイプワーカは、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、
前記プログラム接続部により取得されたシーケンス番号と前記情報取得部により取得された回復シーケンス番号とを比較し、前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない第１通信部と、
を含む、分散実行システム。
【０１４６】
（付記２）前記入力側パイプワーカは、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信する第２通信部と、
前記第２通信部により受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持する保持部と、
を含み、
前記分散実行システムは、
前記入力側パイプワーカの前記保持部により保持される最新シーケンス番号を取得し、取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送るワーカ制御部を含むパイプマスタ、
を更に備える付記１に記載の分散実行システム。
【０１４７】
（付記３）前記出力側パイプワーカは、
前記第１通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持する保持部、
を更に含み、
前記出力側ワーカ及び前記入力側ワーカは、各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタは、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカの前記保持部に保持される最新シーケンス番号を取得し、取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持する関連保持部、
を更に含み、
前記パイプマスタの前記ワーカ制御部は、前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて前記関連保持部に保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記２に記載の分散実行システム。
【０１４８】
（付記４）前記パイプマスタの前記ワーカ制御部は、前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカは、保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
付記３に記載の分散実行システム。
【０１４９】
（付記５）前記第２分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカの前記第１通信部は、前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタの前記ワーカ制御部は、前記各入力側パイプワーカの各保持部により保持される最新シーケンス番号をそれぞれ収集し、収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記１から４のいずれか１つに記載の分散実行システム。
【０１５０】
（付記６）パイプで相互に接続される複数の分散プログラムを実行する分散実行システムにおいて、
前記複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを備え、
前記複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
分散実行システム。
【０１５１】
（付記７）複数のコンピュータが、
パイプを介して第２分散プログラムと接続される第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカを起動し、
前記第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカを起動し、
前記出力側パイプワーカが、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得し、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得し、
前記シーケンス番号と回復シーケンス番号とを比較し、
前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない、
ことを含む分散プログラム実行方法。
【０１５２】
（付記８）前記入力側パイプワーカが、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信し、
前記受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持し、
前記複数のコンピュータの中の少なくとも１つが、
パイプマスタを起動し、
前記パイプマスタが、
前記入力側パイプワーカにより保持される最新シーケンス番号を取得し、
前記取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
ことを更に含む付記７に記載の分散プログラム実行方法。
【０１５３】
（付記９）前記出力側パイプワーカが、
前記第１通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持し、
前記出力側ワーカ及び前記入力側ワーカが、
各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタが、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカに保持される最新シーケンス番号を取得し、
前記取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持し、
前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
ことを更に含む付記８に記載の分散プログラム実行方法。
【０１５４】
（付記１０）前記パイプマスタが、
前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカが、
保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
ことを更に含む付記９に記載の分散プログラム実行方法。
【０１５５】
（付記１１）前記第２分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカが、
前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタが、
前記各入力側パイプワーカにより保持される最新シーケンス番号をそれぞれ収集し、
前記収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、
前記抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
ことを更に含む付記７から１０のいずれか１つに記載の分散プログラム実行方法。
【０１５６】
（付記１２）複数のコンピュータが、
パイプで相互に接続される複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを起動し、
前記複数の分散プログラムの中のリーダプログラムが、
リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカが、
プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、
前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、
前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、
上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
ことを含む分散プログラム実行方法。
【０１５７】
（付記１３）パイプを介して接続される第１分散プログラム及び第２分散プログラムを実行する複数のコンピュータに、
前記第１分散プログラムで実現される出力側ワーカと同じノード上で動作する出力側パイプワーカと、
前記第２分散プログラムで実現される入力側ワーカと同じノード上で動作し、前記出力側パイプワーカから前記出力側ワーカの出力データを受信し、この出力データをその入力側ワーカに渡す入力側パイプワーカと、
を実現させ、
前記出力側パイプワーカは、
前記出力側ワーカから、出力データと共にその出力データが前記入力側ワーカへ送られる順番を示すシーケンス番号を取得するプログラム接続部と、
前記入力側ワーカの実行状態に対応する回復シーケンス番号を取得する情報取得部と、
前記プログラム接続部により取得されたシーケンス番号と前記情報取得部により取得された回復シーケンス番号とを比較し、前記回復シーケンス番号以前の順番を示すシーケンス番号と共に取得された出力データについては前記入力側パイプワーカへ転送しない第１通信部と、
を含む、分散実行プログラム。
【０１５８】
（付記１４）前記入力側パイプワーカは、
前記出力側パイプワーカから送信された出力データ及びシーケンス番号を受信する第２通信部と、
前記第２通信部により受信されたシーケンス番号に基づいて、送信元の出力側パイプワーカ毎の最新シーケンス番号を保持する保持部と、
を含み、
前記複数のコンピュータの中の少なくとも１つに、
前記入力側パイプワーカの前記保持部により保持される最新シーケンス番号を取得し、取得された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送るワーカ制御部を含むパイプマスタ、
を更に実現させる付記１３に記載の分散実行プログラム。
【０１５９】
（付記１５）前記出力側パイプワーカは、
前記第１通信部により前記入力側パイプワーカへ送信された出力データに対応する最新シーケンス番号を保持する保持部、
を更に含み、
前記出力側ワーカ及び前記入力側ワーカは、各時点での実行状態を、各実行状態を特定するための状態特定情報とそれぞれ関連づけた状態で保存し、
前記パイプマスタは、
前記出力側ワーカ又は前記入力側ワーカが実行状態を保存した時点で、前記出力側パイプワーカの前記保持部に保持される最新シーケンス番号を取得し、取得された最新シーケンス番号と、保存された実行状態を特定するための状態特定情報とを関連付けて保持する関連保持部、
を更に含み、
前記パイプマスタの前記ワーカ制御部は、前記入力側ワーカにより最近保存された実行状態を特定するための状態特定情報と関連付けられて前記関連保持部に保持されるシーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記１４に記載の分散実行プログラム。
【０１６０】
（付記１６）前記パイプマスタの前記ワーカ制御部は、前記出力側パイプワーカに前記回復シーケンス番号として送られたシーケンス番号以前の順番を示すシーケンス番号と関連付けられて前記関連保持部に保持される、前記出力側ワーカに関する状態特定情報を前記出力側ワーカに送り、
前記出力側ワーカは、保存される実行状態のうち、前記パイプマスタから送られた状態特定情報で特定される実行状態に戻る、
付記１５に記載の分散実行プログラム。
【０１６１】
（付記１７）前記第２分散プログラムは複数の入力側ワーカを実現し、各入力側ワーカについて各入力側パイプワーカがそれぞれ設けられており、
前記出力側パイプワーカの前記第１通信部は、前記プログラム接続部により取得されたシーケンス番号及び出力データの送信先を前記各入力側パイプワーカ間で切り替え、
前記パイプマスタの前記ワーカ制御部は、前記各入力側パイプワーカの各保持部により保持される最新シーケンス番号をそれぞれ収集し、収集されたシーケンス番号の中から前記出力側パイプワーカに関する最新シーケンス番号を抽出し、抽出された最新シーケンス番号を前記回復シーケンス番号として前記出力側パイプワーカに送る、
付記１３から１６のいずれか１つに記載の分散実行プログラム。
【０１６２】
（付記１８）パイプで相互に接続される複数の分散プログラムを実行する複数のコンピュータに、
前記複数の分散プログラムにより実現される複数のプログラムワーカであって、上流のプログラムワーカからの出力データをパイプを介して取得し、下流のプログラムワーカへ自身の出力データを送る複数のプログラムワーカを、
実現させ、
前記複数の分散プログラムの中のリーダプログラムは、リーダプログラムにより実現されるプログラムワーカの実行を停止させると共に、前記上流のプログラムワーカ及び前記下流のプログラムワーカへそれぞれ実行状態保存要求を送信し、
前記実行状態保存要求を受信した各プログラムワーカは、プログラムワーカ自身の実行を停止させると共に、前記実行状態保存要求の送信元以外のパイプを介して接続される他のプログラムワーカに前記実行状態保存要求を転送し、前記実行状態保存要求の送信元となる全ての下流のプログラムワーカに実行停止の完了を通知し、前記実行状態保存要求の転送先の中の全ての上流のプログラムワーカから実行停止の完了の通知を受けた後、プログラムワーカ自身の実行状態の保存を実行し、上流のプログラムワーカに実行状態保存の完了を通知し、全ての下流のプログラムワーカから実行状態保存の完了を通知された後、プログラムワーカ自身の実行を再開する、
分散実行プログラム。
【０１６３】
（付記１９）付記１３から１８のいずれか１つに記載のプログラムを記録したコンピュータが読み取り可能な記録媒体。
【０１６４】
この出願は、２０１１年７月７日に出願された日本出願特願２０１１−１５０６１９号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【図１】
0006036690.tif 000002
【図２】
0006036690.tif 000003
【図３】
0006036690.tif 000004
【図４】
0006036690.tif 000005
【図５】
0006036690.tif 000006
【図６】
0006036690.tif 000007
【図７】
0006036690.tif 000008
【図８】
0006036690.tif 000009
【図９Ａ】
0006036690.tif 000010
【図９Ｂ】
0006036690.tif 000011
【図１０】
0006036690.tif 000012
【図１１】
0006036690.tif 000013
【図１２】
0006036690.tif 000014
【図１３】
0006036690.tif 000015