(57)【要約】【課題】ストリームデータ処理の二重化構成において、待機系追加時に処理停止を発生させずに、全てのウィンドウ演算の利用を実現する。【解決手段】待機系サーバ追加時刻を再現時刻６５０として記憶し、再現時刻以降のデータを複製したデータ６４１〜６４７、待機系６２０にも送信する。現用系４２０のデータ処理を継続しつつ、実行状態を保持するオペレータにおいて再現時刻以降に発生した実行状態の変化６５１、６５２、６５３を記録しておく。データ処理と並行して、オペレータ毎に、実行状態を待機系６２０にコピーする。このとき、コピー時点におけるオペレータの実行状態と、実行状態変化の記録から、再現時刻におけるオペレータの実行状態を再現してコピーする。全オペレータの実行状態のコピーが完了したら、複製した再現時刻以降のデータ６４１〜６４７の処理を待機系６２０開始する。【選択図】図６
2011192013.tif 000002
【特許請求の範囲】
【請求項１】
複数の計算機群を用いた冗長構成におけるストリームデータ処理障害回復方法であって、
前記計算機群は、データに対するクエリグラフ上のオペレータ集合による処理結果を出力する第一の計算機と、新たに追加された第二の計算機から構成され、
前記第一の計算機は、前記第二の計算機が前記計算機群に追加されたことを表す待機系追加通知に基づく時刻を再現時刻とし、
前記クエリグラフ上の前記オペレータ集合の実行ループにおいて、前記オペレータ集合中の状態複製の対象オペレータの実行時において、前記対象オペレータの実行状態に、前記再現時刻における状態からの変化があった場合に、状態の変化を表現する情報を記憶し、
前記実行ループ中の所定のタイミングにおいて、前記対象オペレータの前記タイミングにおける実行状態と、前記状態の変化を表現する情報とから、前記再現時刻における前記対象オペレータの実行状態を再現し、前記第二の計算機に送信する、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項２】
請求項１に記載のストリームデータ処理障害回復方法であって、
前記対象オペレータの実行状態を、前記対象オペレータが処理対象とする、生存期間中の前記データの集合によって表現し、
前記状態の変化を表現する情報である、前記再現時刻から前記タイミングまでに、前記実行状態を表現する前記データの集合から消滅した、前記再現時刻以前のデータの集合と、
前記タイミングにおける前記対象オペレータの実行状態を表現するデータの集合における、前記再現時刻以前の前記データの集合と、
の和集合であるデータ集合を、前記再現時刻における前記対象オペレータの実行状態とする、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項３】
請求項２に記載のストリームデータ処理障害回復方法であって、
前記タイミングにおいて、前記第一の計算機から前記第二の計算機に送信するデータの個数を制限し、
前記タイミングを複数回経過することで、前記再現時刻における前記実行状態を表現する全てのデータの集合を、前記第一の計算機から前記第二の計算機に送信する、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項４】
請求項１に記載のストリームデータ処理障害回復方法であって、
前記状態複製の対象オペレータがウィンドウ演算であり、
前記オペレータ集合中に含まれる全ての前記ウィンドウ演算について、実行状態を再現して、前記第二の計算機に送信し、前記第二の計算機が受信を完了した後に、
前記第二の計算機において、受信が完了した前記ウィンドウ演算のデータを対象として、
前記ウィンドウ演算を起点として、前記ウィンドウ演算の後段に位置する、直近のストリーム化演算を終点とする、部分クエリグラフ上のオペレータの処理を実行する、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項５】
請求項４に記載のストリームデータ処理障害回復方法であって、
前記第二の計算機において、前記ウィンドウ演算から、前記ストリーム化演算に至る、前記部分クエリグラフ上のオペレータの処理を、
前記部分クエリグラフのうち、入力とする全ての前記ウィンドウ演算の実行状態の受信が完了した部分クエリグラフから、順次パイプライン並列実行する、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項６】
請求項４に記載のストリームデータ処理障害回復方法であって、
前記ウィンドウ演算が永続ウィンドウであり、
前記永続ウィンドウを入力とする前記部分クエリグラフにおいて、前記永続ウィンドウが、集約オペレータの入力となっている場合、
前記永続ウィンドウを前記状態複製の対象オペレータから除外し、
前記集約オペレータを前記状態複製の対象オペレータに追加する、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項７】
請求項４に記載のストリームデータ処理障害回復方法であって、
前記ウィンドウ演算が永続ウィンドウであり、
前記第一の計算機において、前記永続ウィンドウのデータを外部記憶装置からロードしている場合に、
前記永続ウィンドウを前記状態複製の対象オペレータから除外し、
前記第二の計算機において、前記永続ウィンドウの実行状態を前記外部記憶装置から直接ロードする、
ことを特徴とするストリームデータ処理障害回復方法。
【請求項８】
複数の計算機群を用いた冗長構成において、ストリームデータ処理を実行する計算機装置であって、
インタフェース部と、記憶部と、データに対するクエリグラフ上のオペレータ集合による処理結果を出力する処理部とを備え、
前記処理部は、
前記オペレータ集合の実行状態を前記計算機群に新たに追加された他の計算機に再現する際、
前記他の計算機が追加されたことを表す待機系追加通知に基づく再現時刻を決定し、
前記クエリグラフ上の前記オペレータ集合の実行ループにおいて、前記オペレータ集合中の状態複製の対象オペレータの実行時において、前記対象オペレータの実行状態に、前記再現時刻における状態からの変化があった場合に、状態の変化を表現する情報を前記記憶部に記憶し、
前記実行ループ中の所定のタイミングにおいて、前記対象オペレータの前記タイミングにおける実行状態と、記憶された前記状態の変化を表現する情報とから、前記再現時刻における前記対象オペレータの実行状態を再現し、前記インタフェース部を介して前記他の計算機に送信する、
ことを特徴とする計算機装置。
【請求項９】
請求項８に記載の計算機装置であって、
前記処理部は、
前記対象オペレータの実行状態を、前記対象オペレータが処理対象とする、生存期間中のデータの集合によって表現し、
前記状態の変化を表現する情報である、前記再現時刻から前記タイミングまでに、前記実行状態を表現するデータ集合から消滅した、前記再現時刻以前のデータの集合と、
前記タイミングにおける、前記対象オペレータの実行状態を表現するデータの集合において、前記再現時刻以前のデータ集合と、
の和集合であるデータ集合を、前記再現時刻における前記対象オペレータの実行状態とする、
ことを特徴とする計算機装置。
【請求項１０】
請求項９に記載の計算機装置であって、
前記処理部は、
前記タイミングにおいて、送信するデータの個数を制限し、
前記タイミングを複数回経過することで、前記再現時刻における、前記実行状態を表現する、全てのデータの集合を前記他の計算機に送信する、
ことを特徴とする計算機装置。
【請求項１１】
複数の計算機群を用いた冗長構成において、ストリームデータ処理を実行する計算機装置であって、
インタフェース部と、記憶部と、処理部とを備え、
前記処理部は、
前記計算機装置が前記計算機群に追加されたことを示す待機系追加通知を、前記計算機群の現用系を構成する他の計算機に、前記インタフェース部を介して送出し、
前記他の計算機が、前記待機系追加通知を受けたことを契機として決定した再現時刻における、状態複製の対象オペレータである全てのウィンドウ演算の実行状態を、前記インタフェース部を介して受信し、
受信が完了した前記ウィンドウ演算のデータを対象として、前記ウィンドウ演算を起点として、前記ウィンドウ演算の後段に位置する、直近のストリーム化演算を終点とする部分クエリグラフ上のオペレータの処理を実行する、
ことを特徴とする計算機装置。
【請求項１２】
請求項１１に記載の計算機装置であって、
前記処理部は、
前記ウィンドウ演算から前記ストリーム化演算に至る前記部分クエリグラフ上のオペレータの処理を、入力とする全てのウィンドウ演算の実行状態の受信が完了した前記部分クエリグラフから、順次パイプライン並列実行する、
ことを特徴とする計算機装置。
【請求項１３】
請求項１１に記載の計算機装置であって、
前記ウィンドウ演算が永続ウィンドウであり、
前記処理部は、
前記永続ウィンドウを入力とする、前記部分クエリグラフにおいて、前記永続ウィンドウが、集約オペレータの入力となっている場合、
前記永続ウィンドウを、前記状態複製の対象オペレータから除外し、
前記集約オペレータを、前記状態複製の対象オペレータに追加する、
ことを特徴とする計算機装置。
【請求項１４】
請求項１１に記載の計算機装置であって、
前記ウィンドウ演算が永続ウィンドウであり、
前記処理部は、
前記永続ウィンドウのデータを、外部記憶装置からロードしている場合に、
前記永続ウィンドウを、前記状態複製の対象オペレータから除外し、
前記永続ウィンドウの実行状態を、前記外部記憶装置から直接ロードする、
ことを特徴とする計算機装置。
【請求項１５】
請求項１１に記載の計算機装置であって、
前記記憶部は、
前記再現時刻以降に受信するストリームデータを記憶し、
前記処理部は、前記部分クエリグラフ上のオペレータの処理を実行した後、
前記記憶部に記憶された前記ストリームデータの処理の実行を開始する、
ことを特徴とする計算機装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストリームデータ処理における障害回復技術に関し、特に、二重化構成において障害発生後の片系運用から二重系に復帰するための、待機系追加技術に関する。
【背景技術】
【０００２】
株取引の自動化、交通情報処理の高度化、クリックストリームの解析といった、高いレートで継続的に発生する情報をリアルタイムに解析し、瞬時にアクションを起こす技術の進展を背景に、高レートデータのリアルタイム処理を実現する、ストリームデータ処理が注目されている。ストリームデータ処理は、様々なデータ処理に適用可能な汎用ミドルウェア技術であるため、個別案件ごとにシステムを構築するのでは間に合わないようなビジネス環境の急激な変化にも応えつつ、実世界のデータをリアルタイムにビジネスに反映することを可能とする。このストリームデータ処理の原理、実現方式は非特許文献１に開示されている。
【０００３】
ストリームデータ処理は、前述のように高レートデータのリアルタイム処理であるため、処理結果の出力データも高レートで継続的に発生することになる。従って、障害が発生してから再び結果を出力可能となるまでに要する時間は、秒未満のオーダに抑えることが要求される。このような回復時間を実現する方法として有効であるのは、全く同じ処理を実行する二つのサーバを用意し、アプリケーションに結果を出力しているサーバに障害が発生した場合は、結果出力の役目を他のサーバに切り替える、二重化構成の利用である。
【０００４】
二重化構成において障害が発生した後は、単一のサーバしか動作していない片系運用になるため、さらなる障害が発生した場合にシステムが停止してしまうことになる。システム停止を回避するため、単一動作中の現用系サーバに待機系サーバを追加して、再び二重化構成に復帰する必要がある。このとき、追加された待機系サーバの実行状態は初期状態であるため、現用系サーバの実行状態を待機系サーバにも再現する必要がある。
【０００５】
待機系サーバに実行状態を再現する一つ目の方法として、正常動作中から入力ストリームをバックアップしておき、待機系追加時にはバックアップデータを待機系サーバで再実行して現用系サーバの実行状態に追付かせる、アップストリーム  バックアップ（Ｕｐｓｔｒｅａｍ  Ｂａｃｋｕｐ）方式が非特許文献２に開示されている。処理時間が長くなるほど、バックアップに必要なディスクやメモリなどの記憶容量は増大するが、次の理由で容量は一定以内に収まることが仮定できる。
【０００６】
ストリームデータ処理では、データ系列から直近の一部分を切り出すウィンドウ演算を利用することが可能である。ウィンドウ演算の定義は非特許文献３に開示されている。例えば、時間幅１分のウィンドウ演算によって切り出したデータに対して平均を算出する集約演算を適用すると、１分間の移動平均を算出する動作となる。この例においては、１分間データを流し続けるとウィンドウ内のデータが刷新されることになるため、初期状態から開始する待機系サーバにおいても直近１分間のデータを処理することで、現用系サーバと同じ実行状態になる。
【０００７】
待機系サーバに実行状態を再現する二つ目の方法として、待機系追加時に現用系サーバを一時停止して実行状態を静止化し、スナップショットとして待機系サーバに転送する方法が挙げられる。静止化してスナップショットを転送する方法は、データベースやトランザクションシステムで広く利用されている方法である。インメモリデータベースにおける静止化を利用した待機系追加方法が、特許文献１に開示されている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００９−１５７７８５号公報
【非特許文献】
【０００９】
【非特許文献１】Ｂ．Ｂａｂｃｏｃｋ、Ｓ．Ｂａｂｕ、Ｍ．Ｄａｔａｒ、Ｒ．Ｍｏｔｗａｎｉ  ａｎｄ  Ｊ．Ｗｉｄｏｍ、“Ｍｏｄｅｌｓ  ａｎｄ  ｉｓｓｕｅｓ  ｉｎ  ｄａｔａ  ｓｔｒｅａｍ  ｓｙｓｔｅｍｓ”、Ｉｎ  Ｐｒｏｃ．  ｏｆ  ＰＯＤＳ  ２００２、  ｐｐ．１−１６．（２００２）
【非特許文献２】Ｊ．Ｈ．Ｈｗａｎｇ、Ｍ．Ｂａｌａｚｉｎｓｋａ、Ａ．Ｒａｓｉｎ、Ｕ．Ｃｅｔｉｎｔｅｍｅｌ、Ｍ．Ｓｔｏｎｅｂｒａｋｅｒ  ａｎｄ  Ｓ．Ｂ．Ｚｄｏｎｉｋ、“Ｈｉｇｈ−Ａｖａｉｌａｂｉｌｉｔｙ  Ａｌｇｏｒｉｔｈｍｓ  ｆｏｒ  Ｄｉｓｔｒｉｂｕｔｅｄ  Ｓｔｒｅａｍ  Ｐｒｏｃｅｓｓｉｎｇ”、Ｉｎ  Ｐｒｏｃ．  ｏｆ  ＩＣＤＥ  ２００５、  ｐｐ．７７９−７９０．（２００５）
【非特許文献３】Ａ．Ａｒａｓｕ、Ｓ．Ｂａｂｕ  ａｎｄ  Ｊ． Ｗｉｄｏｍ. “Ｔｈｅ  ＣＱＬ  Ｃｏｎｔｉｎｕｏｕｓ  Ｑｕｅｒｙ  Ｌａｎｇｕａｇｅ： Sｅｍａｎｔｉｃ   Ｆｏｕｎｄａｔｉｏｎｓ  ａｎｄ  Ｑｕｅｒｙ  Ｅｘｅｃｕｔｉｏｎ”、（２００５）
【発明の概要】
【発明が解決しようとする課題】
【００１０】
上述のように、Ｕｐｓｔｒｅａｍ  Ｂａｃｋｕｐ方式においては、保持しておくべきデータの範囲が処理の進行に伴って未来に進むことを前提とすることで、バックアップのための記憶容量が一定以内に収まることを仮定できる。
【００１１】
しかし、ウィンドウ演算としては、時間ウィンドウ（Ｒａｎｇｅウィンドウ）以外にも、個数ウィンドウ（Ｒｏｗｓウィンドウ）、グループ別個数ウィンドウ（Ｐａｒｔｉｔｉｏｎウィンドウ）、永続ウィンドウ（Ｕｎｂｏｕｎｄｅｄウィンドウ）などが存在する。時間ウィンドウと異なり、これらのウィンドウでは一定時間データを流してもウィンドウが刷新されない可能性がある。例えば、証券取引の分析において銘柄毎に直近１００件の出来高統計を算出するといった処理は、グループ別個数ウィンドウを利用することで容易に定義できる。このとき、取引が低調な銘柄が存在すると、その銘柄の取引データがウィンドウに残り続けることになる。また、分析開始から全取引の集計を算出するといった処理は、永続ウィンドウを利用することで容易に定義できるが、同ウィンドウには分析開始以降の全データが残るため、決して刷新されないことになる。
【００１２】
このようなケースにＵｐｓｔｒｅａｍ  Ｂａｃｋｕｐ方式を適用すると、保持しておくべきデータ範囲の起点が進行しないため、データの保持に必要な記憶容量が際限なく増大し、いずれオーバフローすることになる。
【００１３】
一方、スナップショットを利用する方法では、時間ウィンドウに限らず全てのウィンドウ演算を利用可能である。但し、現用系サーバを静止化する期間、結果の出力が停止することになるため、アプリケーションに対して処理の停止として影響を与えてしまうことになる。実行状態のデータサイズが大きい程、停止時間が増大する。
【００１４】
この問題に対して特許文献１では、二重化構成ではなく三重以上の構成を前提として、一台のサーバに障害が発生して二重構成以上になった場合は、現用系サーバのうちの一台を静止化して、追加する待機系サーバにスナップショットを転送する方法が開示されている。このとき、もう一台の現用系サーバは静止化しないため、前記のような処理停止を回避可能である。但し、三台のサーバが必要であるため、導入コスト、運用コストが増大してしまうことになる。
【００１５】
本発明の目的は、ストリームデータ処理の二重化構成において、待機系追加時に処理停止を発生させずに、全てのウィンドウ演算の利用を実現するストリームデータ処理障害回復方法および装置を提供することにある。
【００１６】
また、本発明の目的は、正常運用時においてバックアップしたデータを利用せずに、待機系サーバ追加時点における現用系サーバの実行状態を、静止化せずに待機系サーバに再現することが可能なストリームデータ処理障害回復方法および装置を提供することにある。
【課題を解決するための手段】
【００１７】
上記の目的を達成するため、本発明においては、複数の計算機群を用いた冗長構成におけるストリームデータ処理障害回復方法であって、計算機群は、データに対するクエリグラフ上のオペレータ集合による処理結果を出力する第一の計算機と、新たに追加された第二の計算機から構成され、第一の計算機は、第二の計算機が計算機群に追加されたことを表す待機系追加通知に基づく時刻を再現時刻とし、クエリグラフ上のオペレータ集合の実行ループにおいて、オペレータ集合中の状態複製の対象オペレータの実行時において、対象オペレータの実行状態に、再現時刻における状態からの変化があった場合に、状態の変化を表現する情報を記憶し、実行ループ中の所定のタイミングにおいて、対象オペレータの当該タイミングにおける実行状態と、状態の変化を表現する情報とから、再現時刻における対象オペレータの実行状態を再現し、第二の計算機に送信する構成のストリームデータ処理障害回復方法を提供する。
【００１８】
また、上記の目的を達成するため、本発明においては、複数の計算機群を用いた冗長構成において、ストリームデータ処理を実行する第一の計算機装置であって、インタフェース部と、記憶部と、データに対するクエリグラフ上のオペレータ集合による処理結果を出力する処理部とを備え、処理部は、オペレータ集合の実行状態を計算機群に新たに追加された他の計算機に再現する際、他の計算機が追加されたことを表す待機系追加通知に基づく再現時刻を決定し、クエリグラフ上のオペレータ集合の実行ループにおいて、オペレータ集合中の状態複製の対象オペレータの実行時において、対象オペレータの実行状態に、再現時刻における状態からの変化があった場合に、状態の変化を表現する情報を記憶部に記憶し、実行ループ中の所定のタイミングにおいて、対象オペレータの当該タイミングにおける実行状態と、記憶部に記憶された状態の変化を表現する情報とから、再現時刻における対象オペレータの実行状態を再現し、インタフェース部を介して他の計算機に送信する構成の計算機装置を提供する。
【００１９】
更に、上記の目的を達成するため、本発明においては、複数の計算機群を用いた冗長構成において、ストリームデータ処理を実行する第二の計算機装置であって、インタフェース部と、記憶部と、処理部とを備え、処理部は、当該計算機装置が計算機群に追加されたことを示す待機系追加通知を、計算機群の現用系を構成する他の計算機にインタフェース部を介して送出し、他の計算機が、待機系追加通知を受けたことを契機として決定した再現時刻における、状態複製の対象オペレータである全てのウィンドウ演算の実行状態を、インタフェース部を介して受信し、受信が完了したウィンドウ演算のデータを対象として、ウィンドウ演算を起点として、ウィンドウ演算の後段に位置する、直近のストリーム化演算を終点とする部分クエリグラフ上のオペレータの処理を実行する構成の計算機装置を提供する。
【００２０】
すなわち、上記の目的を達成するため、本発明の好適な態様においては、以下の手順で待機系追加を実行する。
（１）待機系サーバ追加時の、現用系サーバにおけるデータ処理実行時刻を再現時刻として記憶する。
（２）再現時刻以降のデータを複製して、待機系サーバにも送信を開始する。
（３）現用系サーバにおいてデータ処理を継続し、実行状態を保持するオペレータにおいて、再現時刻以降に発生した実行状態の変化を、オペレータ毎に記録しておく。
（４）現用系サーバにおいて、データ処理と並行して、実行状態を保持するオペレータ毎に、実行状態を待機系サーバにコピーする。このとき、コピー時点におけるオペレータの実行状態と、記録しておいた再現時刻以降の実行状態変化から、再現時刻におけるオペレータの実行状態を再現してコピーする。コピー完了後は、オペレータにおける（３）に示した実行状態の変化の記録を停止する。
（５）実行状態を保持するオペレータの全てについてコピーが完了したら、待機系サーバにおいて、複製した再現時刻以降のデータの処理を開始する。
【００２１】
ここで、（３）に記した、記録する実行状態の変化は、オペレータの実行状態から消滅した、再現時刻より前のタイムスタンプを持つデータの集合とする。また、（４）に記した、実行状態の再現は、コピー時点における実行状態のうち、再現時刻より前のタイムスタンプを持つデータの集合と、記録しておいた再現時刻以降の実行状態変化であるデータ集合の、和集合をとったデータ集合とする。
【発明の効果】
【００２２】
本発明により、ストリームデータ処理の二重化構成において、待機系追加時に静止化のような処理停止を発生させずに、時間ウィンドウに限らず全てのウィンドウ演算が利用可能となる。また、正常運用時においてバックアップしたデータを利用せずに、待機系サーバ追加時点における現用系サーバの実行状態を、静止化せずに待機系サーバに再現することが可能となる。
【図面の簡単な説明】
【００２３】
【図１】第１の実施例における待機系追加時の動作の概要を示す図である。
【図２】第１の実施例に係る、二重化されたストリームデータ処理サーバの構成の一例を示す図である。
【図３】第１の実施例に係る、データ処理定義の一例を示す図である。
【図４】図３に示すデータ処理定義をクエリグラフに変換した結果を示す図である。
【図５Ａ】図４に示すクエリグラフにおける、ウィンドウ演算の実行状態の一例を示す図である。
【図５Ｂ】図４に示すクエリグラフにおける、ウィンドウ演算の実行状態の他の例を示す図である。
【図５Ｃ】図４に示すクエリグラフにおける、一時保護領域の実行状態の一例を示す図である。
【図５Ｄ】図４に示すクエリグラフにおける、ウィンドウ演算の実行状態の他の例を示す図である。
【図５Ｅ】図４に示すクエリグラフにおける、一時保護領域の実行状態の他の例を示す図である。
【図６】第１の実施例に係る、ストリームデータ処理サーバが利用される計算機環境の構成の一例を示す図である。
【図７】第１の実施例に係る、現用系における時間ウィンドウの実行状態を、待機系に再現する方法を例示する図である。
【図８】第１の実施例に係る、現用系におけるグループ別個数ウィンドウの実行状態を、待機系に再現する方法を例示する図である。
【図９】第１の実施例に係る、現用系における永続ウィンドウの実行状態を、待機系に再現する方法を例示する図である。
【図１０】第１の実施例の変形例として、現用系における時間ウィンドウの実行状態を、細分化して待機系に再現する方法を例示する図である。
【図１１】第１の実施例の変形例として、現用系におけるグループ別個数ウィンドウの実行状態を、細分化して待機系に再現する方法を例示する図である。
【図１２】第１の実施例におけるストリームデータ処理システムの機能構成例を示すブロック図である。
【図１３】第１の実施例におけるストリームデータ処理システムの構成例における、機能ブロック間の処理シーケンスを示す図である。
【図１４】第１の実施例に係る、待機系追加時における現用系システムの動作を示すフローチャートを示す図である。
【図１５】第１の実施例に係る、現用系におけるクエリ実行ループの動作を示すフローチャートを示す図である。
【図１６】第１の実施例に係る、待機系追加時における待機系システムの動作を示すフローチャートを示す図である。
【図１７】第１の実施例における待機系追加時の動作の概要を示す図である。
【図１８】第１の実施例に係る、現用系における結合オペレータの実行状態を、待機系に再現する方法を例示する図である。
【図１９】第１の実施例に係る、現用系における集約オペレータの実行状態を、待機系に再現する方法を例示する図である。
【図２０Ａ】第１の実施例の変形例として、現用系における結合オペレータの実行状態を、細分化して待機系に再現する方法を例示する図である。
【図２０Ｂ】第１の実施例の変形例として、現用系における結合オペレータの実行状態を、細分化して待機系に再現する方法を例示する図である。
【図２１】第１の実施例の変形例として、現用系における集約オペレータの実行状態を、細分化して待機系に再現する方法を例示する図である。
【図２２】第１の実施例の変形例である、待機系追加時における、永続ウィンドウを含むクエリの状態を再現する動作の概要を示す図である。
【図２３】第１の実施例の変形例である、待機系追加時における、永続ウィンドウの状態をデータベースから再現する動作の概要を示す図である。
【図２４】図１５のクエリ実行時における状態変化の記録処理を示すフローチャートを示す図である。
【図２５】図１５のクエリ実行時における実行状態の再現処理を示すフローチャートを示す図である。
【図２６】図１５のクエリ実行時における実行状態の再現処理を示すフローチャートを示す図である。
【発明を実施するための形態】
【００２４】
以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、実施の形態を説明するための全図において、同一の部材には原則として同一の符号を付し、その繰り返しの説明は省略する。
【実施例１】
【００２５】
まず、図１および図２を用いて、第１の実施例を実現するためのストリームデータ処理システムの基本構成を説明する。
【００２６】
図１に示すように、ネットワーク１０４にストリームデータ処理サーバ１００と計算機１０１、１０２、１０３が接続されている。本実施例のストリームデータ処理サーバ１００は、図２に示すように、二台の計算機２００および２１０から構成され、各計算機はそれぞれ、記憶部であるメモリ２０２および２１２、処理部である中央処理部（ＣＰＵ）２０１および２１１、ネットワークインタフェース部（Ｉ／Ｆ）２０４および２１４、記憶部であるストレージ２０３および２１３、およびそれらを結合するバス２０５および２１５によって構成される。
【００２７】
メモリ２０２上に、現用系のストリームデータ処理の論理動作を定義する、現用系ストリームデータ処理システム２０６を配置する。現用系ストリームデータ処理システム２０６は、後で詳述するようにＣＰＵ２０１によって解釈実行可能な実行イメージである。また、メモリ２１２上に、待機系のストリームデータ処理の論理動作を定義する、待機系ストリームデータ処理システム２１６を配置する。待機系ストリームデータ処理システム２１６は、後で詳述するようにＣＰＵ２１１によって解釈実行可能な実行イメージである。
【００２８】
ストリームデータ処理サーバ１００を構成する計算機２００および２１０は、ネットワークＩ／Ｆ２０４および２１４を介して外部のネットワーク１０４に接続される。
【００２９】
ネットワーク１０４に接続された計算機１０１上で動作する、クエリ登録コマンド実行インタフェース１０５を介して、ユーザによって定義されたクエリ１０６を、ストリームデータ処理サーバ１００を構成する計算機２００および２１０が受取ると、ストリームデータ処理システム２０６および２１６は、この定義に従ってストリームデータ処理を実行可能なクエリグラフを自身の内部に構成する。この後、ネットワーク１０４に接続された計算機１０２上で動作するデータソース１０７によって送信されるデータ１０８を、ストリームデータ処理サーバ１００を構成する計算機２００および２１０が受取ると、このクエリグラフに従って処理し、結果データ１１０を生成する。この結果データ１１０は、ネットワーク１０４に接続された計算機１０３上で動作する結果利用アプリケーション１０９に送信する。ストレージ２０３および２１３は、ストリームデータ処理システム２０６および２１６の他、一度受取ったクエリ１０６を保存する。ストリームデータ処理システム２０６および２１６は、起動時にストレージ２０３および２１３からこの定義されたクエリをロードし、クエリグラフを構成することも可能である。
【００３０】
なお、ここで説明した構成は本実施例のシステムの一例であり、計算機２００と２１０は一台の計算機で構成され、ＣＰＵ２０１および２１１は、同一計算機上の二つのプロセッサであっても構わない。あるいは、一つのマルチコアＣＰＵにおける二つの計算コアであっても構わない。また、メモリ２０６および２１６、ネットワークＩ／Ｆ２０４および２１４、ストレージ２０３および２１３は、それぞれが一つであって、一つの計算機に接続されるのであっても、あるいは二つの計算機に接続されて共有されるものであっても構わない。
【００３１】
次に、図３および図４を用いて、本実施例のストリームデータ処理におけるクエリとクエリグラフの一例を説明する。
【００３２】
図３に例示するクエリ３００は、２つの入力ストリームｓａおよびｓｂ、４つのクエリｑ１、ｑ２、ｑ３、およびｑ４を定義するクエリである。ストリームデータ処理システムは、クエリ３００の定義を受取ると、図４に示すように、自身の実行領域中に確保したクエリ実行ワークエリア４２０上に、オペレータ４００〜４１２によって構成される、クエリグラフを生成する。クエリオペレータ４００は入力ストリームｓａをデータソースから受取るＳｃａｎオペレータ、オペレータ４０３は入力ストリームｓｂをデータソースから受取るＳｃａｎオペレータである。ストリームｓａおよびｓｂは共に、文字列型のカラムｉｄと、整数型のカラムｖａlの二つのカラムから構成されるデータの系列である。図４のクエリグラフは、以下に順次説明するように、クエリｑ１、ｑ２、ｑ３、およびｑ４に対応する４つの部分クエリグラフから構成される。
【００３３】
オペレータ４０１、４０２、４０４、４０５、４０６および４０７は、クエリｑ１に対応する部分クエリグラフを構成するオペレータ群である。オペレータ４０１は、ストリームｓａに対して施されるグループ別個数ウィンドウ（ＰＡＲＴＩＴＩＯＮ  ＢＹ  ｉｄ  ＲＯＷＳ  ２）であり、カラムｉｄ別に最新２個のデータを切り出す。オペレータ４０４は、ストリームｓｂに対して施される時間ウィンドウ（ＲＡＮＧＥ  ５ ＭＩＮＵＴＥＳ）であり、直近５分以内のデータを切り出す。オペレータ４０２は、ウィンドウ４０１で切り出したデータに対して施されるフィルタオペレータ（ｓａ．ｖａｌ  ＞  １００）であり、カラムｖａｌの値が１００より大きいデータのみを通過させる。オペレータ４０５は、ウィンドウ４０４で切り出したデータに対して施されるフィルタオペレータ（ｓｂ．ｖａｌ  ＜＞  −１）であり、カラムｖａｌの値が−１以外のデータを通過させる。オペレータ４０６は、結合オペレータ（ｓａ．ｉｄ  ＝  ｓｂ．ｉｄ）であり、オペレータ４０２および４０５を通過したデータにおいて、カラムｉｄが一致する組合せを生成する。オペレータ４０７は、クエリの結果を正規化するストリーム化演算である。
【００３４】
オペレータ４０８および４０９は、クエリｑ２に対応する部分クエリグラフを構成するオペレータ群である。オペレータ４０８は、永続ウィンドウ（ＵＮＢＯＵＮＤＥＤ）であり、クエリｑ１の結果データを全て保持する。オペレータ４０９は集約オペレータであり、カラムｉｄ別にｓａ．ｖａｌとｓｂ．ｖａｌの平均を算出する。
【００３５】
オペレータ４１０および４１１は、クエリｑ３に対応する部分クエリグラフを構成するオペレータ群である。オペレータ４１０は射影オペレータであり、クエリｑ２の結果を加工する。オペレータ４１１はクエリの結果を正規化するストリーム化演算である。オペレータ４１２は、クエリｑ４に対応する部分クエリグラフを構成するオペレータであり、クエリの結果を正規化するストリーム化演算である。
【００３６】
一時保持領域４１３および４１４は、それぞれ結合オペレータ４０６および集約オペレータ４０９の実行状態を保持する領域である。一時保持領域４１３は、オペレータ４０６の左入力と右入力それぞれにおける、生存中のデータを保持する。これらは、反対側の入力に到来したデータの結合相手となる。一時保持領域４１４は、グループ別に集約結果のデータを一つずつ保持する。
【００３７】
上述した一時保存領域を持つ結合オペレータ、集約オペレータ以外に、ウィンドウ演算も、実行状態を保持するオペレータである。ウィンドウ演算は、個々の入力データに対して生存期間を定義し、生存中のデータを保持する。これら以外の、フィルタオペレータ、射影オペレータ、ストリーム化演算、Ｓｃａｎオペレータについては、実行状態を保持する必要はない。
【００３８】
次に、図５Ａ〜図５Ｅを用いて、図４のクエリグラフの各オペレータの実行状態の一例を示す。図５Ａのウィンドウ演算４０１にデータ５０１〜５０６を保持し、図５Ｂのウィンドウ演算４０４にデータ５１１〜５１７を保持している状態を表している。各データ中、長楕円で囲まれたものはデータのタイムスタンプを表し、左側の四角はカラムｉｄの値を、右側の四角はカラムｖａｌの値を表している。グループ別個数ウィンドウ４０１は、カラムｉｄ別に、最大２個のデータを保持している。時間ウィンドウ４０４は、タイムスタンプが９：５５〜９：５９までのデータを保持している。
【００３９】
図５Ｃの一時保持領域４１３は、オペレータ４０２からの左入力における生存中のデータ５０１〜５０５、およびオペレータ４０５からの右入力における生存中のデータ５１２、５１３、５１４、５１６、５１７を保持している。それぞれ、ウィンドウ演算４０１に保持しているデータ集合のうち、フィルタ条件ｓａ．ｖａｌ＞１００を満たすデータの集合、およびウィンドウ演算４０４に保持しているデータ集合のうち、フィルタ条件ｓｂ．ｖａｌ＜＞−１を満たすデータの集合である。また、上述の通り結合条件がカラムｉｄに関する等号条件であるため、カラムｉｄの値をキーとして索引付けしており、カラムｉｄの値別にグループ分けして保持している。
【００４０】
図５Ｄのウィンドウ演算４０８は、一時保持領域４１３に保持する、左入力のデータ集合と右入力のデータ集合の直積において、結合条件ｓａ．ｉｄ＝ｓｂ．ｉｄを満たす組合せ５２１〜５２８を保持している。これらのデータのタイムスタンプは、組合せた左右データのうち遅い方のタイムスタンプをとる。
【００４１】
図５Ｅの一時保持領域４１４は、ウィンドウ演算４０８に保持しているデータをカラムｉｄ別にグループ分けして集約したデータを、各グループにつき一つずつ保持している。カラムｉｄがａ、ｂおよびｃそれぞれについて、データ５３１、５３２、および５３３を保持している。
【００４２】
次に、図６を用いて、本実施例における待機系追加時の動作の概要を述べる。図２に示した現用系ストリームデータ処理システム２０６のみが動作している片系運用中に、待機系ストリームデータ処理システム２１６を追加する例を想定する。待機系ストリームデータ処理システム２１６を追加した際に、追加したことを現用系ストリームデータ処理システム２０６に通知する。現用系ストリームデータ処理システム２０６は、その時点のシステム時刻（この例では１０：００）など、待機系追加通知を契機として決定した時刻を、再現時刻６５０として記憶部に記憶する。また、再現時刻以降の入力データ６３１〜６３７を、データ６４１〜６４７に複製して待機系にも投入する。ここで、現用系システムは再現時刻以降のデータ処理を継続する一方、待機系システムはこれらのデータを処理せずに、計算機２１０の内部の記憶部であるストレージ２１３等に保持しておく。
【００４３】
図６の待機系ストリームデータ処理システム２１６は、自身の実行領域に確保したクエリ実行ワークエリア６２０上に、オペレータ６００〜６１２によって構成されるクエリグラフを生成する。このクエリグラフは、現用系のクエリ実行ワークエリア４２０上のクエリグラフと同一である。但し、実行状態を保持するウィンドウ演算６０１、６０４、６０８、および一時保持領域６１３、６１４は空の状態である。
【００４４】
一方、現用系のウィンドウ演算４０１、４０４、４０８それぞれに対して、状態変化記録領域６５１、６５２、６５３を生成する。現用系でのデータ処理の過程において、再現時刻１０：００以降に各ウィンドウで発生した実行状態の変化を、対応する状態変化記録領域６５１、６５２、６５３に記録しておく。
【００４５】
次に、各ウィンドウ演算４０１、４０４、４０８の実行状態を、ウィンドウ演算６０１、６０４、６０８に順次コピーする。ここで、コピーする必要があるのは再現時刻１０：００直前、即ち、１０：００の入力データを処理する直前の実行状態である。
【００４６】
例として、この時点の実行状態が図５Ａ〜図５Ｅに示した通りであったとする。まず、ウィンドウ演算４０４の実行状態を、ウィンドウ演算６０４にコピーする。コピー時刻が１０：０１（ｃｏｐｙ＠１０：０１と表示、以下同じ）になったとすると、ウィンドウ演算４０４からは、１０：０１の５分前である９：５６以前のデータは消滅している。消滅したデータはウィンドウ演算４０４における実行状態の変化として、状態変化記録領域６５２に記録する。コピー時刻１０：０１におけるウィンドウ演算４０４上のデータのうち、再現時刻１０：００より前のデータと、状態変化記録領域６５２のデータを合せることで、ウィンドウ演算４０４の再現時刻１０：００直前における実行状態を再現し、ウィンドウ演算６０４にコピーする。
【００４７】
同様に、ウィンドウ演算４０１の実行状態を１０：０２にコピーする場合も、状態変化記録領域６５１に、再現時刻１０：００から１０：０２までのウィンドウ演算４０１の変化を記録しているので、コピー時刻１０：０２におけるウィンドウ演算４０１の実行状態と、状態変化記録領域６５１のデータから、１０：００直前におけるウィンドウ演算４０１の実行状態を再現して、ウィンドウ演算６０１にコピーする。ウィンドウ演算４０８の実行状態を１０：０３にコピーする場合も同様である。コピー時刻におけるウィンドウ演算の実行状態と、状態変化記録領域のデータから、再現時刻におけるウィンドウ演算の実行状態を再現する方法の詳細は後述する。
【００４８】
図６に例示する本実施例のシステムによれば、１０：００直前における現用系の各ウィンドウ演算の実行状態の、待機系６２０の各ウィンドウ演算６０１、６０４、６０８へのコピーが完了した後に、ウィンドウ演算からストリーム化演算に至る部分クエリグラフを、ウィンドウ演算６０１、６０４、６０８上のデータについて実行することで、クエリグラフ上に存在するウィンドウ演算以外の、実行状態を保持するオペレータの状態も、再現時刻１０：００の直前における現用系の状態に再現することが可能である。図６の例では、角丸四角の破線で囲ったオペレータ群６２１および６２２が、ウィンドウ演算６０１、６０４、６０８からストリーム化演算６０７、６１１、６１２に至る部分クエリグラフを形成する。
【００４９】
部分クエリグラフ６２１を、ウィンドウ演算６０１および６０４に再現したデータに対して、ストリーム化演算６０７まで処理することで、グラフ上に存在するオペレータ６０６の１０：００直前における実行状態を、一時保持領域６１３に再現する。また、部分クエリグラフ６２２を、ウィンドウ演算６０８および６０４に再現したデータに対して、ストリーム化演算６１１および６１２まで処理することで、グラフ上に存在するオペレータ６０９の１０：００直前における実行状態を、一時保持領域６１４に再現する。
【００５０】
以上の処理によって、待機系のクエリ実行ワークエリア６２０に、１０：００直前における現用系のクエリ実行ワークエリア４２０の実行状態を再現した後で、複製して保持していた再現時刻以降のデータ６４１〜６４７の処理の実行を開始する。これにて、二重化構成への復帰が完了する。
【００５１】
次に、図７を用いて、本実施例の時間ウィンドウにおける実行状態の再現方法を示す。破線四角７００は、１０：００直前における時間ウィンドウ４０４の実行状態を表す。この時点で、状態変化記録領域６５２は空である。破線四角７０１は１０：０１の状態である。この時、９：５６以前のデータ５１１〜５１４がウィンドウ演算４０４から消滅し、状態変化記録領域６５２に記録されている。また、ウィンドウ演算４０４には１０：０１のデータ６３６が追加されている。状態変化記録領域６５２上のデータと、ウィンドウ演算４０４に保持しているデータ５１５、５１６、５１７、６３６のうち、再現時刻１０：００以降のデータ６３６を除いたデータ５１５〜５１７をコピーすることで、１０：００直前におけるウィンドウ演算４０４の実行状態と同一の実行状態を、ウィンドウ演算６０４に再現する。
【００５２】
個数ウィンドウにおける実行状態の再現方法も、時間ウィンドウにおける方法と同様である。図８を用いて、本実施例のグループ別個数ウィンドウにおける実行状態の再現方法を示す。
【００５３】
図８において、破線四角８００は、１０：００直前におけるグループ別個数ウィンドウ４０１の実行状態を表す。この時点で、状態変化記録領域６５１は空である。破線四角８０１は１０：０１の状態である。この時点までに、ウィンドウ演算４０１には、カラムｉｄがｂの二つのデータ６３１および６３３が追加されているため、上限である２個を超えて消滅したデータ５０２および５０３が、状態変化記録領域６５１に記録されている。また、カラムｉｄがｃのデータ６３４が追加されているため、消滅したデータ５０４が追加されている。その他、カラムｉｄがｄのデータ６３２が追加されている。破線四角８０２は、１０：０２の状態である。この時までに、カラムｉｄがｂのデータ６３５が追加されているため、データ６３１が消滅するが、再現時刻１０：００以降のデータであるため、状態変化記録領域には記録しない。
【００５４】
状態変化記録領域６５１上のデータと、ウィンドウ演算４０１に保持しているデータのうち、再現時刻１０：００以降のデータを除いたデータをコピーすることで、１０：００直前におけるウィンドウ演算４０１の実行状態と同一の実行状態を、ウィンドウ演算６０１に再現する。
【００５５】
次に、図９を用いて、本実施例の永続ウィンドウにおける実行状態の再現方法を示す。破線四角９００は、１０：００直前における永続ウィンドウ４０８の実行状態を表す。この時点で、状態変化記録領域６５３は空である。破線四角９０１は１０：０３の状態である。この時までに、ウィンドウ演算４０８には、データ９１１〜９１８が追加されている。また状態変化記録領域は空のままである。実際、永続ウィンドウにおいては、状態変化記録領域は不要である。ウィンドウ演算４０８に保持しているデータのうち、再現時刻１０：００以降のデータを除いたデータをコピーすることで、１０：００直前におけるウィンドウ演算４０８の実行状態と同一の実行状態を、ウィンドウ演算６０８に再現する。
【００５６】
以上、図７〜９を用いて、本実施例のウィンドウ演算の種別毎に、再現時刻における実行状態の再現方法を示した。但し、ウィンドウ演算に保持されているデータが大量の場合には、一度にデータをコピーすると、静止化と同様の処理停止が発生してしまう。これを避けるために、一つのウィンドウ演算についてのコピーも、さらに細分化してコピーする必要がある。
【００５７】
そこで、本実施例の変形例として、一つのウィンドウ演算についてのコピーも、さらに細分化してコピーする方法を以下に説明する。なお、永続ウィンドウについては自明であるため割愛し、時間ウィンドウと個数ウィンドウの場合を説明する。
【００５８】
まず、図１０を用いて、時間ウィンドウにおける、細分化した実行状態の再現方法を示す。破線四角１０００は、１０：００丁度における時間ウィンドウ４０４の実行状態を表す。状態変化記録領域６５２には、９：５５のデータ５１１、５１２、５１３が記録されている。この時点で、二個のデータ５１１と５１２のみをウィンドウ演算６０４にコピーする。次に、破線四角１００１は１０：０１の状態を表す。この時点で、三個のデータ５１３、５１４、５１５のみをウィンドウ演算６０４にコピーする。データ５１３、５１４をコピーすることで、状態変化記録領域６５２は空になるため、残り一個はウィンドウ演算４０４上のデータをコピーする。次に、破線四角１００２は１０：０３の状態を表す。この時点までに９：５７のデータ５１５は消滅しているが、既にコピー済であるため状態変化記録領域６５２には記録しない。この時点で、状態変化記録領域６５２に記録されているデータ５１６、およびウィンドウ演算４０４上のデータ５１７をコピーするが、残りのデータ６３６および６３７は再現時刻１０：００以降のデータであるためコピーしない。これにて再現が完了する。
【００５９】
個数ウィンドウにおける、細分化した実行状態の再現方法も、時間ウィンドウにおける方法と同様である。
【００６０】
次に、図１１を用いて、グループ別個数ウィンドウにおける、細分化した実行状態の再現方法を示す。グループ別個数ウィンドウでは、グループ順に細分化してコピーを進める。同図において、破線四角１１００は、１０：００丁度におけるウィンドウ演算４０１の実行状態を表す。状態変化記録領域６５１には、データ５０２が記録されている。この時点で、カラムｉｄがａのグループに属するデータ５０１と、カラムｉｄがｂのグループに属するデータ５０２、５０３をコピーする。カラムｉｄがａのグループについては、データ５０１をコピーすることで全データコピー済となるため、コピーが完了する。カラムｉｄがｂのグループについては、状態変化記録領域６５１のデータ５０２およびウィンドウ演算４０１のデータ５０３をコピーすると、残りのデータ６３１が再現時刻１０：００以降のデータであるため、コピーが完了する。コピーしたデータ５０２は、状態変化記録領域６５１から削除する。
【００６１】
破線四角１１０１は、１０：０１におけるウィンドウ演算４０１の実行状態を表す。状態変化記録領域６５１には、データ５０４が記録されている。この時点までに９：５７のデータ５０３は消滅しているが、既にコピー済であるため状態変化記録領域６５１には記録しない。この時点で、カラムｉｄがｃのグループについて、データ５０４、５０５をコピーし、残りのデータ６３４が再現時刻１０：００以降のデータであるため、コピーが完了する。破線四角１１０２は、１０：０２におけるウィンドウ演算４０１の実行状態を表す。状態変化記録領域６５１は空である。この時点までに１０：００のデータ６３１は消滅しているが、再現時刻以降のデータであるため状態変化記録領域６５１には記録しない。この時点で、カラムｉｄがｄのグループについて、データ５０６をコピーし、残りのデータ６３２が再現時刻１０：００以降のデータであるため、コピーが完了する。
【００６２】
次に、図１２において、本実施例のストリームデータ処理システムを実現するソフトウェアの機能ブロック構成図の一例を示す。現用系ストリームデータ処理システム２０６、および待機系ストリームデータ処理システム２１６に分けて示す。現用系サーバに障害が発生した場合には、待機系サーバが現用系サーバに切り替わるため、両サーバで実行するストリームデータ処理システムは同一となる。但し、ここでは説明を容易化するために、それぞれ異なる構造を持つシステムとして記載している。実際に図２の計算機２００および２１０で動作させるストリームデータ処理システムは、２０６と２１６の両方の機能を併せ持ったシステムであることは自明である。
【００６３】
また、図１２に示す機能ブロック構成図において、太線で示されたブロックはソフトウェア機能ブロックを示し、細線で示されたブロックは、記憶部を構成するメモリ２０２、２１２上に形成される記憶領域を示している。例えば、太線で示されたクエリ実行部１２０２、１２５２は、それぞれ計算機２００、２１０の処理部であるＣＰＵ２０１、２１１で実行されるプログラムを示している。
【００６４】
一方、細線で示されるクエリ実行ワークエリア４２０、６２０やコピー対象オペレータリスト記憶領域１２０９、１２５９、更にコピーバッファ領域１２０８、１２５６等は、ＣＰＵ２０１、２１１におけるプログラムの実行により、それぞれメモリ２０２、２１２上に形成される記憶領域を示している。クエリ実行ワークエリア４２０、６２０はそれぞれ図示の通りの保持領域を形成する。なお、特に断らないが、図１３などの他の図面においても同様であり、太線、細線のブロックは、それぞれ機能プログラムとメモリ上の記憶領域を示している点、留意されたい。
【００６５】
さて、図１２において、ストリームデータ処理システム２０６および２１６は、それぞれ、入力データを受信する入力データ受信部１２０５および１２５５、クエリグラフとオペレータの実行状態を保持するクエリ実行ワークエリア４２０および６２０、クエリ実行ワークエリアのデータに基づいてクエリを実行するクエリ実行部１２０２および１２５２、クエリ実行時刻を計時するシステム時計１２０４および１２５４、クエリ実行結果を出力する出力データ送信部１２０８および１２５８を備える。クエリ実行ワークエリア４２０および６２０には、それぞれ、オペレータ毎の実行状態を保持するオペレータ実行状態保持領域１２２１〜１２２３および１２７１〜１２７３を確保する。現用系のクエリ実行ワークエリア４２０には、各実行状態保持領域１２２１〜１２２３に対して、オペレータ状態変化記録領域１２２４〜１２２６も確保する。
【００６６】
現用系のストリームデータ処理システム２０６は、クエリ１０６を解析してクエリ実行ワークエリア上にクエリグラフを生成するクエリ解析部１２１０を備える。クエリ解析部１２１０は、クエリグラフ上のオペレータ群において、待機系追加時に実行状態をコピーするオペレータを選定する、コピー対象オペレータ選定部１２１１を含む。コピー対象オペレータ選定部１２１１で選定したオペレータ群は、コピー対象オペレータリスト記憶領域１２０９に記憶する。
【００６７】
さらに、待機系ストリームデータ処理システム２１６から待機系追加通知を受信する、待機系追加通知受信部１２０１、待機系追加時点のシステム時計１２０４における時刻を再現時刻として保存する、再現時刻記憶領域１２３１、クエリ実行ワークエリア４２０上に確保したオペレータ実行状態保持領域１２２１〜１２２３、およびオペレータ状態変化記録領域１２２４〜１２２６に保存されているデータから、コピー対象オペレータの再現時刻における実行状態を再現して、コピーバッファ領域１２０６に書き出す、ワークエリア実行状態書出し部１２０３、および、コピーバッファ領域１２０６上のデータを待機系のストリームデータ処理システム２１６に送信する、ワークエリアデータ送信部１２０７を備えている。
【００６８】
一方、待機系のストリームデータ処理システム２１６は、現用系のストリームデータ処理システム２０６に待機系追加通知を送信する、待機系追加通知送信部１２５１、現用系のストリームデータ処理システム２０６が備えるワークエリアデータ送信部１２０７からデータを受信してコピーバッファ１２５６に書き出す、ワークエリアデータ受信部１２５７、コピーバッファ１２５６のデータを、クエリ実行ワークエリア６２０上に確保したオペレータ実行状態１２７１〜１２７３に移動して、ウィンドウ演算からストリーム化演算までの部分クエリグラフの処理を実行する、追付き処理部１２５３を備える。
【００６９】
待機系のストリームデータ処理システム２１６は、現用系のストリームデータ処理システム２０６が備える待機系追加通知受信部１２０１から、待機系追加通知の返信として、クエリグラフの情報およびコピー対象リスト記憶領域１２０９に保持されているコピー対象オペレータ群の情報を受信し、前者の情報からクエリ実行ワークエリア６２０上にクエリグラフを生成し、後者の情報をコピー対象オペレータリスト記憶領域１２５９に記憶する。
【００７０】
さらに、現用系のストリームデータ処理システム２０６は、再現時刻以降のデータを複製して、待機系のストリームデータ処理システム２１６に送信する、複製データ送信部１２３２、および、現用系のストリームデータ処理システム２０６と待機系のストリームデータ処理システム２１６の出力結果を元にして、障害発生時にもデータの一貫性を保証しつつアプリケーションにデータを送信する、出力整合性保証部１２３３を備える。但し、複製データ送信部１２３２および出力整合性保証部１２３３は、現用系のストリームデータ処理システム２０６の外側で動作する構成も可能である。
【００７１】
次に、図１３において、上述した図１２の各ソフトウェアブロック間の実行シーケンスを示す。まず１３００は、システム時計１２０４と入力データ受信部１２０５の関係を示す。ストリームデータ処理システム２０６が入力データに対してタイムスタンプを付与する場合においては、システム時計１２０４は計算機が持つ時計であり、入力データ受信部１２０５は各入力データの受信時におけるシステム時計１２０４の時刻をタイムスタンプとする。一方、入力データにタイムスタンプが付与されており、ストリームデータ処理システム２０６が該時刻に基づいてデータ処理を実行する場合は、入力データ受信部１２０５が各入力データの受信時に、入力データに付与されていたタイムスタンプをシステム時計１２０４にセットする。なお、これまでの説明において用いた、データのタイムスタンプ、再現時刻、コピー時点の時刻などの、時刻に関する用語は、全てシステム時計１２０４の時刻を基準としている。
【００７２】
待機系追加時には、待機系追加通知送信部１２５１が、待機系追加通知受信部１２０１の処理１３０１を起動する。処理１３０１は、入力データ受信部１２０５の処理１３０２を起動する。処理１３０２は、未だクエリ実行部１２０２に投入していない先頭データのタイムスタンプを、再現時刻記憶領域１２３１に設定する処理１３０３を起動する。また、前記先頭データ以降のデータを複製して複製データ送信部１２３２に渡す処理を開始する。処理１３０１は、処理１３０２完了後、ワークエリアデータ送信部１２０７の処理１３０４を起動し、複製データ送信部１２３２の処理１３０５を起動し、クエリ実行部１２５２の処理１３１５を起動する。処理１３０５は、入力データ送信部１２０５の処理１３０７によって複製データを受取り、入力データ受信部１２５５に送信するループ１３０６を実行する。
【００７３】
クエリ実行部１２０２は、クエリの実行を無限ループ１３０８で繰り返している。前記ループ１３０８を実行中に再現時刻記憶領域１２３１を確認する処理１３０９を実行し、再現時刻が設定されていた場合は、実行状態を待機系にコピーする動作に移行する。この動作においては、入力データ受信部１２０５からデータを受取る処理１３１１、受取ったデータを処理することが可能なオペレータを実行する処理、および、オペレータの実行状態をコピーバッファ領域１２０６に書き出す処理１３１２を繰り返す、ループ１３１０を実行する。
【００７４】
ワークエリアデータ送信部１２０７の処理１３０４は、コピーバッファ領域１２０６からデータを受取る処理１３１４、および受取ったデータをワークエリアデータ受信部１２５７に非同期に送信する処理１３１８を繰り返す、ループ１３１３を実行する。処理１３１８は、受信したデータをコピーバッファ領域１２５６に保存する。
【００７５】
待機系２１６のクエリ実行部１２５２の処理１３１５は、追付き処理部１２５３の処理１３１６を起動する。処理１３１６は、コピーバッファ１２５６に保存されたデータを読み込む処理１３１９を、全てのコピー対象オペレータの実行状態を受信完了するまで繰り返すループ１３１７を実行する。ループ１３１７の実行から抜けると、システム時計１２５４に再現時刻を設定する処理１３２０を実行し、クエリ実行処理１２５２に戻る。これにて、本実施例のシステムにおける二重化構成への復帰が完了する。
【００７６】
次に、図１４、図１５、図１６において、本実施例のシステムにおける処理フローの一例を示す。
【００７７】
まず、図１４は、待機系追加通知受信部１２０１における処理１３０１のフローである。処理１４００は、入力データ受信部１２０５において、未だクエリ実行部１２０２に投入していないデータの先頭から複製を開始する。処理１４０１は、複製を開始した前記先頭データのタイムスタンプを、再現時刻として設定する。処理１４０２は、ワークエリアデータ送信部１２０７を起動する。処理１４０３は、複製データ送信部１２３２を起動する。処理１４０４は、待機系ストリームデータ処理システム２１６に、クエリグラフの情報、コピー対象オペレータの情報、および再現時刻の情報を送信して、クエリ実行部１２５２を起動する。
【００７８】
次に、図１５は、クエリ実行部１２０２における、クエリ実行ループの処理フローである。処理１５００は、コピー対象オペレータ通番を、コピー対象オペレータリストのサイズに初期設定する。初期設定後、ループ１５０１から１５１５までを無限ループで繰り返す。処理１５０２は、再現時刻が再現時刻記憶領域１２３１に記憶されているか否かを判定する。再現時刻が設定されている場合は、処理１５０３にて、コピー対象オペレータの通番を０にセットする。これにより、以降の処理においてオペレータ実行状態のコピー処理が実行されることになる。また、処理１５０２にて再度、真と判定されないように再現時刻の設定をクリアする。
【００７９】
処理１５０４にて、入力データ受信部１２０５からデータを読み込んだ後、ループ１５０５から１５０９までを、クエリグラフ上に実行可能なオペレータが存在する限り実行する。処理１５０６において、コピー対象オペレータ通番の値に基づいてオペレータ実行状態のコピー中と判定され、かつ当該オペレータがコピー対象オペレータである場合には、処理１５０８を実行し、それ以外の場合には、通常処理１５０７を実行する。処理１５０８では、通常処理に加えて実行状態の変化を記録する。処理１５０８の詳細は図２４を用いて後述する。
【００８０】
ループ１５０５から１５０９を抜けた後、処理１５１０において、コピー対象オペレータ通番の値に基づいてオペレータ実行状態のコピー中と判定された場合は、処理１５１１〜１５１４で構成される、実行状態のコピー処理を実行する。処理１５１１は、コピー対象オペレータリストにおいて、コピーオペレータ通番目の、コピー対象オペレータの実行状態を、コピーバッファ領域１２０６に書き出す。処理１５１１の詳細は図２５および図２６を用いて後述する。
【００８１】
処理１５１１において、前記コピー対象オペレータのコピーが完了したと判定された場合は、処理１５１３にてコピー終了タグをコピーバッファ領域１２０６に書出し、処理１５１４にてコピー対象オペレータ通番をインクリメントすることで、コピー対象オペレータを次のオペレータに移す。このとき、全てのコピー対象オペレータについてコピーが完了したならば、コピー通番がコピー対象オペレータリストのサイズになるので、オペレータ実行状態のコピーが停止する。
【００８２】
次に、図１６は、追付き処理部１２５３における処理１３１６のフローである。処理１６００は、コピー対象オペレータ通番を０に設定する初期化処理である。ループ１６０１から１６０７の処理を、全てのコピー対象オペレータについて処理が完了するまで実行する。コピー対象オペレータリストにおいて、コピーオペレータ通番目の、コピー対象オペレータについて、ループ１６０２から１６０５の処理を、コピー終了タグをコピーバッファ領域１２５６から読み取るまで実行する。処理１６０３にて、コピーバッファ領域１２５６からデータを読み取り、処理１６０４にて、前記コピー対象オペレータの実行状態保持領域に、読み取ったデータを追加する。ループ１６０２から１６０５を抜けたら、処理１６０６にてコピー対象オペレータ通番をインクリメントすることで、コピー対象オペレータを次のオペレータに移す。
【００８３】
ループ１６０１から１６０７を抜けたら、処理１６０８にてウィンドウ演算からストリーム化演算に至る部分クエリグラフを実行し、処理１６０９にて再現時刻をシステム時計１２５４に設定して、処理１３１６を終了する。処理１６０８は、全てのコピー対象オペレータにおけるコピーの完了を待たずに、部分クエリ毎にウィンドウ演算のデータが揃った段階で処理を開始し、パイプライン的に並列実行するパイプライン並列実行による方法でも構わない。
【００８４】
次に、図１７を用いて、実行状態を保持する、ウィンドウ演算以外のオペレータについても実行時刻を再現する方法を説明する。状態変化記録領域１７０１および１７０２は、それぞれ一時保持領域４１３および４１４の状態変化を記録する。コピー時点の１０：０２において、一時保持領域４１３と状態変化記録領域１７０１から、再現時刻１０：００における一時保持領域４１３のデータを再現して、一時保持領域６１３にコピーする。また、コピー時点の１０：０３において、一時保持領域４１４と状態変化記録領域１７０２から、再現時刻１０：００における一時保持領域４１４のデータを再現して、一時保持領域６１４にコピーする。
【００８５】
この方法においては、処理１６０８における部分クエリグラフの実行を必要としない。ウィンドウ演算で保持されるデータ数に比べて、結合オペレータで処理するデータ数が、前段のフィルタオペレータなどで大幅に削減されるような場合、あるいは集約オペレータで入力データ数に対して集約後のグループ数が大幅に削減されるような場合には、ウィンドウ演算のデータを処理することで実行状態を回復するよりも、このように実行状態を直接コピーする方が効率的である。
【００８６】
結合オペレータおよび集約オペレータにおける実行状態の再現方法を次に示す。
【００８７】
まず、図１８を用いて、結合オペレータにおける実行状態の再現方法を示す。破線四角１８００は、１０：００直前における結合オペレータ４０６の一時保持領域４１３を表す。この時点で、状態変化記録領域１７０１は空である。破線四角１８０１は１０：０２の状態である。この時点までに、一時保持領域４１３において、データ６３１、６３３、６３４、６３５、６３６が追加され、データ５０２、５０３、５０４、５１２、５１３、５１４、６３１が消滅する。再現時刻１０：００以降のデータである６３１以外の、消滅したデータは、状態変化記録領域１７０１に記録している。
【００８８】
状態変化記録領域１０７１上のデータと、一時保持領域４１３に保持しているデータのうち、再現時刻１０：００以降のデータを除いたデータをコピーすることで、１０：００直前における一時保持領域４１３と同一の状態を、一時保持領域６１３に再現する。
【００８９】
次に、図１９を用いて、集約オペレータにおける実行状態の再現方法を示す。破線四角１９００は、１０：００直前における集約オペレータ４０９の一時保持領域４１４を表す。この時点で、状態変化記録領域１７０２は空である。破線四角１９０１は１０：０１の状態である。この時点までに、カラムｉｄがｂのグループについては、集約結果がデータ１９１２、１９１４、１９１５の順に更新され、カラムｉｄがｃのグループについては、集約結果がデータ１９１３から１９１６に更新される。ここで、再現時刻１０：００より前の更新データ１９１２および１９１３は、状態変化記録領域１７０２に記録するが、再現時刻以降の更新データである１９１４は記録しない。破線四角１９０２は１０：０２の状態である。この時点までに、カラムｉｄがａのグループについては、集約結果がデータ１９１１から１９１８に更新され、カラムｉｄがｂのグループについては、集約結果がデータ１９１５から１９１７に更新される。ここで、再現時刻１０：００より前の更新データ１９１１は、状態変化記録領域１７０２に記録するが、再現時刻以降の更新データである１９１５は記録しない。
【００９０】
状態変化記録領域１０７２上のデータと、一時保持領域４１４に保持しているデータのうち、再現時刻１０：００以降のデータを除いたデータ（この例においては、そのようなデータは存在しない）をコピーすることで、１０：００直前における一時保持領域４１４と同一の状態を、一時保持領域６１４に再現する。
【００９１】
以上、図１８、および図１９を用いて、実行状態を一時保持領域に保持するオペレータである、結合オペレータおよび集約オペレータについて、再現時刻における一時保持領域の再現方法を示した。但し、一時保持領域に保持されているデータが大量の場合には、一度にデータをコピーすると、静止化と同様の処理停止が発生してしまう。これを避けるために、一つの一時保持領域についてのコピーも、さらに細分化してコピーする必要がある。この細分化コピーの方法を以下に示す。
【００９２】
まず、図２０Ａ、図２０Ｂを用いて、結合オペレータにおける、細分化した一時保持領域の再現方法を示す。結合オペレータでは、索引付けによって分類したグループ順に細分化してコピーを進める。図２０Ａの破線四角２０００は、１０：００丁度における一時保持領域４１３の状態を表す。状態変化記録領域１７０１には、データ５０２、５１２、５１３が記録されている。この時点で、二個のデータのみをコピーする。ここでは、グループ順に、左入力におけるカラムｉｄがａのグループに属するデータ５０１と、カラムｉｄがｂのグループに属するデータ５０２の二個をコピーすることになる。カラムｉｄがａのグループについては、データ５０１をコピーすることで全データコピー済となるため、コピーが完了する。カラムｉｄがｂのグループについては、状態変化記録領域１７０１のデータ５０２をコピーして、中断する。データ５０２は状態変化記録領域１７０１から削除する。
【００９３】
図２０Ａの破線四角２００１は、１０：０１における一時保持領域４１３の状態を表す。状態変化記録領域１７０１には、データ５０３、５０４、５１４が追加されている。この時点で、さらに二個のデータのみをコピーする。ここでは、前回のコピーで中断された、左入力におけるカラムｉｄがｂのグループから再開する。カラムｉｄがｂのグループについては、状態変化記録領域１７０１のデータ５０３をコピーし、一時保持領域４１３のデータ６３１および６３３が再現時刻１０：００以降のデータであるため、コピーが完了する。カラムｉｄがｃのグループについては、状態変化記録領域１７０１のデータ５０４をコピーして、中断する。
【００９４】
図２０Ｂの破線四角２００２は、１０：０２における一時保持領域４１３の状態を表す。この時点までに、データ６３１が消滅しているが、再現時刻以降のデータであるため、状態変化記録領域１７０１には記録しない。この時点で、さらに４個のデータのみをコピーする。ここでは、前回のコピーで中断された、左入力におけるカラムｉｄがｃのグループから再開する。カラムｉｄがｃのグループについては、状態変化記録領域１７０１のデータ５０４をコピーし、一時保持領域４１３のデータ６３４が再現時刻１０：００以降のデータであるため、コピーが完了する。右入力におけるカラムｉｄがａのグループについては、状態変化記録領域１７０１のデータ５１２および５１４をコピーし、一時保持領域４１３にデータが存在しないため、コピーが完了する。カラムｉｄがｂのグループについては、状態変化記録領域１７０１にデータが存在しないため、一時保持領域４１３のデータ５１６をコピーし、残りのデータ６３６が再現時刻１０：００以降のデータであるため、コピーが完了する。
【００９５】
図２０Ｂの破線四角２００３は、１０：０３における一時保持領域４１３の状態を表す。この時点までに、データ５１６が消滅しているが、コピー済のデータであるため、状態変化記録領域１７０１には記録しない。この時点で、さらに２個のデータをコピーする。ここでは、右入力におけるカラムｉｄがｃのグループから再開する。カラムｉｄがｃのグループについては、状態変化記録領域１７０１のデータ５１３および一時保持領域４１３のデータ５１７をコピーすることで、全データコピー済となるため、コピーが完了する。
【００９６】
次に、図２１を用いて、集約オペレータにおける、細分化した一時保持領域の再現方法を示す。集約オペレータでは、集約単位のグループ順に細分化してコピーを進める。破線四角２１００は、１０：０１における一時保持領域４１４の状態を表す。この時点までに、カラムｉｄがｂのグループについては、集約結果がデータ１９１２、１９１４、１９１５の順に更新され、カラムｉｄがｃのグループについては、集約結果がデータ１９１３から１９１６に更新される。ここで、再現時刻１０：００より前の更新データ１９１２および１９１３は、状態変化記録領域１７０２に記録するが、再現時刻以降の更新データである１９１４は記録しない。この時点で、カラムｉｄがａのグループをコピーする。状態変化記録領域１７０２にはカラムｉｄがａのデータは存在せず、一時保持領域４１４上のデータ１９１１をコピーすることで全データコピー済となるため、コピーが完了する。
【００９７】
破線四角２１０１は、１０：０２における一時保持領域４１４の状態を表す。この時点までに、カラムｉｄがｂのグループについては、集約結果がデータ１９１５から１９１７に更新される。更新されたデータ１９１５は再現時刻以降のデータであるため、状態変化記録領域１７０２に記録しない。この時点で、カラムｉｄがｂのグループについては、状態変化記録領域１７０２のデータ１９１２をコピーし、一時保持領域４１４上のデータ１９１７が再現時刻以降のデータであるため、コピーが完了する。
【００９８】
破線四角２１０２は、１０：０３における一時保持領域４１４の状態を表す。この時点までに、カラムｉｄがａのグループについては、集約結果がデータ１９１１から１９１８に更新される。更新されたデータ１９１１はコピー済であるため、状態変化記録領域１７０２に記録しない。この時点で、カラムｉｄがｃのグループについては、状態変化記録領域１７０２のデータ１９１３をコピーし、一時保持領域４１４上のデータ１９１６が再現時刻以降のデータであるため、コピーが完了する。
【００９９】
次に、図２２、２３を用い、本実施例の変形例として、永続ウィンドウにおける実行状態の再現を効率化する方法について説明する。
【０１００】
まず、図２２を用いて、永続ウィンドウの後段に集約オペレータが位置するケースの効率化方法を示す。
【０１０１】
集約オペレータは、個々の入力データではなく、全データの集約結果であるデータを保持するオペレータである。ここで、永続ウィンドウに保持された入力データは決して消滅することがないため、ウィンドウにデータが追加されない限り、集約結果が変化することはない。また、データが追加された場合も、それ以前から存在していたデータが消滅することはないため、個々のデータではなく、その集約結果さえ保持していれば、変化後の集約結果を算出することが可能である。
【０１０２】
以上に基づき、永続ウィンドウを入力とする、実行状態を保持するオペレータが集約オペレータのみの場合は、当該集約オペレータの実行状態のみを再現し、永続ウィンドウの状態を再現しないことで、効率化を図る。
【０１０３】
図２２の例で、ウィンドウ演算４０８は永続ウィンドウである。永続ウィンドウ４０８を入力とする部分クエリグラフ６２２において、一時保持領域を持つオペレータは集約オペレータ４０９のみである。従って、永続ウィンドウ４０８の実行状態は再現せず、集約オペレータ４０９の実行状態を再現することで、実行状態の再現を効率化する。
【０１０４】
次に、図２３を用いて、永続ウィンドウで保持するデータが、マスタ表のような固定データであるケースの効率化方法を示す。
【０１０５】
銘柄コードと銘柄名の対応表のようなマスタ表は、変化が発生しない固定的なデータ集合と捉えることができる。このようなデータは、データベースなどから永続ウィンドウにロードして参照するのが一般的な利用形態である。変化しないデータであれば、現用系の実行状態から再現するのではなく、元のデータを格納していたデータベース等から直接ロードすることでも等価と見做せる。
【０１０６】
以上に基づき、変化しないマスタ表を保持する永続ウィンドウの実行状態は、データベース等からロードして再現することで、効率化を図る。
【０１０７】
図２３の例で、ウィンドウ演算２３０４および２３０６は永続ウィンドウである。永続ウィンドウ２３０４には、データベース２３００に格納されているマスタ表２３０１を、データ２３１１〜２３１５に変換してロードしている。待機系追加時において、永続ウィンドウ２３０６には、マスタ表２３０１をデータ２３２１〜２３２５に変換してロードすることで、実行状態の再現を効率化する。なお、データ２３２１〜２３２５のタイムスタンプは、再現時刻より前の任意の時刻で構わない。
【０１０８】
次に、図２４を用いて、図１５の処理１５０８を実現する処理フローの一例を示す。図２４は、通常処理において、オペレータの実行状態から消滅するデータが発生した場合に、当該データを状態変化記録領域に記録するか否かを判定するフローである。処理２４０１にてコピー済のデータであるか否かを判定し、処理２４０２にて再現時刻以降のデータか否かを判定する。両処理において共に偽と判定されるデータは、待機系にコピーする必要があるので、状態変化記録領域に記録する。
【０１０９】
次に、図２５および図２６を用いて、図１５の処理１５１１を実現する処理フローの一例を示す。図２５は、時間ウィンドウあるいは個数ウィンドウにおけるフローである。図２６は、グループ別個数ウィンドウ、結合オペレータ、あるいは集約オペレータにおけるフローである。
【０１１０】
時間ウィンドウあるいは個数ウィンドウにおいては、図２５のループ２５０１から２５０７を、一度にコピーする回数だけ実行する。まず、処理２５０２にて状態変化記録領域にデータが存在すると判定された場合は、処理２５０３にて、その先頭のデータをコピーバッファ領域１２０６に移動する。このとき、当該データは状態変化記録領域から削除する。処理２５０２にて偽と判定された場合は、処理２５０４にてウィンドウにデータが存在するか否かを判定し、真と判定される場合は、処理２５０５にて再現時刻より前のタイムスタンプを持つデータが全てコピー済であるか否かを判定し、偽である場合は、未だコピーしていないデータをコピーバッファ領域１２０６にコピーする。ウィンドウが空であるか、再現時刻より前のタイムスタンプを持つデータが全てコピー済である場合は、コピーする必要があるデータがそれ以上存在しないことになるので、ループ２５０１から２５０７をブレークし、処理２５０８にて、当該オペレータについてのコピー完了を決定する。
【０１１１】
グループ別個数ウィンドウ、結合オペレータ、あるいは集約オペレータにおいては、図２６のループ２６０１から２６０９までを、一度にコピーする回数だけ実行する。角丸四角の破線で囲まれた処理２６００は、コピー対象のデータキーについて処理する。コピー対象データキーの初期値は、例えば、図１５の処理１５０３、あるいは処理１５１４にて、コピー対象オペレータを指定する際に設定することができる。
【０１１２】
まず、処理２６０２にて状態変化記録領域に、対象データキーのデータが存在すると判定された場合は、処理２６０３にて、その先頭のデータをコピーバッファ領域１２０６に移動する。このとき、当該データは状態変化記録領域から削除する。処理２６０２にて偽と判定された場合は、処理２６０４にてウィンドウに対象データキーのデータが存在するか否かを判定し、真と判定される場合は、処理２６０５にて、対象データキーのデータに関して、再現時刻より前のタイムスタンプを持つデータが全てコピー済であるか否かを判定し、偽である場合は、未だコピーしていないデータをコピーバッファ領域１２０６にコピーする。対象データキーに関して、ウィンドウにデータが存在しないか、再現時刻より前のタイムスタンプを持つデータが全てコピー済である場合は、コピー必要なデータがそれ以上存在しないことになり、処理２６０７に移行する。
【０１１３】
処理２６０７にて、まだ処理を終了していないデータキーが存在すると判定された場合は、処理２６０８にて対象データキーを変更して、ループ２６０１から２６０９を継続する。全てのデータキーについて処理を終了していると判定された場合は、ループ２６０１から２６０９をブレークし、処理２６１０にて、当該オペレータについてのコピー完了を決定する。
【０１１４】
なお、結合オペレータと集約オペレータに関しては、処理２６０４および２６０５における用語「ウィンドウ」を「一時保持領域」に置き換えた説明となる。
【符号の説明】
【０１１５】
１００…ストリーム処理サーバ
１０１、１０２、１０３、２００、２１０…計算機
１０４…ネットワーク
２０１、２１１…ＣＰＵ
２０２、２１２…メモリ
２０３、２１３…ストレージ装置
２０４、２１４…ネットワークＩ／Ｆ
２０５、２１５…計算機内部バス
２０６、２１６…ストリームデータ処理システム
４００〜４１２、６００〜６１２…オペレータ
４１３、４１４、６１３、６１４…一時保持領域
６５１、６５２、６５３、１７０１、１７０２…状態変化記録領域
５０１〜５０６、５１１〜５１７、５２１〜５２８、５３１〜５３３、６３１〜６３７、６４１〜６４７、９１１〜９１８、１９１１〜１９１８…データ
１２０５、１２５５…入力データ受信部
１２０２、１２５２…クエリ実行部
１２０８、１２５８…出力データ送信部
１２０４、１２５４…システム時計
１２０１…待機系追加通知受信部
１２５１…待機系追加通知送信部
１２０７…ワークエリアデータ送信部
１２０８…ワークエリアデータ受信部
１２０３…ワークエリア実行状態書出し部
１２５３…追付き処理部。
【図１】
2011192013.tif 000003
【図２】
2011192013.tif 000004
【図３】
2011192013.tif 000005
【図４】
2011192013.tif 000006
【図５Ａ】
2011192013.tif 000007
【図５Ｂ】
2011192013.tif 000008
【図５Ｃ】
2011192013.tif 000009
【図５Ｄ】
2011192013.tif 000010
【図５Ｅ】
2011192013.tif 000011
【図６】
2011192013.tif 000012
【図７】
2011192013.tif 000013
【図８】
2011192013.tif 000014
【図９】
2011192013.tif 000015
【図１０】
2011192013.tif 000016
【図１１】
2011192013.tif 000017
【図１２】
2011192013.tif 000018
【図１３】
2011192013.tif 000019
【図１４】
2011192013.tif 000020
【図１５】
2011192013.tif 000021
【図１６】
2011192013.tif 000022
【図１７】
2011192013.tif 000023
【図１８】
2011192013.tif 000024
【図１９】
2011192013.tif 000025
【図２０Ａ】
2011192013.tif 000026
【図２０Ｂ】
2011192013.tif 000027
【図２１】
2011192013.tif 000028
【図２２】
2011192013.tif 000029
【図２３】
2011192013.tif 000030
【図２４】
2011192013.tif 000031
【図２５】
2011192013.tif 000032
【図２６】
2011192013.tif 000033