(57)【要約】  コンピューティングシステム（１００）が、データユニットの少なくとも１つのストリームをそれぞれが処理するデータ処理プログラムを実行するノード（１５２）を含む。データストレージシステム（１５６、１５７）が、プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する。第１のデータ処理プログラムを使用して少なくとも１つのストリームを処理することが、連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、第１のデータ処理プログラム内の処理を再開することとを含む。
2019505916.tif 000002
【特許請求の範囲】
【請求項１】
１又は２以上のノードを含むコンピューティングシステムであって、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するように構成された、前記コンピューティングシステムと、
前記１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムであって、使用中、前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する、前記データストレージシステムとを含み、
前記１又は２以上のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、
データユニットの第１のストリームを処理して、データユニットの前記第１のストリーム内の連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、
データユニットの前記第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のデータ処理プログラム内の処理の終了を開始することと、
前記第１のデータ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更が恒久的に記憶された後、前記第１のデータ処理プログラム内の処理を再開することと、
前記変更が恒久的に記憶された後、連続データユニットの前記第１のサブセットに関して生じさせられた第１の出力を前記第１のデータ処理プログラムから解放することとを含む装置。
【請求項２】
複数のデータ処理プログラムが、それぞれ、データユニットの少なくとも１つのストリームを、プログラム状態情報が前記ストリーム内の３つ以上の隣接するデータユニットにわたって保持されないようにして処理する、請求項１に記載の装置。
【請求項３】
データストレージシステムが、不揮発性ストレージ媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、前記変更を前記不揮発性ストレージ媒体に記憶することを含む、請求項１又は２に記載の装置。
【請求項４】
データストレージシステムが、複数のノードに接続された通信媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、前記通信媒体を介して前記複数のノードの第１のノードから少なくとも第２のノードに前記変更を送信することを含む、請求項１〜３のいずれかに記載の装置。
【請求項５】
データストレージシステムが、複数のデータ処理プログラムのうちの少なくとも１つによって処理されるデータユニットの１又は２以上のストリームに関連するストリーム状態情報も記憶する、請求項１〜４のいずれかに記載の装置。
【請求項６】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、前記第１のデータ処理プログラム内の処理の終了が完了したと決定した後、データユニットの前記第１のストリームに関連するストリーム状態情報を恒久的に記憶することをさらに含む、請求項５に記載の装置。
【請求項７】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力を第１のデータ処理プログラムから解放することが、コンピューティングシステム上で実行される複数のデータ処理プログラムに含まれない外部プログラムに前記第１の出力を解放することを含む、請求項１〜６のいずれかに記載の装置。
【請求項８】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更が、連続データユニットの第２のサブセットを処理することによって引き起こされた前記共有データに対する恒久的に記憶された変更と区別される、請求項１〜７のいずれかに記載の装置。
【請求項９】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更が、連続データユニットの第２のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更が始まった後に恒久的に記憶され、連続データユニットの前記第１のサブセットが、データユニットの第１のストリーム内で連続データユニットの前記第２のサブセットの前にある、請求項８に記載の装置。
【請求項１０】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力が、連続データユニットの前記第１のサブセットを処理することによって引き起こされたすべての変更が恒久的に記憶された後、第１のデータ処理プログラムから解放される、請求項９に記載の装置。
【請求項１１】
変更の第１の部分が恒久的に記憶された後であるが、変更の第２の部分が恒久的に記憶される前に、第１のデータ処理プログラム内で処理が再開される、請求項１〜１０のいずれかに記載の装置。
【請求項１２】
第１のデータ処理プログラムが、データユニットの第１のストリームを処理することを周期的に終了し、コンピューティングシステムが、前記第１のデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める、請求項１〜１１のいずれかに記載の装置。
【請求項１３】
第１のデータ処理プログラム内の処理の終了を開始することが、連続データユニットの第１のサブセットと連続データユニットの第２のサブセットとの間にストリーム終了インジケータを挿入することを含み、前記第１のデータ処理プログラム内の処理の前記終了が、前記第１のデータ処理プログラムによって規定されたタスクを実施するすべてのプロセスが前記ストリーム終了インジケータに応答して正常に終了した後に完了している、請求項１〜１２のいずれかに記載の装置。
【請求項１４】
共有データが、複数のデータ処理プログラムのすべてによってアクセスされ得る、請求項１〜１３のいずれかに記載の装置。
【請求項１５】
１又は２以上のノードを含むコンピューティングシステムであって、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するように構成された、前記コンピューティングシステムと、
前記１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムであって、使用中、前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する、前記データストレージシステムとを含み、
前記複数のデータ処理プログラムのうちの複数のデータ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することが、
前記第１のグループ内の各データ処理プログラムに関して、連続データユニットの複数のサブセットを含むデータユニットのそれぞれのストリームを処理することと、
データユニットの前記それぞれのストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のグループ内の各データ処理プログラム内の処理の終了を開始することと、
前記第１のグループ内の各データ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更が恒久的に記憶された後、前記第１のグループ内の各データ処理プログラム内の処理を再開することとを含む装置。
【請求項１６】
複数のデータ処理プログラムが、それぞれ、データユニットの少なくとも１つのストリームを、プログラム状態情報が前記ストリーム内の３つ以上の隣接するデータユニットにわたって保持されないようにして処理する、請求項１５に記載の装置。
【請求項１７】
データストレージシステムが、不揮発性ストレージ媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、前記変更を前記不揮発性ストレージ媒体に記憶することを含む、請求項１５又は１６に記載の装置。
【請求項１８】
データストレージシステムが、複数のノードに接続された通信媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、前記通信媒体を介して前記複数のノードの第１のノードから少なくとも第２のノードに前記変更を送信することを含む、請求項１５〜１７のいずれかに記載の装置。
【請求項１９】
データストレージシステムが、複数のデータ処理プログラムのうちの少なくとも１つによって処理されるデータユニットの１又は２以上のストリームに関連するストリーム状態情報も記憶する、請求項１５〜１８のいずれかに記載の装置。
【請求項２０】
複数のデータ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することが、前記第１のグループ内の各データ処理プログラム内の処理の終了が完了したと決定した後、前記第１のグループ内の前記データ処理プログラムのいずれかによって処理されたデータユニットのそれぞれのストリームに関連するストリーム状態情報を恒久的に記憶することをさらに含む、請求項１９に記載の装置。
【請求項２１】
複数のデータ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することが、変更が恒久的に記憶された後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を複数のデータ処理プログラムの前記第１のグループから解放することをさらに含む、請求項１５〜２０のいずれかに記載の装置。
【請求項２２】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力を複数のデータ処理プログラムの第１のグループから解放することが、複数のデータ処理プログラムの前記第１のグループに含まれないコンピューティングシステム上で実行される前記複数のデータ処理プログラムのうちの１つに前記第１の出力を解放することを含む、請求項２１に記載の装置。
【請求項２３】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力を複数のデータ処理プログラムの第１のグループから解放することが、コンピューティングシステム上で実行される前記複数のデータ処理プログラムに含まれない外部プログラムに前記第１の出力を解放することを含む、請求項２１に記載の装置。
【請求項２４】
外部プログラムが、第１のグループ内の少なくとも１つのデータ処理プログラムによってアクセスされ得る特定の共有データにアクセスする要求を送信し、前記要求の結果が、前記要求が受け取られる前に行われた特定の共有データへのすべての変更が恒久的に記憶された後、前記外部プログラムに解放される、請求項２３に記載の装置。
【請求項２５】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更が、連続データユニットの第２のサブセットを処理することによって引き起こされた前記共有データに対する恒久的に記憶された変更と区別される、請求項１５〜２４のいずれかに記載の装置。
【請求項２６】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更が、連続データユニットの第２のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更が始まった後に恒久的に記憶され、連続データユニットの前記第１のサブセットが、データユニットの第１のストリーム内で連続データユニットの前記第２のサブセットの前にある、請求項２５に記載の装置。
【請求項２７】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力が、連続データユニットの前記第１のサブセットを処理することによって引き起こされたすべての変更が恒久的に記憶された後、複数のデータ処理プログラムの第１のグループから解放される、請求項２６に記載の装置。
【請求項２８】
データユニットの２又は３以上のストリームを処理することが、少なくとも、複数のデータ処理プログラムのうちの複数のデータ処理プログラムの第１のグループ及び複数のデータ処理プログラムの第２のグループを使用してデータユニットの４又は５以上のストリームを処理することを含む、請求項１５〜２７のいずれかに記載の装置。
【請求項２９】
複数のデータ処理プログラムの各グループが、データユニットのそれぞれのストリームの処理を周期的に終了し、コンピューティングシステムが、前記グループ内のすべてのデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める、請求項２８に記載の装置。
【請求項３０】
データ処理プログラムの第１のグループが、データユニットのそれぞれのストリームの処理を第１の頻度で終了し、データ処理プログラムの第２のグループが、データユニットのそれぞれのストリームの処理を前記第１の頻度とは異なる第２の頻度で終了する、請求項２９に記載の装置。
【請求項３１】
変更の第１の部分が恒久的に記憶された後であるが、変更の第２の部分が恒久的に記憶される前に、第１のグループ内の各データ処理プログラム内で処理が再開される、請求項１５〜３０のいずれかに記載の装置。
【請求項３２】
複数のデータ処理プログラムの第１のグループが、データユニットの２又は３以上のストリームの処理を周期的に終了し、コンピューティングシステムが、前記第１のグループ内のすべてのデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める、請求項１５〜３１のいずれかに記載の装置。
【請求項３３】
第１のデータ処理プログラム内の処理の終了を開始することが、連続データユニットの第１のサブセットと連続データユニットの第２のサブセットとの間にストリーム終了インジケータを挿入することを含み、前記第１のデータ処理プログラム内の処理の前記終了が、前記第１のデータ処理プログラムによって規定されたタスクを実施するすべてのプロセスが前記ストリーム終了インジケータに応答して正常に終了した後に完了している、請求項１５〜３２のいずれかに記載の装置。
【請求項３４】
共有データが、複数のデータ処理プログラムのすべてによってアクセスされ得る、請求項１５〜３３のいずれかに記載の装置。
【請求項３５】
１又は２以上のノードを含むコンピューティングシステムであって、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するように構成された、前記コンピューティングシステムと、
前記１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムであって、使用中、前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する、前記データストレージシステムとを含み、
前記複数のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、
連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、
データユニットの前記第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のデータ処理プログラム内の処理の終了を開始することと、
前記第１のデータ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更のすべてが恒久的に記憶されることを完了する前に、前記第１のデータ処理プログラム内の処理を再開することとを含む装置。
【請求項３６】
複数のデータ処理プログラムが、それぞれ、データユニットの少なくとも１つのストリームを、プログラム状態情報が前記ストリーム内の３つ以上の隣接するデータユニットにわたって保持されないようにして処理する、請求項３５に記載の装置。
【請求項３７】
データストレージシステムが、不揮発性ストレージ媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、前記変更を前記不揮発性ストレージ媒体に記憶することを含む、請求項３５又は３６に記載の装置。
【請求項３８】
データストレージシステムが、複数のノードに接続された通信媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、前記通信媒体を介して前記複数のノードの第１のノードから少なくとも第２のノードに前記変更を送信することを含む、請求項３５〜３７のいずれかに記載の装置。
【請求項３９】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、共有データの少なくとも１つのスナップショットを記憶することと、前記スナップショットが記憶された後、データユニットを処理することによって引き起こされた前記共有データに対する変更のジャーナルを記憶することとをさらに含む、請求項３５〜３８のいずれかに記載の装置。
【請求項４０】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することが、スナップショットの少なくとも一部を記憶することと、変更のジャーナルの少なくとも一部を記憶することとを含む、請求項３９に記載の装置。
【請求項４１】
データストレージシステムが、複数のデータ処理プログラムのうちの少なくとも１つによって処理されるデータユニットの１又は２以上のストリームに関連するストリーム状態情報も記憶する、請求項３５〜４０のいずれかに記載の装置。
【請求項４２】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、前記第１のデータ処理プログラム内の処理の終了が完了したと決定した後、データユニットの第１のストリームに関連するストリーム状態情報を恒久的に記憶することをさらに含む、請求項４１に記載の装置。
【請求項４３】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、前記第１のデータ処理プログラム内の処理の終了が完了したと決定する前に、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することをさらに含む、請求項３５〜４２のいずれかに記載の装置。
【請求項４４】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、前記第１のデータ処理プログラム内の処理を再開した後、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することをさらに含む、請求項４３に記載の装置。
【請求項４５】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更が、連続データユニットの第２のサブセットを処理することによって引き起こされた前記共有データに対する恒久的に記憶された変更と区別される、請求項３５〜４４のいずれかに記載の装置。
【請求項４６】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更が、連続データユニットの第２のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更が始まった後に恒久的に記憶され、連続データユニットの前記第１のサブセットが、データユニットの第１のストリーム内で連続データユニットの前記第２のサブセットの前にある、請求項４５に記載の装置。
【請求項４７】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、変更が恒久的に記憶されることを完了した後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を前記第１のデータ処理プログラムから解放することとをさらに含む、請求項３５〜４６のいずれかに記載の装置。
【請求項４８】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力が、連続データユニットの前記第１のサブセットを処理することによって引き起こされたすべての変更が恒久的に記憶された後、第１のデータ処理プログラムから解放される、請求項４７に記載の装置。
【請求項４９】
第１のデータ処理プログラムが、データユニットの第１のストリームを処理することを周期的に終了し、コンピューティングシステムが、前記第１のデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める、請求項３５〜４８のいずれかに記載の装置。
【請求項５０】
第１のデータ処理プログラム内の処理の終了を開始することが、連続データユニットの第１のサブセットと連続データユニットの第２のサブセットとの間にストリーム終了インジケータを挿入することを含み、前記第１のデータ処理プログラム内の処理の前記終了が、前記第１のデータ処理プログラムによって規定されたタスクを実施するすべてのプロセスが前記ストリーム終了インジケータに応答して正常に終了した後に完了している、請求項３５〜４９のいずれかに記載の装置。
【請求項５１】
共有データが、複数のデータ処理プログラムのすべてによってアクセスされ得る、請求項３５〜５０のいずれかに記載の装置。
【請求項５２】
１又は２以上のノードを含むコンピューティングシステム上で、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するステップと、
前記１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムに、前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶するステップとを含み、
１又は２以上のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、
データユニットの第１のストリームを処理して、データユニットの前記第１のストリーム内の連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、
データユニットの前記第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のデータ処理プログラム内の処理の終了を開始することと、
前記第１のデータ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更が恒久的に記憶された後、前記第１のデータ処理プログラム内の処理を再開することと、
前記変更が恒久的に記憶された後、連続データユニットの前記第１のサブセットに関して生じさせられた第１の出力を前記第１のデータ処理プログラムから解放することとを含む方法。
【請求項５３】
コンピュータ可読媒体に非一時的形態で記憶されたソフトウェアであって、コンピューティングシステムに、
データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行させ、
前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶させるための命令を含み、
１又は２以上のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、
データユニットの第１のストリームを処理して、データユニットの前記第１のストリーム内の連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、
データユニットの前記第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のデータ処理プログラム内の処理の終了を開始することと、
前記第１のデータ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更が恒久的に記憶された後、前記第１のデータ処理プログラム内の処理を再開することと、
前記変更が恒久的に記憶された後、連続データユニットの前記第１のサブセットに関して生じさせられた第１の出力を前記第１のデータ処理プログラムから解放することとを含む、前記ソフトウェア。
【請求項５４】
１又は２以上のノードを含むコンピューティングシステム上で、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するステップと、
前記１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムに、前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶するステップとを含み、
前記複数のデータ処理プログラムのうちの複数データ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することが、
前記第１のグループ内の各データ処理プログラムに関して、連続データユニットの複数のサブセットを含むデータユニットのそれぞれのストリームを処理することと、
データユニットの前記それぞれのストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のグループ内の各データ処理プログラム内の処理の終了を開始することと、
前記第１のグループ内の各データ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更が恒久的に記憶された後、前記第１のグループ内の各データ処理プログラム内の処理を再開することとを含む方法。
【請求項５５】
コンピュータ可読媒体に非一時的形態で記憶されたソフトウェアであって、コンピューティングシステムに、
データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行させ、
前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶させるための命令を含み、
前記複数のデータ処理プログラムのうちの複数データ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することが、
前記第１のグループ内の各データ処理プログラムに関して、連続データユニットの複数のサブセットを含むデータユニットのそれぞれのストリームを処理することと、
データユニットの前記それぞれのストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のグループ内の各データ処理プログラム内の処理の終了を開始することと、
前記第１のグループ内の各データ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更が恒久的に記憶された後、前記第１のグループ内の各データ処理プログラム内の処理を再開することとを含む、前記ソフトウェア。
【請求項５６】
１又は２以上のノードを含むコンピューティングシステム上で、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するステップと、
前記１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムに、前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶するステップとを含み、
前記複数のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、
連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、
データユニットの前記第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のデータ処理プログラム内の処理の終了を開始することと、
前記第１のデータ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更のすべてが恒久的に記憶されることを完了する前に、前記第１のデータ処理プログラム内の処理を再開することとを含む方法。
【請求項５７】
コンピュータ可読媒体に非一時的形態で記憶されたソフトウェアであって、コンピューティングシステムに、
データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行させ、
前記複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶させるための命令を含み、
前記複数のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することが、
連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、
データユニットの前記第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの前記第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で前記第１のデータ処理プログラム内の処理の終了を開始することと、
前記第１のデータ処理プログラム内の処理の前記終了が完了したと決定した後、連続データユニットの前記第１のサブセットを処理することによって引き起こされた前記共有データに対する少なくともいくつかの変更を恒久的に記憶することと、
前記変更のすべてが恒久的に記憶されることを完了する前に、前記第１のデータ処理プログラム内の処理を再開することとを含む、前記ソフトウェア。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
本出願は、２０１６年１月１４日に出願した米国特許出願第６２／２７８，５２８号の優先権を主張するものである。
【０００２】
この説明は、リカバリ可能なストリーム処理に関する。
【背景技術】
【０００３】
一部のデータ処理プログラムは、処理されるデータのバッチ（batch）（例えば、１又は２以上のファイル又はデータベーステーブル）を受け取り、そのデータを処理するために必要とされる時間の量は、バッチ内のデータの量に基づくのではっきりと定義される。この種の処理は、「バッチ処理」と呼ばれる。一部のデータ処理プログラムは、ストリームが未知の若しくは任意の数のデータユニット又はデータユニットの潜在的に連続的なフローを含む可能性があるために潜在的に未知の量の時間の間処理されるデータの１又は２以上のストリームを受け取る。この種の処理は、「ストリーム処理」又は「連続フロー処理（continuous flow processing）」と呼ばれる。データ処理システムにおいてリカバリ可能性を提供することに関連する要因は、使用されている処理の種類と、複数のインタラクションするデータ処理プログラムが存在するか否か、及びデータユニットを処理する順序が決定性（deterministic）であるか否かなどのその他の特徴とに依存する可能性がある。
【発明の概要】
【課題を解決するための手段】
【０００４】
一態様においては、概して、装置が、１又は２以上のノードを含むコンピューティングシステムであって、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するように構成された、コンピューティングシステムと、１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムであって、使用中、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する、データストレージシステムとを含む。１又は２以上のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、データユニットの第１のストリームを処理して、データユニットの第１のストリーム内の連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更が恒久的に記憶された後、第１のデータ処理プログラム内の処理を再開することと、変更が恒久的に記憶された後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を第１のデータ処理プログラムから解放することとを含む。
【０００５】
態様は、以下の特徴のうちの１又は２以上を含み得る。
【０００６】
複数のデータ処理プログラムは、それぞれ、データユニットの少なくとも１つのストリームを、プログラム状態情報がストリーム内の３つ以上の隣接するデータユニットにわたって保持されないようにして処理する。
【０００７】
データストレージシステムは、不揮発性ストレージ媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、変更を不揮発性ストレージ媒体に記憶することを含む。
【０００８】
データストレージシステムは、複数のノードに接続された通信媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、通信媒体を介して複数のノードの第１のノードから少なくとも第２のノードに変更を送信することを含む。
【０００９】
データストレージシステムは、複数のデータ処理プログラムのうちの少なくとも１つによって処理されるデータユニットの１又は２以上のストリームに関連するストリーム状態情報も記憶する。
【００１０】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、データユニットの第１のストリームに関連するストリーム状態情報を恒久的に記憶することをさらに含む。
【００１１】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力を第１のデータ処理プログラムから解放することは、コンピューティングシステム上で実行される複数のデータ処理プログラムに含まれない外部プログラムに第１の出力を解放することを含む。
【００１２】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更は、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更と区別される（例えば、下でより詳細に説明されるように、パイプライン化チェックポイント（pipelined checkpoint）を可能にする）。
【００１３】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更は、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更が始まった後に恒久的に記憶され、連続データユニットの第１のサブセットは、データユニットの第１のストリーム内で連続データユニットの第２のサブセットの前にある。
【００１４】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力は、連続データユニットの第１のサブセットを処理することによって引き起こされたすべての変更が恒久的に記憶された後、第１のデータ処理プログラムから解放される。
【００１５】
変更の第１の部分が恒久的に記憶された後であるが、変更の第２の部分が恒久的に記憶される前に、第１のデータ処理プログラム内で処理が再開される。
【００１６】
第１のデータ処理プログラムは、データユニットの第１のストリームを処理することを周期的に終了し、コンピューティングシステムは、第１のデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める。
【００１７】
第１のデータ処理プログラム内の処理の終了を開始することは、連続データユニットの第１のサブセットと連続データユニットの第２のサブセットとの間にストリーム終了インジケータを挿入することを含み、第１のデータ処理プログラム内の処理の終了は、第１のデータ処理プログラムによって規定されたタスクを実行するすべてのプロセスがストリーム終了インジケータに応答して正常に終了した後に完了している。
【００１８】
共有データは、複数のデータ処理プログラムのすべてによってアクセスされ得る。
【００１９】
別の態様においては、概して、装置が、１又は２以上のノードを含むコンピューティングシステムであって、（複数のデータ処理プログラムのうちの複数のデータ処理プログラムの少なくとも第１のグループがデータユニットの２又は３以上のストリームを処理するように）データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するように構成された、コンピューティングシステムと、１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムであって、使用中、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する、データストレージシステムとを含む。複数のデータ処理プログラムのうちの複数のデータ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することは、第１のグループ内の各データ処理プログラムに関して、連続データユニットの複数のサブセットを含むデータユニットのそれぞれのストリームを処理することと、データユニットのそれぞれのストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のグループ内の各データ処理プログラム内の処理の終了を開始することと、第１のグループ内の各データ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更が恒久的に記憶された後、第１のグループ内の各データ処理プログラム内の処理を再開することとを含む。
【００２０】
態様は、以下の特徴のうちの１又は２以上を含み得る。
【００２１】
複数のデータ処理プログラムは、それぞれ、データユニットの少なくとも１つのストリームを、プログラム状態情報がストリーム内の３つ以上の隣接するデータユニットにわたって保持されないようにして処理する。
【００２２】
データストレージシステムは、不揮発性ストレージ媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、変更を不揮発性ストレージ媒体に記憶することを含む。
【００２３】
データストレージシステムは、複数のノードに接続された通信媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、通信媒体を介して複数のノードの第１のノードから少なくとも第２のノードに変更を送信することを含む。
【００２４】
データストレージシステムは、複数のデータ処理プログラムのうちの少なくとも１つによって処理されるデータユニットの１又は２以上のストリームに関連するストリーム状態情報も記憶する。
【００２５】
複数のデータ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することは、第１のグループ内の各データ処理プログラム内の処理の終了が完了したと決定した後、第１のグループ内のデータ処理プログラムのいずれかによって処理されたデータユニットのそれぞれのストリームに関連するストリーム状態情報を恒久的に記憶することをさらに含む。
【００２６】
複数のデータ処理プログラムの少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することは、変更が恒久的に記憶された後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を複数のデータ処理プログラムの第１のグループから解放することをさらに含む。
【００２７】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力を複数のデータ処理プログラムの第１のグループから解放することは、複数のデータ処理プログラムの第１のグループに含まれないコンピューティングシステム上で実行される複数のデータ処理プログラムのうちの１つに第１の出力を解放することを含む。
【００２８】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力を複数のデータ処理プログラムの第１のグループから解放することは、コンピューティングシステム上で実行される複数のデータ処理プログラムに含まれない外部プログラムに第１の出力を解放することを含む。
【００２９】
外部プログラムは、第１のグループ内の少なくとも１つのデータ処理プログラムによってアクセスされ得る特定の共有データにアクセスする要求を送信し、要求の結果は、要求が受け取られる前に行われた特定の共有データへのすべての変更が恒久的に記憶された後、外部プログラムに解放される。
【００３０】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更は、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更と区別される。
【００３１】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更は、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更が始まった後に恒久的に記憶され、連続データユニットの第１のサブセットは、データユニットの第１のストリーム内で連続データユニットの第２のサブセットの前にある。
【００３２】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力は、連続データユニットの第１のサブセットを処理することによって引き起こされたすべての変更が恒久的に記憶された後、複数のデータ処理プログラムの第１のグループから解放される。
【００３３】
データユニットの２又は３以上のストリームを処理することは、少なくとも、複数のデータ処理プログラムのうちの複数のデータ処理プログラムの第１のグループ及び複数のデータ処理プログラムの第２のグループを使用してデータユニットの４又は５以上のストリームを処理することを含む。
【００３４】
複数のデータ処理プログラムの各グループは、データユニットのそれぞれのストリームの処理を周期的に終了し、コンピューティングシステムは、そのグループ内のすべてのデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める。
【００３５】
データ処理プログラムの第１のグループは、データユニットのそれぞれのストリームの処理を第１の頻度で終了し、データ処理プログラムの第２のグループは、データユニットのそれぞれのストリームの処理を第１の頻度とは異なる第２の頻度で終了する。
【００３６】
変更の第１の部分が恒久的に記憶された後であるが、変更の第２の部分が恒久的に記憶される前に、第１のグループ内の各データ処理プログラム内で処理が再開される。
【００３７】
複数のデータ処理プログラムの第１のグループは、データユニットの２又は３以上のストリームの処理を周期的に終了し、コンピューティングシステムは、第１のグループ内のすべてのデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める。
【００３８】
第１のデータ処理プログラム内の処理の終了を開始することは、連続データユニットの第１のサブセットと連続データユニットの第２のサブセットとの間にストリーム終了インジケータを挿入することを含み、第１のデータ処理プログラム内の処理の終了は、第１のデータ処理プログラムによって規定されたタスクを実施するすべてのプロセスがストリーム終了インジケータに応答して正常に終了した後に完了している。
【００３９】
共有データは、複数のデータ処理プログラムのすべてによってアクセスされ得る。
【００４０】
別の態様においては、概して、装置が、１又は２以上のノードを含むコンピューティングシステムであって、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するように構成された、コンピューティングシステムと、１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムであって、使用中、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶する、データストレージシステムとを含む。複数のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更のすべてが恒久的に記憶されることを完了する前に、第１のデータ処理プログラム内の処理を再開することとを含む。
【００４１】
態様は、以下の特徴のうちの１又は２以上を含み得る。
【００４２】
複数のデータ処理プログラムは、それぞれ、データユニットの少なくとも１つのストリームを、プログラム状態情報がストリーム内の３つ以上の隣接するデータユニットにわたって保持されないようにして処理する。
【００４３】
データストレージシステムは、不揮発性ストレージ媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、変更を不揮発性ストレージ媒体に記憶することを含む。
【００４４】
データストレージシステムは、複数のノードに接続された通信媒体を含み、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、通信媒体を介して複数のノードの第１のノードから少なくとも第２のノードに変更を送信することを含む。
【００４５】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、共有データの少なくとも１つのスナップショットを記憶することと、スナップショットが記憶された後、データユニットを処理することによって引き起こされた共有データに対する変更のジャーナルを記憶することとをさらに含む。
【００４６】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することは、スナップショットの少なくとも一部を記憶することと、変更のジャーナルの少なくとも一部を記憶することとを含む。
【００４７】
データストレージシステムは、複数のデータ処理プログラムのうちの少なくとも１つによって処理されるデータユニットの１又は２以上のストリームに関連するストリーム状態情報も記憶する。
【００４８】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、データユニットの第１のストリームに関連するストリーム状態情報を恒久的に記憶することをさらに含む。
【００４９】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、第１のデータ処理プログラム内の処理の終了が完了したと決定する前に、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することをさらに含む。
【００５０】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、第１のデータ処理プログラム内の処理を再開した後、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することをさらに含む。
【００５１】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更は、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する恒久的に記憶された変更と区別される。
【００５２】
連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更は、連続データユニットの第２のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更が始まった後に恒久的に記憶され、連続データユニットの第１のサブセットは、データユニットの第１のストリーム内で連続データユニットの第２のサブセットの前にある。
【００５３】
少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、変更が恒久的に記憶されることを完了した後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を第１のデータ処理プログラムから解放することとをさらに含む。
【００５４】
連続データユニットの第１のサブセットに関して生じさせられた第１の出力は、連続データユニットの第１のサブセットを処理することによって引き起こされたすべての変更が恒久的に記憶された後、第１のデータ処理プログラムから解放される。
【００５５】
第１のデータ処理プログラムは、データユニットの第１のストリームを処理することを周期的に終了し、コンピューティングシステムは、第１のデータ処理プログラムが終了される間に、データユニットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶し始める。
【００５６】
第１のデータ処理プログラム内の処理の終了を開始することは、連続データユニットの第１のサブセットと連続データユニットの第２のサブセットとの間にストリーム終了インジケータを挿入することを含み、第１のデータ処理プログラム内の処理の終了は、第１のデータ処理プログラムによって規定されたタスクを実施するすべてのプロセスがストリーム終了インジケータに応答して正常に終了した後に完了している。
【００５７】
共有データは、複数のデータ処理プログラムのすべてによってアクセスされ得る。
【００５８】
別の態様においては、概して、装置が、上述の装置のいずれかの処理を実行するための手段を含む。
【００５９】
別の態様においては、概して、方法が、上述の装置のいずれかの処理を実行する。
【００６０】
別の態様においては、概して、ソフトウェアが、コンピュータ可読媒体に非一時的形態で記憶され、ソフトウェアは、コンピューティングシステムに上述の装置のいずれかの処理を実行させるための命令を含む。
【００６１】
別の態様においては、概して、方法が、１又は２以上のノードを含むコンピューティングシステム上で、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するステップと、１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムに、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶するステップとを含み、１又は２以上のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、データユニットの第１のストリームを処理して、データユニットの第１のストリーム内の連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更が恒久的に記憶された後、第１のデータ処理プログラム内の処理を再開することと、変更が恒久的に記憶された後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を第１のデータ処理プログラムから解放することとを含む。
【００６２】
別の態様においては、概して、ソフトウェアが、コンピュータ可読媒体に非一時的形態で記憶され、ソフトウェアは、コンピューティングシステムに、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行させ、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶させるための命令を含み、１又は２以上のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、データユニットの第１のストリームを処理して、データユニットの第１のストリーム内の連続データユニットの複数のサブセットの各々に関して出力を生じさせることと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更が恒久的に記憶された後、第１のデータ処理プログラム内の処理を再開することと、変更が恒久的に記憶された後、連続データユニットの第１のサブセットに関して生じさせられた第１の出力を第１のデータ処理プログラムから解放することとを含む。
【００６３】
別の態様においては、概して、方法が、１又は２以上のノードを含むコンピューティングシステム上で、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するステップと、１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムに、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶するステップとを含み、複数のデータ処理プログラム(plurarity of data prosessing programs)のうちの複数データ処理プログラム(multiple data processing programs)の少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することは、第１のグループ内の各データ処理プログラムに関して、連続データユニットの複数のサブセットを含むデータユニットのそれぞれのストリームを処理することと、データユニットのそれぞれのストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のグループ内の各データ処理プログラム内の処理の終了を開始することと、第１のグループ内の各データ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更が恒久的に記憶された後、第１のグループ内の各データ処理プログラム内の処理を再開することとを含む。
【００６４】
別の態様においては、概して、ソフトウェアが、コンピュータ可読媒体に非一時的形態で記憶され、ソフトウェアは、コンピューティングシステムに、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行させ、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶させるための命令を含み、複数のデータ処理プログラム(plurarity of data prosessing programs)のうちの複数データ処理プログラム(multiple data processing programs)の少なくとも第１のグループを使用してデータユニットの２又は３以上のストリームを処理することは、第１のグループ内の各データ処理プログラムに関して、連続データユニットの複数のサブセットを含むデータユニットのそれぞれのストリームを処理することと、データユニットのそれぞれのストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のグループ内の各データ処理プログラム内の処理の終了を開始することと、第１のグループ内の各データ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更が恒久的に記憶された後、第１のグループ内の各データ処理プログラム内の処理を再開することとを含む。
【００６５】
別の態様においては、概して、方法が、１又は２以上のノードを含むコンピューティングシステム上で、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行するステップと、１又は２以上のノードのうちの少なくとも１つへアクセス可能な少なくとも１つのデータストレージシステムに、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶するステップとを含み、複数のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更のすべてが恒久的に記憶されることを完了する前に、第１のデータ処理プログラム内の処理を再開することとを含む。
【００６６】
別の態様においては、概して、ソフトウェアが、コンピュータ可読媒体に非一時的形態で記憶され、ソフトウェアは、コンピューティングシステムに、データユニットの少なくとも１つのストリームをそれぞれが処理する複数のデータ処理プログラムを実行させ、複数のデータ処理プログラムのうちの少なくとも２つによってアクセスされ得る共有データを記憶させるための命令を含み、複数のデータ処理プログラムのうちの少なくとも第１のデータ処理プログラムを使用してデータユニットの少なくとも１つのストリームを処理することは、連続データユニットの複数のサブセットを含むデータユニットの第１のストリームを処理することと、データユニットの第１のストリーム内で連続データユニットの第１のサブセットを処理することと連続データユニットの第１のサブセットに隣接する連続データユニットの第２のサブセットを処理することとの間で第１のデータ処理プログラム内の処理の終了を開始することと、第１のデータ処理プログラム内の処理の終了が完了したと決定した後、連続データユニットの第１のサブセットを処理することによって引き起こされた共有データに対する少なくともいくつかの変更を恒久的に記憶することと、変更のすべてが恒久的に記憶されることを完了する前に、第１のデータ処理プログラム内の処理を再開することとを含む。
【００６７】
態様は、以下の利点のうちの１又は２以上を有する可能性がある。
【００６８】
リアルタイムデータ処理のために構成されたコンピューティングシステムは、多くの場合、１又は２以上の到着するデータストリーム内の比較的大きな量のデータを扱う必要があり、低レイテンシーで到着する要求に応答することができる必要もある。本明細書において説明される技術は、そのようなシステムがリカバリ可能性、耐障害性、及び高可用性を有することを可能にし、その一方、応答レイテンシーの要件を損なわない。技術は、複数のインタラクションするデータ処理プログラムのコレクション（collection）にも適用され得る。リカバリ可能性のために使用されるメカニズムのうちの１つは、チェックポイント作成である。（例えば、約１０ｍｓから１００ｍｓの周期の）高い頻度のチェックポイント作成が実現される可能性があり、要求に応じて低レイテンシーで第三者預託（escrow）される出力を提供する能力をサポートする。
【００６９】
本発明のその他の特徴及び利点は、以下の説明及び請求項から明らかになるであろう。
【図面の簡単な説明】
【００７０】
【図１】タスクに基づくコンピューティングシステムのブロック図である。
【図２Ａ】パルス式摂取コンピューティングシステム（pulsed ingestion computing system）おける入力データの第１のパルス（pulse）及び第２のパルスの成功裏の処理と入力データの第３のパルスの失敗した処理とを示す処理のタイムラインの図である。
【図２Ｂ】入力データの第２のパルスの成功裏の処理に関連するチェックポイントまで処理の状態を復元するリカバリ動作を示す図２Ａの処理のタイムラインの図である。
【図２Ｃ】出力データの第３のパルスの成功裏の再処理を示す図２Ａの処理のタイムラインの図である。
【図３】概括的なパルス式摂取チェックポイント作成手法（general pulsed ingestion checkpointing approach）の処理のタイムラインの図である。
【図４】図３の概括的なパルス式摂取チェックポイント作成手法のリカバリ手順の処理のタイムラインの図である。
【図５】図３の概括的なパルス式摂取チェックポイント作成手法の複数グラフバージョンの処理のタイムラインの図である。
【図６】増分パイプライン化パルス式摂取チェックポイント作成手法（incremental and pipelined pulsed ingestion checkpointing approach）の処理のタイムラインの図である。
【図７Ａ】増分パイプライン化パルス式摂取チェックポイント作成手法を実装する例示的なコンピューティングシステムの図である。
【図７Ｂ】入力データの第１のパルスを処理し、第１のパルスの処理に関連する状態変化のジャーナルを作成する図７Ａのコンピューティングシステムの図である。
【図７Ｃ】入力データの第１のパルスの処理を終えた後の休止状態の図７Ａのコンピューティングシステムを示す図である。
【図７Ｄ】入力データの第１のパルスに関連する状態変化を恒久的に記憶する間に入力データの第２のパルスを処理し、第２のパルスの処理に関連する状態変化のジャーナルを作成する図７Ａのコンピューティングシステムを示す図である。
【図７Ｅ】入力データの第１のパルスに関連する状態変化を恒久的に記憶することを完了すると入力データの第１のパルスから生じさせられた出力データを第三者預託から解放する図７Ａのコンピューティングシステムを示す図である。
【図７Ｆ】入力データの第２のパルスから生じさせられた出力データを第三者預託して保持し続け、入力データの第２のパルスに関連する状態変化のジャーナルを作成する図７Ａのコンピューティングシステムを示す図である。
【図７Ｇ】入力データの第２のパルスの処理においてエラーからリカバリする図７Ａのコンピューティングシステムを示す図である。
【図８】分散型増分パイプライン化パルス式摂取チェックポイント作成手法（distributed incremental and pipelined pulsed ingestion checkpointing approach）を実装するコンピューティングシステムの図である。
【図９Ａ】トランザクションデータストア（transactional data store）とインタラクションし、増分パイプライン化パルス式摂取チェックポイント作成手法を実装する複数のコンピューティングシステムを示す図である。
【図９Ｂ】図９Ａのシステムのためのトランザクションデータストアのコミット手順を示す図である。
【発明を実施するための形態】
【００７１】
１  システムの概要
図１を参照すると、タスクに基づくコンピューティングシステム１００が、高レベルのプログラム仕様１１０を使用して、プログラム仕様１１０によって規定された計算を実行するようにコンピューティングプラットフォーム１５０の計算及び記憶リソースを制御する。コンパイラ／インタープリタ１２０は、高レベルのプログラム仕様１１０を受け取り、タスクに基づくランタイムインターフェース／コントローラ１４０によって実行され得る形態のタスクに基づく仕様１３０を生じさせる。コンパイラ／インタープリタ１２０は、複数のデータ要素の各々に適用される細分化されたタスクとして個々に又は一体としてインスタンス化され得る１又は２以上の「構成要素」の１又は２以上の「実行セット」を特定する。コンパイル又は解釈プロセスの一部は、下でより詳細に説明されるように、これらの実行セットを特定することと、実行するためにセットを準備することとを含む。コンパイラ／インタープリタ１２０は、高レベルのプログラム仕様１１０を解析するステップ、構文を検証するステップ、データフォーマットの型検査を行うステップ、任意のエラー又は警告を生じさせるステップ、タスクに基づく仕様１３０を準備するステップなどのステップを含むさまざまなアルゴリズムのいずれかを使用する可能性があり、コンパイラ／インタープリタ１２０は、例えば、コンピューティングプラットフォーム１５０上で実行される計算の効率を最適化するためにさまざまな技術を利用する可能性がある。コンパイラ／インタープリタ１２０によって生じさせられる目標のプログラム仕様は、それ自体、タスクに基づく仕様１３０を生成するためにシステム１００の別の部分によってさらに処理される（例えば、さらにコンパイルされる、解釈されるなど）ことになる中間形態である可能性がある。下の検討は、そのような変換の１又は２以上の例を概説するが、例えば、コンパイラの設計に精通する者によって理解されるように、もちろん、変換のその他の手法があり得る。
【００７２】
概して、計算プラットフォーム１５０は、いくつかの計算ノード１５２（例えば、分散された計算リソースと分散された記憶リソースとの両方を提供する個々のサーバコンピュータ）から構成され、それによって、高度な並列処理を可能にする。下でさらに詳細に検討されるように、高レベルのプログラム仕様１１０において表される計算は、比較的細分化されたタスクとしてコンピューティングプラットフォーム１５０上で実行され、さらに、規定された計算の効率的な並列実行を可能にする。
【００７３】
２  データ処理グラフ
一部の実施形態において、高レベルのプログラム仕様１１０は、データに対して実行されるデータ処理の計算の全体の一部をそれぞれが規定する「構成要素」の組を含む「データ処理グラフ」と呼ばれるある種のグラフに基づくプログラム仕様である。構成要素は、例えば、プログラミングユーザインターフェース及び／又は計算のデータ表現においてグラフ内のノードとして表される。上述のデータ処理グラフなどの一部のグラフに基づくプログラム仕様とは異なり、データ処理グラフは、データの転送、又は制御の転送、又はこれら両方のいずれかを表すノード間のリンクを含み得る。リンクの特徴を示す１つの方法は、構成要素に異なる種類のポートを設けることによる。リンクは、上流の構成要素の出力ポートから下流の構成要素の入力ポートに接続される有向リンクである。ポートは、データ要素がどのようにして書き込まれ、リンクから読まれるのか及び／又は構成要素がデータを処理するためにどのようにして制御されるのかの特徴を表すインジケータを有する。
【００７４】
これらのポートは、いくつかの異なる特徴を有する可能性がある。ポートの１つの特徴は、入力ポート又は出力ポートとしてのそのポートの方向性である。有向リンクは、データ及び／又は制御が上流の構成要素の出力ポートから下流の構成要素の入力ポートに運ばれることを表す。作成者は、異なる種類のポートを一緒にリンクすることを可能にされる。データ処理グラフのデータ処理の特徴の一部は、異なる種類のポートがどのようにして一緒にリンクされるのかに依存する。例えば、異なる種類のポート間のリンクは、下でより詳細に説明されるように、階層的形態の並列処理を提供する、異なる「実行セット」内の構成要素の入れ子にされたサブセットにつながる可能性がある。特定のデータ処理の特徴が、ポートの種類によって示唆される。構成要素が有する可能性がある異なる種類のポートは、以下を含む。
・構成要素のインスタンスがポートに接続されたリンクを通り越すコレクションのすべてのデータ要素をそれぞれ読むか又は書くことを意味するコレクション入力ポート又はコレクション出力ポート。構成要素のコレクションポート間の単一のリンクを有する構成要素の対に関して、下流の構成要素は、概して、データ要素が上流の構成要素によって書かれるときにそれらのデータ要素を読むことを可能にされ、上流の構成要素と下流の構成要素との間のパイプライン並列処理を可能にする。下でより詳細に説明されるように、データ要素は、並べ替えられる可能性もあり、それが、並列処理の効率を可能にする。例えば、プログラミンググラフィカルインターフェース内の一部のグラフィカルな表現において、そのようなコレクションポートは、概して、構成要素の四角いコネクタ記号によって示される。
・構成要素のインスタンスが、それぞれ、ポートに接続されたリンクから最大で１つのデータ要素を読むか又はポートに接続されたリンクに最大で１つのデータ要素を書くことを意味するスカラ入力ポート又はスカラ出力ポート。構成要素のスカラポート間の単一のリンクを有する構成要素の対に関して、上流の構成要素が実行を終えた後の下流の構成要素の直列実行が、単一のデータ要素の転送を制御の転送として使用することによって強制される。例えば、プログラミンググラフィカルインターフェース内の一部のグラフィカルな表現において、そのようなスカラポートは、概して、構成要素の三角のコネクタ記号によって示される。
・スカラ入力又はスカラ出力と同様であるが、いかなるデータ要素も送信される必要がなく、構成要素間の制御の転送を伝達するために使用される制御入力ポート又は制御出力ポート。構成要素の制御ポート間のリンクを有する構成要素の対に関して、上流の構成要素が実行を終えた後の下流の構成要素の直列実行が（たとえそれらの構成要素がコレクションポート間のリンクも有するとしても）強制される。例えば、プログラミンググラフィカルインターフェース内の一部のグラフィカルな表現において、そのような制御ポートは、概して、構成要素の丸いコネクタ記号によって示される。
【００７５】
これらの異なる種類のポートが、データ処理グラフの柔軟な設計を可能にし、ポートの種類の重なり合う特性によってデータ及び制御フローの強力な組合せを許容する。特に、（「データポート」と呼ばれる）ある形態でデータを運ぶ２つの種類のポート、コレクションポート及びスカラポートが存在し、（「シリアルポート」と呼ばれる）直列実行を強制する２つの種類のポート、スカラポート及び制御ポートが存在する。データ処理グラフは、概して、いかなる接続された入力データポートも持たない「ソース構成要素」である１又は２以上の構成要素と、いかなる接続された出力データポートも持たない「シンク構成要素」である１又は２以上の構成要素とを有する。一部の構成要素は、接続された入力データポートと接続された出力データポートとの両方を有する。一部の実施形態において、グラフは、巡回することを許されず、したがって、有向非巡回グラフ（ＤＡＧ，directed acyclic graph）でなければならない。この特徴は、下でより詳細に説明されるように、ＤＡＧの特定の特徴を利用するために使用され得る。
【００７６】
また、データ処理グラフの構成要素における専用の制御ポートの使用は、特定のその他の制御フロー技術を使用してはあり得ない計算の異なる部分の柔軟な制御を可能にする。例えば、データ処理グラフの間に依存関係の制約を適用することができるジョブ制御の解決策は、単一のデータ処理グラフ内の構成要素間の依存関係の制約を定義する制御ポートによって可能にされる細分化された制御を提供しない。さらに、逐次的に実行される異なるフェーズに構成要素を割り当てるデータ処理グラフは、個々の構成要素を順番に並べる柔軟性を許容しない。例えば、単純なフェーズを使用してはあり得ない入れ子にされた制御トポロジーが、本明細書において説明される制御ポート及び実行セットを使用して定義され得る。このより大きな柔軟性は、より多くの構成要素が可能であるときに同時に実行されることを可能にすることによって性能を潜在的に向上させる可能性もある。
【００７７】
異なる方法で異なる種類のポートを接続することによって、作成者は、データ処理グラフの構成要素のポートの間の異なる種類のリンクの構成を規定することができる。例えば、ある種類のリンクの構成が、特定の種類のポートが同じ種類のポートに接続されることに対応する可能性があり（例えば、スカラ−スカラリンク）、別の種類のリンクの構成が、特定の種類のポートが異なる種類のポートに接続されることに対応する可能性がある（例えば、コレクション−スカラリンク）。これらの異なる種類のリンクの構成は、作成者がデータ処理グラフの一部に関連する意図された振る舞いを視覚的に特定する方法と、その振る舞いを可能にするために必要とされる対応する種類のコンパイルプロセスをコンパイラ／インタープリタ１２０に示す方法との両方として働く。本明細書において説明される例は異なる種類のリンクの構成を視覚的に表現するために異なる種類のポートに一意の形状を使用するが、システムのその他の実施形態は、異なる種類のリンクを提供し、それぞれの種類のリンクに一意の視覚的インジケータ（例えば、太さ、リンクの種類、色など）を割り当てることによって異なる種類のリンクの構成の振る舞いを区別する可能性がある。しかし、ポートの種類の代わりにリンクの種類を使用して、上で挙げられた３種類のポートによって可能なのと同じさまざまなリンクの構成を表すためには、４種類以上のリンク（例えば、スカラ−スカラ、コレクション−コレクション、制御−制御、コレクション−スカラ、スカラ−コレクション、スカラ−制御など）が存在することになるであろう。その他の例は、異なる種類のポートを含むが、ただし、データ処理グラフ内でポートの種類を視覚的に明示的に示さない可能性がある。
【００７８】
コンパイラ／インタープリタ１２０は、実行するためにデータ処理グラフを準備するための手順を実行する。第１の手順は、構成要素の潜在的に入れ子にされた実行セットの階層を特定するための実行セット発見前処理手順である。第２の手順は、各実行セット内の構成要素の実行を制御するためにランタイムで状態機械を効果的に実施する制御コードを形成するためにコンパイラ／インタープリタ１２０が使用する対応する制御グラフを各実行セットに関して生じさせるための制御グラフ生成手順である。これらの手順の各々が、以下でより詳細に説明される。
【００７９】
少なくとも１つの入力データポートを有する構成要素は、各入力データ要素若しくはコレクション（又は複数の構成要素の入力ポート上のデータ要素及び／若しくはコレクションのタプル）に対して実行される処理を規定する。そのような規定の１つの形態は、１つの入力データ要素及び／若しくはコレクション又は入力データ要素及び／若しくはコレクションのタプルに対して実行される手順としての形態である。構成要素は、少なくとも１つの出力データポートを有する場合、対応する１つの出力データ要素及び／若しくはコレクション又は出力データ要素及び／若しくはコレクションのタプルを生成し得る。そのような手順は、高レベルのステートメントに基づく言語で（例えば、米国特許第８，０６９，１２９号明細書「Editing and Compiling Business Rules」（ビジネス規則の編集とコンパイル）において使用されたＪａｖａのソースステートメント若しくはデータ操作言語（ＤＭＬ，Data Manipulation Language）を使用して）規定される可能性があり、又は何らかの完全に若しくは部分的にコンパイルされた形態で（例えば、Ｊａｖａのバイトコードとして）提供される可能性がある。例えば、構成要素は、その構成要素の入力データ要素及び／若しくはコレクション並びにその構成要素の出力データ要素及び／若しくはコレクション、或いはより広く、そのようなデータ要素若しくはコレクションへの、又は入力を獲得し、出力データ要素若しくはコレクションを提供するために使用される手順若しくはデータオブジェクト（本明細書においては「ハンドル」と呼ばれる）への参照を引数が含む作業手順を有する可能性がある。
【００８０】
作業手順は、さまざまな種類である可能性がある。規定され得る手順の種類を限定することを意図することなく、ある種類の作業手順は、レコードフォーマットに従ってデータ要素に対する個別的な計算を規定する。単一のデータ要素は、テーブル（又はその他の種類のデータセット）からのレコードである可能性があり、レコードのコレクションは、テーブル内のレコードのすべてである可能性がある。例えば、単一のスカラ入力ポート及び単一のスカラ出力ポートを有する構成要素に関するある種類の作業手順は、１つの入力レコードを受け取ることと、そのレコードに対して計算を実行することと、１つの出力レコードを提供することとを含む。別の種類の作業手順は、複数のスカラ入力ポートから受け取られた入力レコードのタプルが複数のスカラ出力ポートにおいて送出される出力レコードのタプルを形成するためにどのようにして処理されるかを規定する可能性がある。
【００８１】
データ処理グラフによって規定される計算の意味的（semantic）定義は、グラフによって定義される計算の処理の順序付け及び同時性に対する制約及び／又は制約がないことを表すので元来並列的である。したがって、計算の定義は、結果が計算のステップの何らかの逐次的な順序付けと等価であることを必要としない。一方、計算の定義は、計算の部分を順番に並べることを必要とする特定の制約と、計算の部分の並列実行の制限を確かに与える。
【００８２】
データ処理グラフの検討において、ランタイムシステム内の別個の「タスク」としての構成要素のインスタンスの実施形態は、順番に並べる制約及び並列実行の制約を表す手段であると考えられる。意味的定義に合致するように計算を実装する、タスクに基づく仕様へのデータ処理グラフの実施形態のより詳細な検討は、グラフに基づく仕様自体の特徴の検討の後により完全に検討される。
【００８３】
概して、データ処理グラフ内の各構成要素は、グラフの実行中にコンピューティングプラットフォームにおいて何度かインスタンス化される。各構成要素のインスタンスの数は、複数の実行セットのうちのどれに構成要素が割り当てられるのかに依存する可能性がある。構成要素の複数のインスタンスがインスタンス化されるとき、２つ以上のインスタンスが並列に実行される可能性があり、異なるインスタンスがシステム内の異なるコンピューティングノードにおいて実行される可能性がある。ポートの種類を含む構成要素の相互接続が、規定されたデータ処理グラフによって認められる並列処理の性質を決定する。
【００８４】
概して、構成要素の異なるインスタンスの実行の間で状態は保持されないが、以下で検討されるように、構成要素の複数のインスタンスの実行にまたがる可能性がある「永続的なデータ」を明示的に参照するためにシステム内で特定のプロビジョニング（provision）が行われる。そのような永続的なデータが後の実行のために利用可能になる及び／又は特定の障害が起こった場合にリカバリ可能になることを保証するための１つの方法は、恒久的なストレージ媒体（例えば、不揮発性ストレージ媒体などの、停電などの１又は２以上の所定の障害が起こった場合に損失なく情報が記憶され得る媒体）にそのような永続的なデータを恒久的に記憶することである。
【００８５】
単一のレコードが単一の出力レコードを生成するためにどのようにして処理されるかを作業手順が規定し、ポートがコレクションポートであるものとして示される例においては、構成要素の単一のインスタンスが実行される可能性があり、連続的なレコードを処理して連続的な出力レコードを生じさせるために作業手順が反復される。この状況においては、反復毎に構成要素内で状態が保持されることがあり得る。
【００８６】
単一のレコードが単一の出力レコードを生成するためにどのようにして処理されるかを作業手順が規定し、ポートがスカラポートであるものとして示される例においては、構成要素の複数のインスタンスが実行される可能性があり、異なる入力レコードに関する作業手順の実行の間で状態は保持されない。
【００８７】
また、一部の実施形態において、システムは、上で導入された最も細分化された仕様に従わない作業手順をサポートする。例えば、作業手順は、例えば、スカラポートを通じて単一のレコードを受け付け、コレクションポートを通じて複数の出力レコードを提供する反復を内部で実施する可能性がある。
【００８８】
上述のように、ある形態でデータを運ぶ２つの種類のデータポート、コレクションポート及びスカラポートが存在し、直列実行を強制する２つの種類のシリアルポート、スカラポート及び制御ポートが存在する。場合によっては、ある種類のポートが、別の種類のポートにリンクによって接続される可能性がある。それらの場合の一部が、下で説明される。場合によっては、ある種類のポートが、同じ種類のポートにリンクされる。２つの制御ポート間のリンク（「制御リンク」と呼ばれる）は、リンクを介してデータが送信されることを必要とせずに、リンクされた構成要素の間に直列実行の順序付けを課す。２つのデータポート間のリンク（「データリンク」と呼ばれる）は、データフローを提供し、さらに、スカラポートの場合は直列実行の順序付けの制約を強制し、コレクションポートの場合は直列実行の順序付けを必要としない。概して、典型的な構成要素は、入力データポート及び出力データポート（コレクションポートか又はスカラポートかのどちらか）並びに入力制御ポート及び出力制御ポートを含む少なくとも２種類のポートを有する。制御リンクは、上流の構成要素の制御ポートを下流の構成要素の制御ポートに接続する。同様に、データリンクは、上流の構成要素のデータポートを下流の構成要素のデータポートに接続する。
【００８９】
３  コンピューティングプラットフォーム
再び図１を参照すると、データ処理グラフの構成要素のインスタンスが、データ処理グラフを実行する文脈でタスクとしてスポーン（spawn）され、概して、コンピューティングプラットフォーム１５０の複数のコンピューティングノード１５２において実行される。以下でより詳細に検討されるように、インターフェース／コントローラ１４０は、例えば、計算負荷の割り振り、通信又は入力／出力のオーバーヘッドの削減、及びメモリリソースの使用に関連するシステムの性能目標を達成するために、それらのタスクの実行のスケジューリング及び位置（locus）の監視制御の態様を提供する。
【００９０】
概して、コンパイラ／インタープリタ１２０による変換後、計算全体は、コンピューティングプラットフォーム１５０によって実行され得る目標言語の手順によってタスクに基づく仕様１３０として表される。これらの手順は「spawn」及び「wait」などのプリミティブを利用し、高レベルの（例えば、グラフに基づく）プログラム仕様１１０内の構成要素に関してプログラマによって規定された作業手順をそれらの手順の中に含むか又はそのような作業手順を呼び出す可能性がある。
【００９１】
多くのインスタンスにおいて、構成要素の各インスタンスは、いくつかのタスクが単一の構成要素の単一のインスタンスを実施し、いくつかのタスクが実行セットの複数の構成要素の単一のインスタンスを実施し、いくつかのタスクが構成要素の連続的なインスタンスを実施するようにしてタスクとして実施される。構成要素及びそれらの構成要素のインスタンスからの特定のマッピングは、結果として起こる実行が計算の意味的定義に合致したままであるようにコンパイラ／インタープリタの特定の設計に応じて決まる。
【００９２】
概して、ランタイム環境内のタスクは、例えば、１つの最上位のタスクが、例えば、データ処理グラフの最上位の構成要素の各々のために１つずつ複数のタスクをスポーンするようにして階層的に構成される。同様に、実行セットの計算は、複数の（つまり、多くの）サブタスクがコレクションの要素を処理するためにそれぞれ使用されるようにしてコレクション全体を処理するために１つのタスクを有する可能性がある。
【００９３】
ランタイム環境において、スポーンされた各タスクは、可能な状態の組の中の１つの状態にある可能性がある。初めてスポーンされるとき、タスクは、最初に実行される前、Spawned状態にある。実行するとき、タスクは、Executing状態にある。時々、タスクは、Suspended状態にある可能性がある。例えば、特定の実施形態において、スケジューラは、タスクがプロセッサ利用のクォンタムを超えたとき、リソースを待っているときなどにそのタスクをSuspended状態にする可能性がある。一部の実施形態において、タスクの実行は、プリエンプトされず、タスクが、制御を放棄しなければならない。３つのSuspended下位状態（sub-state）、すなわち、Runnable、Blocked、及びDoneが存在する。タスクは、例えば、そのタスクがそのタスクの計算を完了する前に制御を放棄した場合、Runnableである。タスクは、例えば、親タスクがそのタスクの戻り値を回収する前にそのタスクがそのタスクの処理を完了したとき、Doneである。タスクは、そのタスクがそのタスクの外部のイベント、例えば、別のタスクの完了（例えば、そのタスクが「wait for」プリミティブを使用したことが原因）、又はデータレコードが利用可能になることを待っている（例えば、in.read( )又はout.write( )関数の１つの実行をブロックする）場合、Blockedである。
【００９４】
再び図１を参照すると、各コンピューティングノード１５２は、１又は２以上の処理エンジン１５４を有する。各コンピューティングノード１５２は、バッファメモリ１５６（例えば、揮発性ストレージ媒体）、データストレージ１５７（例えば、不揮発性ストレージ媒体）、及びＩ／Ｏインターフェース１５８も含み、Ｉ／Ｏインターフェース１５８は、コンピューティングプラットフォーム１５０によって消費される及び／又は生成されるデータの送信元及び／又は送信先１６０にアクセスし得る。コンピューティングノード１５２のうちの１又は２以上のバッファメモリ１５６及び／又はデータストレージ１５７のどちらか又は両方は、複数のコンピューティングノード１５２によってアクセスされ得るように構成される可能性がある。少なくとも一部の実施形態において、各処理エンジン１５４は、コンピューティングノード１５２上で実行される単一のオペレーティングシステムプロセスに関連付けられる。コンピューティングノード１５２の特徴に応じて、単一のコンピューティングノード１５２上で複数の処理エンジン１５４を実行することが効率的である可能性がある。例えば、コンピューティングノード１５２は、複数の別々のプロセッサを有するサーバコンピュータである可能性があり、又はサーバコンピュータは、複数のプロセッサコアを有する単一のプロセッサを有する可能性があり、又は複数のコアを有する複数のプロセッサの組合せが存在する可能性がある。いずれの場合も、複数の処理エンジンを実行することが、コンピューティングノード１５２上で単一の処理エンジンのみを使用するよりも効率的である可能性がある。
【００９５】
処理エンジンの一例は、仮想マシンに関連してホストされる。１つの種類の仮想マシンは、Ｊａｖａ  Ｂｙｔｅｃｏｄｅとしてコンパイルされた形態で規定されるタスクが実行され得る環境を提供するＪａｖａ仮想マシン（ＪＶＭ，Java Virtual Machine）である。しかし、仮想マシンアーキテクチャを使用する可能性があるか又は使用しない可能性があるその他の形態の処理エンジンが、使用され得る。
【００９６】
４  リカバリ
一部の例において、上述のコンピューティングシステム１００は、処理の障害が起こる（例えば、コンピューティングノードが処理動作中に故障する）場合に、システムが故障しなかったか又はスリープしたか又はある期間の間速度が落ちたとした場合に生成された可能性がある結果を生成するように再始動され得ることを保証するためのリカバリアルゴリズムを実装する。
【００９７】
１つの簡単なリカバリアルゴリズムは、障害の後、データ処理グラフによって行われた作業のすべてがロールバックされるように作業のアトミックな単位としてデータを処理することを含む。このバッチ処理手法において、コンピューティングシステムは、障害が発生した処理中に変更されたすべてのファイルを処理が始まる前のそれらのファイルの状態に復元することによってリカバリ可能性を実現する。このようにして、リカバリアルゴリズムは、障害が発生した処理中に行われたすべての作業及び変更が破棄されることを保証し得る。この種のリカバリアルゴリズムは、比較的短い量の時間でデータのすべてを処理する単一のデータ処理グラフによってデータが処理されているときに特に有用である。
【００９８】
しかし、永続的な共有リソースを更新する複数のグラフを扱うとき、又は長い（不定である可能性がある）継続時間にわたってデータを処理するグラフを処理するとき、データの処理を障害の後にすべてロールバックされ得る作業のアトミックな単位として扱うことは実際的でなく、ときに不可能である。
【００９９】
４．１  もつれ
例えば、コンピューティングシステムが、永続的な共有データを更新することを含め、複数のデータ処理グラフを使用して１又は２以上の共有リソースを同時に処理するとき、リカバリ可能性は、「もつれ」と呼ばれる状態が原因で失われる。共有データは、少なくとも２つの異なるデータ処理グラフの各々によって読まれ、書き込まれ（又は修正され）得るデータである。共有データは、例えば、データ処理グラフの間で共有状態及び／又は共有通信（shared communication）の形態として異なるデータ処理グラフによって値が読まれ、書き込まれる変数である可能性がある。
【０１００】
もつれの例に関して、２つのデータ処理グラフが共有データの独立した組を処理しており、各データ処理グラフが共有データに対してアトミックに変更を行う状況を考える。２つのデータ処理グラフのうちの第１のデータ処理グラフがデータの組を処理し、アトミックな更新において変更を行い、その変更をコミットしてそれらの変更が永続的にされた（例えば、恒久的に記憶された）ことを確定し、その後、２つのデータ処理グラフのうちの第２のデータ処理グラフの実行中に障害が発生する状況が起こり得る。システムが第２のデータ処理グラフの障害が発生した処理中に変更された（共有データを含む）すべてのデータを処理が始まる前のそのデータの元の状態に復元するリカバリ手順を実施する場合、第１のデータ処理グラフが共有データに対して行った変更の少なくとも一部が元に戻され、不整合を生じる。一方、システムが第２のデータ処理グラフの障害が発生した処理中に変更された（共有データを含む）すべてのデータを処理が始まる前のそのデータの元の状態に復元しない場合、第２のデータ処理グラフの出力は、その第２のデータ処理グラフの処理の始めに共有データの状態が誤っていることが原因で誤っている可能性がある。したがって、もつれが原因で、共有データを操作するデータ処理グラフは、障害の後、独立して復元され得ない。
【０１０１】
もつれたプロセスの存在下でリカバリを行う１つの手法は、グラフが互いの変更を見ることができないように複数のデータ処理グラフを互いに分離することを含む。しかし、データ処理グラフが同じデータアイテムを操作しており、したがって、分離が可能でない場合が多い。さらに、一部の例においては、複数のデータ処理グラフが比較的長い継続時間の間実行され、そのことは、（悲観的並行性制御を使用する場合）デッドロックが原因で又は（楽観的並行性制御を使用する場合）コミット時間の衝突が原因で一方のデータ処理グラフがもう一方のデータ処理グラフがロックを解除するのを待つか又は一方のデータ処理グラフがロールバックされるかどちらかの結果となる可能性が高い。もつれたプロセスの存在下でリカバリを行うその他の手法は、複数のデータ処理グラフを作業の単一のアトミックな単位の一部として実行すること、又は複数のデータ処理グラフを逐次的に実行することを含む。
【０１０２】
４．２  長時間実行グラフ
一部の例において、コンピューティングシステム１００内で実行されるデータ処理グラフは、いかなる明確に定義された終了点もなくデータの連続したストリームを処理する。これらのデータ処理グラフは、「摂取グラフ（ingestion graph）」と呼ばれることがある。データの連続したストリームを処理するとき、データのすべての処理を作業の単一のアトミックな単位として扱うことは不適切であり、上述のリカバリ手法はコンピューティングシステム内の障害から成功裏にリカバリするのに不適切である。
【０１０３】
そのようなコンピューティングシステム内の障害からリカバリするための１つの手法は、入力データの連続したストリームを入力データの一連のより小さな「パルス」に分割することと、入力データの一連のパルスを個々に処理することとを含む。入力データの所与のパルスの処理の完了時に、グラフの内部状態のチェックポイントが作成される。障害が起こった場合、コンピューティングシステムは、チェックポイントを使用してグラフの内部状態を復元し、連続したデータストリームの処理の中間点で処理を再始動することができる。一部の例において、コンピューティングシステムは、もつれた長時間実行グラフを含む場合、グラフのすべてが共通のコミット時間を共有することを保証するためにチェックポイントを調整しなければならない。
【０１０４】
本明細書において使用されるとき、「データユニットのストリーム」とも呼ばれる、パルスに分割される入力データは、例えば、外部ソースから受け取られた後に読まれる入力レコードの任意のシーケンス、又は任意の共有された変数の記憶された状態若しくは入力データのソースとして働く任意の内部システム状態にアクセスすることによって読まれたデータの任意の単位を含むと見なされる。
【０１０５】
例えば、図２Ａを参照すると、コンピューティングシステム１００は、「Ａ」とラベル付けされた第１のグラフ及び「Ｂ」とラベル付けされた第２のグラフを時間ｔ０に開始し、グラフは、入力データの第１のパルスの処理を始める。時間ｔ１において、第１のグラフと第２のグラフとの両方は、入力データの第１のパルスの処理を完了し、第１のチェックポイントを書き込む。第１のチェックポイントが書き込まれた状態で、第１のグラフ及び第２のグラフは、入力データの第２のパルスの処理を始める。時間ｔ２において、第１のグラフと第２のグラフとの両方は、入力データの第２のパルスの処理を完了し、第２のチェックポイントを書き込む。第２のチェックポイントが書き込まれた状態で、第１のグラフ及び第２のグラフは、入力データの第３のパルスの処理を始める。時間ｔ３で、入力データの第３のパルスの処理において障害が発生する。
【０１０６】
図２Ｂを参照すると、障害からリカバリするために、コンピューティングシステムは、第２のチェックポイントを使用して第１のグラフ及び第２のグラフを、入力データの第２のパルスの処理の完了時のそれらのグラフのそれぞれの状態に復元する。
【０１０７】
図２Ｃを参照すると、第１のグラフ及び第２のグラフが入力データの第２のパルスの処理の完了時のそれらのグラフのそれぞれの状態に復元された状態で、グラフは、入力データの第３のパルスを成功裏に再処理し、時間ｔ４において第３のチェックポイントを書き込む。
【０１０８】
４．３  通常のチェックポイント作成アルゴリズム
チェックポイントデータを保存する１つの手法は、「チェックポイントマスタ」ノード（例えば、システム内のコンピューティングノードのうちの１つ）に、新しいチェックポイントメッセージをコンピューティングシステム内のすべてのその他のコンピューティングノードにブロードキャストすることによってまずチェックポイントを開始させることを含む。コンピューティングノードにおいて受け取られると、新しいチェックポイントメッセージは、サーバにすべてのコンピューティング活動を中断させる。それから、コンピューティングシステムは、システム内のコンピューティングノード間を移動中のすべてのメッセージが届けられるのを待つ。
【０１０９】
すべてのメッセージが届けられると、各コンピューティングノードは、そのコンピューティングノードのタスクの状態、保留中のメッセージ、永続的なデータ、及び一時的な状態をチェックポイントファイルに保存する。そして、マスタコンピューティングノードは、チェックポイントをコミットするジャーナルエントリを書き込み、システム内のコンピューティングノードのすべてにメッセージを送信して処理を再開する。
【０１１０】
上述の手法は、入力データの連続したストリームを処理する際に障害からリカバリすることができるチェックポイント作成手順をもたらすが、手法に関連するいくつかの欠点が存在する。例えば、上の手法は、比較的長い継続時間の間、処理の中断を必要とし、その継続時間中、コンピューティングシステムは、有用な処理を完了することができない。さらに、コンピューティングノードのタスクの状態を保存することは、計算量が多く、コンピューティングシステムが入力データの処理ではなくタスクの状態の保存に過度な量の時間を費やす結果となる。最後に、コンピューティングシステムは、トランザクションデータストアのコミットマネージャ、トランザクションデータストアのテーブル及びインデックスに対するインフライト（in-flight）更新、インフライトサービス呼び出し、あるサーバから別のサーバに移動するインフライトデータ、あるサーバから別のサーバにマイグレーションするインフライトプロセス、並びに共有データ（例えば、コンピューティングシステム１００において実行される（データ処理グラフの構成要素に関連する）２又は３以上のタスクによってアクセスされ得るデータ）へのインフライトアクセスの状態などの大量の一時的な状態を有する。一部の例において、この一時的な状態を保存することは、計算コストが高く、計算が複雑である。
【０１１１】
４．４  パルス式摂取アルゴリズム
パルス式摂取アルゴリズムは、通常のチェックポイント作成アルゴリズムに関連する欠点を避けるために、コンピューティングシステムにおいて実行されるグラフのいくつかの特性に依拠する。コンピューティングシステムにおいて実行される摂取グラフの１つの特性は、それらの摂取グラフが一度に１レコードずつデータを摂取する（ingest）ことである（例えば、摂取（ingestion）は、繰り返しレコードを読み、共有された永続的なデータを更新することを含む）。コンピューティングシステムにおいて実行される摂取グラフの別の特性は、それらの摂取グラフがレコード毎にステートレスであることである。つまり、すべての状態が、グラフによってアクセスされ得る永続的なデータ（例えば、共有データのコレクション及びトランザクションデータストアのテーブル）内に保持される。さらに、一部の例において、コンピューティングシステムにおいて実行されるデータ処理グラフは、レコード毎にステートレスである構成要素のみを含む。
【０１１２】
コンピューティングシステムにおいて実行されるグラフのこれらの特性に基づいて、グラフの単一の実行において入力データストリーム全体を摂取することと、入力データストリームから入力データのパルスを摂取し、グラフをきれいにシャットダウンし（つまり、データのパルスに関連する任意の処理を完了した後にすべてのプロセスが正常に終了することを可能にし）、それから、入力データストリームの後続のパルスを処理するためにグラフを再始動することとの間で違いはない。パルス式摂取手法（pulsed ingestion approach）においてはグラフがきれいにシャットダウンすることを可能にされるので、コンピューティングシステムは、チェックポイント作成プロセス中に大量の内部のグラフの状態を保存する必要がない。
【０１１３】
４．４．１  単一グラフパルス式摂取アルゴリズム
図３を参照すると、単一のグラフにおいて入力データのストリームを処理するためのパルス式摂取アルゴリズムは、時間ｔ０においてグラフを開始することを含む。開始されると、グラフは、入力データのストリームからの入力データの第１のパルスを処理して出力データを生じさせ、そのグラフは、その出力データを第三者預託して記憶する（つまり、出力は、下流のプロセスに直ちに提供されない）。時間ｔ１において、パルス終了インジケータ（例えば、ファイル終端（ＥＯＦ，end-of-file）文字）が、入力データのストリームに挿入され、入力データの第１のパルスの終末を示す。グラフは、時間ｔ１においてパルス終了インジケータに遭遇するとき、入力データストリームから新しいデータを摂取することをやめる。それから、時間ｔ１から時間ｔ２まで、グラフは、そのグラフが時間ｔ１において既に処理していたすべてのデータを処理することを終える（つまり、グラフは、「休止する（quiesce）」ことを可能にされる）。時間ｔ１と時間ｔ２との間の休止期間は、図３において処理負荷の下り傾斜３７０として示される。
【０１１４】
時間ｔ２において、グラフが休止すると、コンピューティングシステムは、すべての永続的なデータ、ストリーミング入力データの状態（例えば、現在位置）、及び出力データの状態を含むチェックポイントを恒久的なストレージに書き込み始める。時間ｔ３において、恒久的なストレージへのチェックポイントの書き込みを完了すると、入力データの第１のパルスに関連する第三者預託された出力データが、下流のプロセスに解放される。そして、時間ｔ４において、グラフが再始動され、（上述の手順に従って）入力データのストリームからの入力データの第２のパルスを処理し始める。
【０１１５】
概して、グラフがチェックポイントを書き込む前に休止することを可能にされるとすると、グラフが実行されていないので、プロセスの状態、メッセージ、及び過渡状態（transient）は、システム内に存在しない。一部の例においては、入力データのあらゆるパルスが非常に小さい（例えば、１秒につき１００個のパルスが存在する）ので、グラフをシャットダウンすること及び再始動することに関連するオーバーヘッドはほとんどない。これは、十分に短い応答レイテンシーを必要とするアプリケーションにとって理想的な高頻度のチェックポイント作成（例えば、１０ｍｓのチェックポイント間隔）をもたらし得る。例えば、特定のアプリケーションは、再始動（つまり、グラフをシャットダウンすること、プロセスが正常に終了するのを待つこと、及び再び始動すること）のオーバーヘッドが１０ｍｓよりも著しく小さい（例えば、１ｍｓ未満である）ことを必要とする。さらに、チェックポイントを書き込むために必要とされる時間も、チェックポイント間隔と比較されたとき、小さい（例えば、１ｍｓ）。一部の例において、再始動のタイミングの要件は、特定の始動に関連する処理結果を記憶し、より速い始動のために入力データの後続のパルスのためにそれらの結果を（再計算するのではなく）再利用することによって達成される。一部の例において、記憶される結果は、低い頻度で（例えば、１０秒毎又は１分毎に）再計算される。
【０１１６】
図４を参照すると、リカバリ手順の例において、コンピューティングシステムは、（上述のように）単一のグラフを使用して入力データの第１のパルスを処理し、時間ｔ３において第１のチェックポイントを記憶する。時間ｔ４において、システムは、グラフを使用して入力データの第２のパルスの処理を始める。それから、時間ｔ５で、第２のパルスの処理において障害が発生する。障害が原因で、システムは、時間ｔ６においてすべての計算をシャットダウンし（例えば、障害の起こらなかったすべてのコンピューティングノード上の処理を止め）、第１のチェックポイントを使用してそのシステムの入力及び出力データの状態をデータの第１のパルスの処理の完了時の（つまり、時間ｔ２における）システムの状態に復元する。そのようにするために、システムは、入力データの第２のパルスをそのシステムの初期（つまり、時間ｔ４における）状態まで巻き戻し、入力データの第２のパルスに関するすべての第三者預託された出力データを破棄する。時間ｔ７において、システムの永続的なデータをデータの第１のパルスの処理の完了時のそのシステムの状態に復元するためにチェックポイントが使用される。
【０１１７】
時間ｔ８において、システムがデータの第１のパルスの処理の完了時のそのシステムの状態に完全に復元された状態で、グラフが再始動し、入力データの第２のパルスの再処理を始める。図４において、入力データの第２のパルスの再処理は成功する。
【０１１８】
４．４．２  複数グラフパルス式摂取アルゴリズム
図５を参照すると、一部の例において、システムは、複数のグラフ（例えば、複数の摂取グラフ）のコレクションを含むとき、グラフのコレクションを通じて同時にデータのパルスを処理するように構成される。
【０１１９】
特に、複数のグラフのコレクションにおいて入力データの１又は２以上のストリームを処理するためのパルス式摂取アルゴリズムは、時間ｔ０においてコレクション内のグラフのすべてを開始することを含む。開始されると、グラフの各々が、入力データの１又は２以上のストリームからの入力データの第１のパルスを処理して、それぞれの１又は２以上の出力データストリームを生じさせ、それらの出力データストリームは、第三者預託して記憶される（つまり、出力データストリームは、下流のプロセスに直ちに提供されない）。時間ｔ１において、パルス終了インジケータが、入力データのストリームに挿入され、入力データの第１のパルスの終末を示す。一部の例においては、パルス終了インジケータが入力データストリームのうちの２又は３以上に同期して挿入されることを保証するためにバリア同期（barrier synchronization）動作が使用される。グラフは、時間ｔ１においてパルス終了インジケータに遭遇するとき、入力データストリームから新しいデータを摂取することをやめる。それから、時間ｔ１から時間ｔ２まで、グラフは、それらのグラフが時間ｔ１において既に処理していたすべてのデータを処理することを終える（つまり、グラフは、「休止する」ことを可能にされる）。時間ｔ１と時間ｔ２との間の休止期間は、図５において処理負荷の下り傾斜５７０として示される。
【０１２０】
一部の例においては、グラフのすべてが終了するのを待つために別のバリア同期が使用される。時間ｔ２において、グラフがすべて終了すると、チェックポイントが書き込まれ、すべての永続的なデータ、ストリーミング入力データの状態（例えば、現在位置）、及び出力データの状態が恒久的なストレージに書き込まれる。時間ｔ３において、恒久的なストレージへのチェックポイントの書き込みを完了すると、入力データの第１のパルスに関連する第三者預託された出力データストリームが、下流のプロセスに解放される。そして、時間ｔ４において、グラフは、別のバリア同期動作を使用して同期して再始動され、（上述の手順に従って）入力データのストリームからの入力データの第２のパルスを処理し始める。
【０１２１】
４．４．３  増分パイプライン化チェックポイント
一部の例において、あらゆるチェックポイント動作に関して永続的なデータの内容全体を保存することは、システムが摂取されるデータを１秒のほんの何分の１かの間に利用可能にする必要がある可能性がある一方で、そのようにすることが数分又はさらには数時間かかる可能性があるので実際的でない。
【０１２２】
あらゆるチェックポイントに関して保存されるデータの量を削減する１つの手法は、入力データの特定のパルスが処理されるときに、永続的なデータに対する変更をジャーナルに増分書き込みすることである。そのようにすることは、所与のチェックポイントに関して書き込まれるデータの量を、入力データの特定のパルスの処理において変更されたデータの量に制限する。そのようにすることの１つの利点は、（永続的なデータに対する変更を表す）ジャーナルへのエントリが、少なくとも、システムがチェックポイントを形成し、記憶し始める前に恒久的に記憶される過程にあることである。さらに、ジャーナルに変更を増分書き込みすることは、変更されたデータアイテムの「ダーティリスト」を保持し、チェックポイントが形成されるときにそのリストを見て回る（walk）オーバーヘッドを背負い込むことを防止する。ジャーナルに変更を増分書き込みすることの別の利点は、ジャーナルへのエントリが、異なるパルスに関するジャーナルエントリの間の境界を特定するために使用され得る「チェックポイントマーカ」によってタグ付けされる可能性があることである。チェックポイントマーカを使用するとき、システムは、第１の前のパルスに関するジャーナルエントリがまだ恒久的に記憶されている間に第２のパルスの処理を始めることができる。
【０１２３】
図６を参照すると、増分パイプライン化チェックポイント作成を用いるパルス式摂取アルゴリズムが、時間ｔ０においてグラフを開始することを含む。開始されると、グラフは、入力データのストリームからの入力データの第１のパルスを処理して出力データの１又は２以上のストリームを生成し、出力データのそれらのストリームは、第三者預託して記憶される。さらに、入力データの第１のパルスの処理中に発生する永続的なデータに対する変更は、それらの変更が起こるときにジャーナルにエントリとして非同期に記憶される。
【０１２４】
時間ｔ１において、パルス終了インジケータが、入力データのストリームに挿入され、入力データの第１のパルスの終末を示す。グラフは、時間ｔ１においてパルス終了インジケータに遭遇するとき、入力データストリームから新しいデータを摂取することをやめる。それから、時間ｔ１から時間ｔ２まで、グラフは、それらのグラフが時間ｔ１において既に処理していたすべてのデータを処理することを終える（つまり、グラフは、「休止する」ことを可能にされる）。時間ｔ１と時間ｔ２との間の休止期間は、図６において処理負荷の下り傾斜６７０として示される。
【０１２５】
時間ｔ３において、グラフが休止すると、チェックポイントカウンタを含むチェックポイントレコードが、ジャーナルに書き込まれ、システムが、（すべての永続的なデータ、ストリーミング入力データの状態（例えば、現在位置）、及び出力データの状態を恒久的に記憶することを含め）チェックポイントレコードを恒久的に記憶し始める。時間ｔ４において、チェックポイントレコードが恒久的に記憶される前に、グラフは、再始動され、入力データのストリームからの入力データの第２のパルスの処理を始める。時間ｔ５において、システムは、チェックポイントレコードを恒久的に記憶することを完了し、入力データの第１のパルスに関連する第三者預託された出力データが、下流のプロセスに解放される。システムは、上述のアルゴリズムに従って入力データの第２のパルスの処理を継続する。
【０１２６】
一部の例においては、上述のアルゴリズムが、複数のチェックポイントが同時に進行することを可能にするために修正される。そのようにするために、恒久的に記憶されたデータの異なる組が、互いに区別される。例えば、第三者預託されたまま保たれるすべての出力データが、チェックポイントカウンタによってタグ付けされ、ジャーナルに書き込まれるチェックポイントレコードが、チェックポイントカウンタによってタグ付けされる。
【０１２７】
所与のチェックポイントｎに関するすべてのチェックポイントレコードが恒久的になるときにはいつでも、所与のチェックポイントがコミットされ、所与のチェックポイントのチェックポイントカウンタによってタグ付けされたすべての出力データが第三者預託から解放される。この手法においては、チェックポイント作成アルゴリズムの後続の反復を実行する前に現在のチェックポイントからのチェックポイントレコードが恒久的になるのを待つのではなく、この最後のステップが、チェックポイント作成アルゴリズムの反復と非同期に実行されることに留意されたい。異なるチェックポイントの反復からのチェックポイントレコードの書き込みは重ならないが、チェックポイントレコードを永続的に記憶するための処理は、重なることを可能にされる。
【０１２８】
４．４．３．１  増分パイプライン化チェックポイントの例
図７Ａを参照すると、増分パイプライン化チェックポイント作成手法の一例において、コンピューティングシステム１００は、入力フロー１１１からの入力データのストリーム１１２を受け取り、入力データのストリーム１１２を処理し、出力データのストリームを出力フロー１３１に提供する。コンピューティングシステム１００は、例えば、コンピューティングノード１５２に関して上でより詳細に説明されているように、入力データを分散して処理して出力データを生じさせるいくつかのコンピューティングノード１２１を含む。
【０１２９】
動作中、コンピューティングシステム１００は、摂取グラフを使用して、一度に１個又は数個のレコードずつ入力データのストリームからデータを摂取する。摂取されたデータは、コンピューティングシステム１０２のコンピューティングノード１２１上で実行される１又は２以上のデータ処理グラフを使用して処理される。入力データストリーム１１２は、すべてがパルス終了インジケータによって分けられる入力データの第１のパルス１１２Ａ、入力データの第２のパルス１１２Ｂ、及び入力データの第３のパルス１１２Ｃを含むパルスにセグメント分けされる。一部の例においては、パルス終了インジケータが、入力データの既存の又は固有の構造に従って（例えば、各レコード、ｎレコード毎などで）入力データストリーム１１２に挿入される。一部の例においては、システムが、パルス終了インジケータを入力データストリーム１１２のどこに挿入すべきかを動的に又は任意に決定する。一部の例において、システムは、システムが少しの間休止しているときにパルス終了インジケータを挿入する。入力データの各「パルス」は、入力データストリーム１１２内の連続データユニットのサブセットを含む。本明細書において使用されるとき、「連続」データユニットの各サブセットは、入力データストリーム１１２内の何らかの順序付けによる順序通りであり、連続データユニットのいかなるその他のサブセットとも重ならないデータユニットを含む。
【０１３０】
一部の例においては、パルスのサイズ（「チェックポイント間隔」と呼ばれることがある）が、頻繁なチェックポイント作成が招くスループットの悪化と、アプリケーションによって必要とされる応答レイテンシー（応答レイテンシーは、任意の所与の時間に、完全なチェックポイントが実行されるまでグラフからの応答が供給されない可能性があるので、チェックポイント間隔によって制限される）との間のトレードオフに基づいて決定される。
【０１３１】
図７Ｂを参照すると、コンピューティングシステム１００がデータストリームの第１のパルス１１２Ａからデータを摂取するとき、摂取されたデータ１２２Ａ（例えば、個々のレコード）は、１又は２以上のデータ処理グラフに従って処理するためにコンピューティングノード１２１に与えられる。また、リカバリ動作が必要とされる場合に後で取り出すために、第１のパルス１１２Ａからの摂取されたデータ１１３Ａのコピーが恒久的に記憶される。
【０１３２】
コンピューティングノード１２１によって生じさせられた出力データのストリーム１３２Ａは、出力フロー１３１に与えられるが、第１のパルス１１２Ａ全体が成功裏に処理されるまで出力データ１３２が下流のプロセス（例えば、下流のコンピューティングシステムにおいて実施されるプロセス−図示せず）に与えられないように第三者預託して保有される（開スイッチ１３５によって表される）。一部の例において、出力データのストリームは、出力データをその関連する入力データパルスにリンクする一意識別子に関連付けられる。
【０１３３】
入力データストリーム１１２の第１のパルス１１２Ａの処理が進むとき、永続的なデータの状態、ストリーミング入力の状態、及びストリーミング出力の状態が変わる。一部の例において、コンピューティングシステム１００は、これらの状態変化が起こるときにこれらの状態変化が揮発性の一時的ジャーナル１４１に（ときに非同期に）記録されるチェックポイント手順を実行する。一時的ジャーナル１４１は、記録された状態変化を恒久的ジャーナル１４２に非同期に書き込む。一部の例においては、出力データのストリーム及びジャーナルに記憶された状態変化が両方ともそれらの関連する入力データパルスにリンクされるように、一時的ジャーナル１４１及び恒久的ジャーナル１４２に記憶された状態変化が一意識別子にやはり関連付けられる。一部の例において、一意識別子は、「チェックポイント識別子」と呼ばれる。
【０１３４】
図７Ｃを参照すると、第１のパルス１１２Ａ全体を摂取すると、コンピューティングシステム１００は、チェックポイント手順を実行するようにコンピューティングシステム１００に信号を送るパルス終了インジケータに遭遇する。チェックポイント手順において、コンピューティングシステムは、データを摂取することを止め、コンピューティングノード１２１が休止する（つまり、コンピューティングシステム１００内に存在する第１のパルス１１２Ａのすべての未処理のレコードの処理を終わらせる）ことを可能にする。この時間中に、一時的ジャーナル１４１は、記録された状態変化を恒久的ジャーナル１４２に非同期に書き込むことを続ける。結局、コンピューティングノード１２１が休止すると、コンピューティングシステム１００は、第１のパルス１１２Ａに関連する状態変化を一時的ジャーナル１４１に記録することを完了する。
【０１３５】
コンピューティングシステムが休止することを可能にすることによって、システムが第１のパルス１１２Ａに関連する状態変化を一時的ジャーナル１４１に記録することを完了するとき、データ処理グラフがそのとき実行されていないので、プロセスの状態、メッセージ、又は過渡状態はコンピューティングシステム内に存在しないことが保証される。
【０１３６】
図７Ｄを参照すると、第１のパルス１１２Ａに関するチェックポイントが一時的ジャーナル１４１に記録された状態で、コンピューティングシステム１００が、データの第２のパルス１１２Ｂの処理を始める。そのようにするために、コンピューティングシステム１００は、データストリームの第２のパルス１１２Ｂからデータを摂取し、摂取されたデータを、１又は２以上のデータ処理グラフに従って処理するためにコンピューティングノード１２１に与える。また、リカバリ動作が必要とされる場合に後で取り出すために、第２のパルス１１２Ｂからの摂取されたデータ１１３Ｂのコピーが永続的なデータに記憶される。
【０１３７】
データストリームの第２のパルス１１２Ｂの処理が進むとき、永続的なデータの状態、ストリーミング入力の状態、及びストリーミング出力の状態が変わる。状態変化が起こるときにそれらの状態変化が一時的ジャーナル１４１に記録される第２のパルス１１２Ｂに関するチェックポイント手順が、実行される。図７Ｄに示された時間に、一時的ジャーナル１４１は、第１のパルス１１２Ａに関する記録された状態変化を恒久的ジャーナル１４２に非同期に書き込むことを完了しておらず、したがって、一時的ジャーナル１４１は、第１のパルス１１２Ａと第２のパルス１１２Ｂとの両方に関する記録された状態変化（それらのそれぞれの一意のチェックポイント識別子によってそれぞれが特定される）を含む。一部の例においては、入力データの第１の前のパルスに関連するジャーナルエントリが恒久的にされる前に入力データの第２のパルスに関連するジャーナルエントリが書き込まれることを可能にすることによって、コンピューティングシステムは、チェックポイントレコードが恒久的にされる（これは、ディスクのおよそまるまる１回転待つことを必要とする可能性がある）前にチェックポイント及びひいてはパルスが繰り返し得るので、パルス間隔をディスクの１回転（約１０ｍｓ）未満に縮めることができる。
【０１３８】
出力データの第１のストリーム１３２Ａは、一時的ジャーナル１４１が第１のパルス１１２Ａに関する記録された状態変化を非同期に書き込むことを完了しない限り、第三者預託された状態のままである。
【０１３９】
コンピューティングノード１２１によって生じさせられた出力データの第２のストリーム１３２Ｂは、第２のパルス１１２Ｂが成功裏に処理されるまで出力データの第２のストリーム１３２Ｂが下流のプロセスに提供されないように出力フロー１３１に提供され、さらに第三者預託して保有される（出力データの第１のストリーム１３２Ａの背後に）。
【０１４０】
図７Ｅを参照すると、一時的ジャーナル１４１が恒久的ジャーナル１４２への第１のパルス１１２Ａに関する記録された状態変化の書き込みを完了する（つまり、チェックポイントがコミットされる）とき、スイッチ１３５は閉じられ、出力データの第１のストリーム１３２Ａが下流のプロセスに解放される。恒久的ジャーナル１４２に記憶された第１のパルス１１２Ａに関する記録された状態変化は、第１のパルス１１２Ａの処理の完了時のコンピューティングシステム１００の状態を表し、集合的に第１のチェックポイントと呼ばれる。第１のチェックポイントが恒久的ストレージに書き込まれた状態で、第１のパルス１１２Ａに関連する状態変化は、一時的ジャーナル１４１内にもはや存在しない。
【０１４１】
図７Ｆを参照すると、出力データの第２のストリーム１３２Ｂが第三者預託されたままであるように、スイッチ１３５が再び開けられる。コンピューティングシステム１００は、出力データの第２のストリーム１３２Ｂに追加するために、データの第２のパルス１１２Ｂを摂取し処理し続ける。第１のチェックポイントが恒久的ジャーナル１４２に書き込まれた状態で、一時的ジャーナル１４１は、第２のパルス１１２Ｂに関する記録された状態変化を含む第２のチェックポイントを恒久的ジャーナル１４２に非同期に書き込み始める。
【０１４２】
図７Ｇを参照すると、第２のパルス１１２Ｂの処理中のいずれかの時点で、エラーが発生し、リカバリ手順が実行される。概して、エラーリカバリ手順は、コンピューティングシステムの状態を第１のチェックポイントにおけるそのコンピューティングシステムの状態（つまり、第１のパルス１１２Ａの処理の完了時のそのコンピューティングシステムの状態）に復元する。例えば、リカバリ手順において、永続的なデータの状態、ストリーミング入力の状態、及びストリーミング出力の状態が復元される。これは、出力データ１３２Ｂの第２のストリームを消すことと、第２のパルス１１２Ｂに関する摂取されたデータ１１３Ｂのコピーを第２のパルス１１２Ｂの未処理の部分と組み合わせて元の第２のパルス１１２Ｂを再構築することとを含む。恒久的ジャーナル１４２内の状態情報が、コンピューティングシステム１００の状態（つまり、永続的なデータの状態、ストリーミング入力の状態、及びストリーミング出力の状態）を第１のチェックポイントによって表される状態に復元するために使用される。
【０１４３】
リカバリ手順が完了すると、コンピューティングシステム１００は、エラーがこれまで発生していないかのように第２のパルス１１２Ｂの処理を開始する。
【０１４４】
４．５  分散型ジャーナル
上述のコンピューティングシステムにおいて、状態変化を含むチェックポイントレコードは、単一のグローバルなジャーナルに恒久的に書き込まれる。一部の例においては、単一のグローバルなジャーナルを使用することは、システムのスケーラビリティを制限する可能性がある。図８を参照すると、よりスケーラブルな手法において、コンピューティングシステム１００は、チェックポイントを記憶するために分散型ジャーナルを使用する。例えば、コンピューティングノード１２１の各々は、独自の個々の一時的ジャーナル１４１及び恒久的ジャーナル１４２を保持する。
【０１４５】
一部の例において、コンピューティングノード１２１によって保持される個々のジャーナルは、ジャーナルフラグメントと呼ばれ、各ジャーナルフラグメントは、永続的なデータの異なるフラグメントに対応する。例えば、コンピューティングシステム１００内の各コンピューティングノード１２１が、コンピューティングノード１２１に関連するデータを包含するジャーナルフラグメントに関連付けられる。コンピューティングシステム１００は、データアイテムを変更するときにはいつも、データアイテムに関連するジャーナルフラグメントに（つまり、データアイテムを記憶するコンピューティングノード１２１に関連するジャーナルフラグメントに）ジャーナルエントリを書き込む。
【０１４６】
４．５．１  スナップショット作成
一部の例において、１つの潜在的な問題は、すべてのジャーナルフラグメントの総サイズは、際限なく大きくなり、際限のない量のストレージを消費する可能性があることである。さらに、そのとき、システムがジャーナルフラグメント全体を再現する必要があるので、障害からリカバリするための時間も際限なく大きくなる。この潜在的な問題に対する解決策は、ジャーナルフラグメントに対応するデータの「スナップショットを作成」し、それから、スナップショットプロセスの開始前に作成されたジャーナルフラグメントの部分を破棄することを含む。障害が起こった場合、コンピューティングシステムは、スナップショットをロードし、それから、スナップショットからのデータにジャーナルを適用することによってリカバリすることができる。一部の実施形態において、スナップショットは、特定の特性をデータベースチェックポイントと共有する。
【０１４７】
スナップショットを記憶する１つの手法において、各スナップショットは、関連する開始時間及び関連する終了時間を有する。スナップショット内の永続的なデータの任意の特定の部分の状態は、開始時間と終了時間との間の時間に存在することが知られている。一部の例において、スナップショットは、各スナップショットフラグメントが所与のジャーナルフラグメントに結びつけられるようにしてスナップショットフラグメントとして分散される。概して、システムは、各データフラグメントに関するスナップショットフラグメントを、システムがシャットダウンされるまで繰り返し生じさせる。そのようにするために、各データフラグメントに関して、システムは、スナップショットフラグメントを作成し、そのスナップショットフラグメントを「保留中」としてタグ付けする。一部の例において、スナップショットフラグメントは、複数のサーバにまたがって複製される。そして、コンピューティングシステムは、スナップショットフラグメントの開始時間を、現在処理しているチェックポイントに関する一意のチェックポイント識別子（例えば、チェックポイントカウンタ）の現在の値として設定する。スナップショットが保留状態であり、一意のチェックポイント識別子に関連付けられた状態で、スナップショットは、「開始された」と見なされる。
【０１４８】
そして、データフラグメントに関連する永続的なデータが、スキャンされ、現在のデータ値（つまり、前のスナップショットフラグメント以降にジャーナルにまだ恒久的に書き込まれていないデータ値）が、データフラグメントに関連するスナップショットフラグメントに書き込まれる。一部の例において、スナップショットに書き込まれたそれぞれの現在のデータ値は、現在のデータ値が有効であったタイムスタンプに関連付けられる。システムは、スナップショットフラグメントが恒久的になり、それから、現在のジャーナルフラグメントがコミットするのを待ち、スナップショットフラグメントがコミットされたデータのみを含むことを保証する。そのとき、スナップショットフラグメントは、スナップショットフラグメントの「終わり」と見なされる、一意のチェックポイント識別子の現在の値に設定されたそのスナップショットフラグメントの終了時間を有する。スナップショットフラグメントは、最終として印を付けられ、すべての前のスナップショットフラグメントが、消される。一部の例においては、スナップショットフラグメントの開始前の一意のチェックポイント識別子に関連するすべてのジャーナルエントリが無視されることを保証するためにジャーナルが前方トランケート（forward-truncate）され、結果として、ストレージ空間が再利用される。
【０１４９】
コンピューティングシステム１００において障害が起こると、システムは、ジャーナルフラグメントに関連する恒久的なストレージを、スナップショットの「終わり」以上のいずれかのコミットされたチェックポイントに復元することができる。一部の例において、システム１００は、最初にスナップショットフラグメントの内容を恒久的なストレージにロードすることによってそのようにする。そのとき、システム１００は、スナップショットフラグメント内のデータアイテム及びそれらの関連するタイムスタンプを、タイムスタンプの時点で有効であったデータアイテムのバージョンに対応するジャーナルフラグメント内の特定されたエントリまで調べる。そして、システム１００は、所望のチェックポイントマーカが見つかるまで、スナップショットフラグメントにまだ反映されていないジャーナルフラグメントからの任意の更新をやり直すことによってスナップショットフラグメントからのデータアイテムの値をロールフォワードすることにより、恒久的なストレージをコミットされたチェックポイントに復元する（ロールフォワードは、ジャーナルフラグメント内の特定されたエントリから始まる）。ジャーナルフラグメントに関連する恒久的なストレージが障害を切り抜ける場合、システムは、ジャーナルフラグメントをスナップショットフラグメント内の値から始まって逆順にスキャンし、恒久的なストレージが所望のチェックポイントに関連する状態になるまですべての変更を元に戻すことによって、スナップショットの「終わり」以上の任意の所望のチェックポイントまでその恒久的なストレージをロールバックすることができる。
【０１５０】
一部の例において、ジャーナルフラグメントは、各チェックポイントに関してはっきりと異なるファイルとして形成される。システムは、より古いチェックポイントに関するファイルを削除することによってジャーナルを前方トランケートすることができる。一部の例において、コンピューティングシステム１００は、複数のチェックポイントを単一のファイルにまとめる。したがって、各ファイルは、ある範囲のチェックポイントを含む。システムは、ジャーナルを前方トランケートするとき、トランケートの時点の前の最も高いチェックポイントによるファイルを削除する。リカバリ時に、システムは、トランケートの時点の前のすべてのジャーナルエントリを無視する。このプロセスは、所与のファイル内の各チェックポイントレコードのファイルオフセット（file-offset）を補助ファイルに記録することによって迅速化され得る。
【０１５１】
上のジャーナルの構造を前提として、コンピューティングシステムは、コンピューティングシステム内のすべての処理をまず停止することによって最も最近コミットされたチェックポイントをリカバリすることができる。それぞれの障害が起こったコンピューティングノードに関しては、新しいコンピューティングノードが（おそらくは異なる物理ノード上で）開始される。コンピューティングノードに関連するジャーナルフラグメント及びスナップショットフラグメントの少なくとも１つの複製が位置を特定され、（上述のように）コミットされたチェックポイントまで復元するために使用される。すべての生き残ったコンピューティングノードは、それらのコンピューティングノードの永続的なデータをコミットされたチェックポイントまでロールバックさせ、第三者預託されたデータが、消される。コンピューティングシステムへの入力データは、前のパルス終了インジケータまでロールバックされ、処理が再開される。
【０１５２】
上のリカバリ手順に基づいて、システムは、処理を再開する前に、すべての永続的なデータを作業の最も最近コミットされた単位の時点のそのシステムの状態に復元し、それから、作業の後続の単位による処理を再始動済みである。
【０１５３】
リカバリ可能な処理技術のさまざまなその他の例が、米国特許第６，５８４，５８１号明細書及び米国特許第９，３５４，９８１号明細書に記載の技術を含め、本明細書に記載の技術と組み合わせて使用される可能性があり、それらの明細書の各々は、参照により本明細書に組み込まれる。
【０１５４】
４．６  複製
上述の手法は、リカバリ可能性を提供するが、高い可用性又は耐障害性を必ずしも提供しない。例えば、障害の後、システムは、スナップショットから任意の障害が発生したサーバに関連する永続的なデータを再ロードし、それから、所望のチェックポイントまですべての変更を再適用する必要があり、これは数時間かかる可能性があり、その間、システムは利用できない。
【０１５５】
一部の例においては、障害がすべての複製を破壊する可能性が低いように（例えば、データベース共有又はパーティショニング技術を使用して）永続的なデータを複製することによって、高い可用性及び耐障害性が実現される。例えば、単一のクラッシュがすべての複製を破壊し得ないように、各データが異なる物理ノード上に複製される可能性がある。そのようにすることは、例えば、複製が異なる電源を用いるノードに又は異なるデータセンターにさえもあることを保証することによってより高い度合いの耐性をもたらす。場合によっては、複製の手法は、チェックポイント及びスナップショットデータを恒久的に記憶する必要もなくす。
【０１５６】
１つの手法において、データアイテムのマスタ複製及びデータアイテムの１又は２以上のバックアップ複製が存在するように、永続的なデータの各データアイテム（例えば、トランザクションデータストアのテーブルの行、共有データインスタンス）が複製される。この手法を実施するために、チェックポイントカウンタが、始めに０に初期化される。それから、コンピューティングシステム内で動作するすべてのグラフが、開始される。永続的なデータ内のデータアイテムが変更される度に、チェックポイントカウンタによってタグ付けされた複製メッセージが、そのデータアイテムの複製に非同期に送信される。コンピューティングシステムによって生じさせられたすべての出力データは、第三者預託されたまま保たれ、チェックポイントカウンタによってタグ付けされ、直ちに見えるようにされない。
【０１５７】
結局、パルス終了インジケータがすべてのストリーミング入力に関して受け取られ、コンピューティングシステムにおいて実行されるグラフのすべてのきれいなシャットダウンを引き起こす。グラフのすべてが終了すると、チェックポイントカウンタがインクリメントされる。それから、コンピューティングシステム内のグラフのすべてが、再始動される。
【０１５８】
所与のチェックポイントに関するすべての複製メッセージが受け取られると、チェックポイントがコミットされ、そのチェックポイントカウンタ値によってタグ付けされた出力データが、第三者預託から解放される。したがって、この方式において、複製は、ジャーナル作成をまったく完全に置き換える。
【０１５９】
上述の複製方式を使用するときに障害からリカバリするためには、まず、すべての処理が停止される。コンピューティングノードの障害において失われたすべてのマスタ複製に関して、マスタ複製として働くようにバックアップ複製のうちの１つを選択されたい。そして、各複製に関して、複製の状態が、その複製の最後にコミットされたチェックポイントにリカバリされる。すべての第三者預託された出力データが、消され、すべての入力データが、最後のパルス終了インジケータが挿入された時点まで復元される。それから、上述の方法を使用して処理が再開される。
【０１６０】
一部の例において、マスタ複製は、始めに、組内の少なくとも１つのサーバが障害を切り抜ける可能性が高いようなサーバのリストを生成するためにハッシュされ得る主キーをあらゆるデータアイテムに含めることによって選択される。リスト内の第１のサーバが、マスタ複製として選択される。すべてのその他のサーバは、スレーブ(slaves)である。コンピューティングノードに障害が発生する場合、システムは、そのコンピューティングノードにもはや動作可能でないものとして印を付ける。コンピューティングノードが復元される場合、システムは、そのコンピューティングノードに動作可能であるものとしてもう一度印を付ける。
【０１６１】
一部の例において、本明細書に記載の複製技術の重要な要件は、障害が発生し、リカバリ動作が必要であるときに、複製をコミットされたチェックポイントまでロールバックすることができることである。この要件を満たす１つの複製技術は、以下のアルゴリズムに従って動作する。システムは、データアイテムを変更するとき、データアイテムのための新しい値に関する複製メッセージを送信する。コンピューティングノードは、複製メッセージを受け取るとき、その複製メッセージをキューにいれ、その複製メッセージを目標の複製に非同期に適用する。一部の例において、システムは、データアイテムに複製メッセージを適用するとき、そのシステムが変更を元に戻すことを可能にするロールバックエントリを作成する。ロールバックエントリは、障害の後のロールバック処理のために使用される。一部の例においては、ロールバックエントリが、関連する一意のチェックポイント識別子によってタグ付けされる。代替的に、システムは、データアイテムの複数のバージョンをメモリ内に保つ。
【０１６２】
障害の後、それぞれの生き残ったサーバは、チェックポイントの状態に復元するために以下の手順を実行する。まず、リカバリ点の後の一意のチェックポイント識別子によってタグ付けされていないすべての未処理の複製メッセージが、処理される。それから、リカバー点の後のチェックポイント生成によってタグ付けされるすべてのロールバックエントリが、受け取りの逆順に適用される。すべてのロールバックエントリを適用した後、すべてのデータは、所望のリカバリ点に対応する状態にある。作業の量は、ロールバックされる必要がある任意の生成中に変更されたデータの量に比例し、したがって、システムが１秒未満の摂取パルスを有する場合、システムが１秒未満のリカバリを実現し得ることはまったく妥当である。
【０１６３】
結局、障害が発生したサーバが、サービスを行うように復元される（又は、代わりのサーバが、オンラインにされる）。そして、複製システムは、障害が発生したサーバにデータを複製し直し、おそらくは、そのサーバ上の一部の又はすべてのデータの「マスタ」ステータスを復元する。
【０１６４】
４．７  組み合わされた複製及びジャーナル作成
いくつかの手法においては、複製とジャーナル作成との両方が、コンピューティングシステムにおいて使用される。例えば、複製は、高い可用性及び耐障害性を実現するために使用されるが、余りにも多くのサーバ（例えば、データセンター全体に対する電力又は冷却の喪失が原因でそれらのサーバのすべて）の同時障害がリカバリの可能性なしにデータを永久的に損なう壊滅的な障害の形態に悩まされる。ジャーナル作成は、ディスクドライブなどの非常に恒久的なストレージにリカバリ情報を記憶することによってそのような障害から守るために、複製に加えて使用される。この手法において、ジャーナルの使用は、かなりの動作不能時間を伴う可能性が高い災害復旧の形態である。
【０１６５】
一例において、組み合わされた複製及びジャーナル作成が、ジャーナル後複製手順（journal then replicate procedure）において実行される。例えば、コンピューティングシステムは、データアイテムに対する変更が行われる地点で（つまり、マスタ複製において）それらの変更のジャーナルを作成し、それから、ジャーナルを複数のデバイスに複製する。この種の手法は、ファイルに書き込まれたすべてのものを複製するために構成されるＨＤＦＳ（ＨＤＦＳ，Hadoop File System）と共に使用され得る。一部の例において、この手法の不都合な点は、あらゆるデータアイテムの更新がネットワークトラフィックの２つの波、すなわち、データを複製するための１つの波及びジャーナルを複製するための１つの波をもたらすことである。別の例においては、組み合わされたジャーナル作成及び複製が、複製後ジャーナル手順（replicate then journal procedure）において実行される。例えば、より旧来型のファイルシステム上で、コンピューティングシステムは、変更が行われる地点で、及び複製の地点で遠隔で変更のジャーナルを作成する可能性がある。これは、ジャーナルが複製と同じ場所に置かれるので、システムがデータを複製するときにネットワークトラフィックの１つの波しか含まない。上述の２つの組み合わされたジャーナル作成及び複製の例は、ネットワークトラフィックの違いを除いて本質的に等価である。
【０１６６】
ディスクへの書き込みにかかるレイテンシーが原因で、コンピューティングシステムは、結局、所与のチェックポイントに関する２つのレベルの恒久性、すなわち、複製レベルの恒久性及びジャーナルレベルの恒久性に行き着く。複製レベルの恒久性は、壊滅的な複数ノードの障害に対する保障がない。区別は、システムが第三者預託からデータを解放する地点に影響を与える可能性がある。システムが複製レベルの恒久性を有する地点でシステムが第三者預託から外に出て行くデータを解放する場合、システムは、レイテンシーを削減し、パルスの頻度を上げることができる。そのようにすることの不都合な点は、壊滅的な障害の後、その他のアプリケーションがロールバックされるデータを「見た」可能性があることである。壊滅的な障害はめったにない（と見込まれる）ことを考えると、これは、妥当なトレードオフである可能性がある。しかし、保守的な選択は、ジャーナルレベルの恒久性を待つことである。
【０１６７】
４．８  トランザクションデータストアとのインタラクション
図９Ａを参照すると、一部の例において、２又は３以上のコンピューティングシステム１００は、上述のジャーナル作成技術を採用し、かつ、トランザクションデータストア１５１とインタラクションする。トランザクションデータストア１５１は、トランザクションの原子性、一貫性、独立性、及び恒久性（ＡＣＩＤ，atomicity, consistency, isolation, and durability）特性を独立して保証する。一部の例において、トランザクションデータストア１５１のこの特性は、たとえトランザクションデータストアのトランザクションが一部となっていたチェックポイントが障害によりロールバックされたとしてもそのトランザクションデータストアのトランザクションを恒久的にする可能性があるので、その特性は、チェックポイントメカニズムをだめにする潜在性を持っている。
【０１６８】
この問題に対処するために、トランザクションデータストア１５１のコミットプロトコルが、「ＡＣＩ」を「Ｄ」と分けるように修正される。つまり、トランザクションデータストアのトランザクションは、コミットするとき、原子性、一貫性、及び独立性を保証するが、恒久性は保証しない。修正されたコミットプロトコルにおいて、恒久性は、チェックポイントがコミットし、恒久的になるときに発生する。一部のコンピューティングシステムにおいて、この分離は禁止されるが、チェックポイントがコミットすることができない場合、トランザクションデータストアのコミットのすべての証拠がロールバック中に消去されるので、本明細書において説明されるコンピューティングシステムにおいては許容される。特に、そのコンピューティングシステムが参加したすべての応答が、第三者預託して保有され、ロールバック中に破棄されることになっているであろう。
【０１６９】
図９Ａにおいて、第１のデータパルス１１２Ａに関連するトランザクションデータストアのトランザクションは、トランザクションデータストア１５１にまだコミットされておらず、第１のデータパルス１１２Ａに関連するチェックポイントがまだ恒久的でないので、第１のデータパルス１１２Ａから生成された出力データのストリーム１３２Ａが、第三者預託して保有される。図９Ｂを参照すると、第１のデータパルス１１２Ａに関連するチェックポイントが恒久的にされると、第１のデータパルス１１２Ａに関連するトランザクションデータストアのトランザクションが、トランザクションデータストア１５１にコミットされ、出力データのストリーム１３２Ａが、第三者預託から解放される。
【０１７０】
４．９  チェックポイントのトリガ
上述の例において、チェックポイントのトリガは、時間に基づく（例えば、チェックポイントは、周期的にトリガされる）。しかし、チェックポイントのトリガは、必ずしも時間に基づかなくてよい。一部の例において、チェックポイントは、リソースの制約に基づいてトリガされる。例えば、キューイングシステムは、限られた数のレコードのみが、受け取られたメッセージがコミットされる前に受け取られることを可能にする可能性がある。この場合、したがって、システムは、規定された可能性があるいかなるパルス間隔とも無関係に、この限界が達せられるか又はかなり接近されるとき、チェックポイントをトリガしなければならない。
【０１７１】
４．１０  チェックポイントを作成されないアプリケーション及びデータとのインタラクション
すべてのアプリケーションが、上述のチェックポイントアルゴリズムの下で動作することができる又は動作しなければならないわけではない。例えば、一部のアプリケーションは、余りにも粗い時間的粒度で動作する（例えば、数時間動作するバッチグラフ）。その他のアプリケーションは、余りにも細かい時間的粒度で動作する可能性がある（例えば、チェックポイント間隔よりも短い必要とされる応答時間を有するサービス）。一部の例において、本明細書において説明される手法は、チェックポイントを作成されないアプリケーション及びデータとインタラクションするために「チェックポイントグループ」の概念を使用する。
【０１７２】
４．１０．１  チェックポイントグループ
極めて広く言って、チェックポイントグループは、同じパルススケジュールでチェックポイントを作成される永続的なデータ及び関連するグラフの組である。システムは、異なるアプリケーションが異なる時間／スループットのトレードオフを有する場合、複数のチェックポイントグループを含み得る。例えば、システムは、効率のために比較的大きな（例えば、１００ミリ秒の）チェックポイント間隔を必要とする大量の到着するデータ（例えば、サーバクラスタの１００個のコアによって処理される１億レコード／秒）を伴う１つのチェックポイントグループと、応答時間を最適化するために選択された１０ミリ秒のチェックポイントを用いるより少ない量の到着するデータを伴う別のチェックポイントグループとを有する可能性がある。１秒に近づくチェックポイント間隔は、一部のアプリケーションのための十分に短い応答レイテンシーを提供しない可能性がある。
【０１７３】
一部の例において、チェックポイントグループは、データ処理グラフ内の宣言構成要素（declaration component）を使用して構成され得る。この構成要素は、グループに参加する必要があるすべてのグラフに含まれる可能性がある。加えて、この構成要素は、グループ内で管理される必要がある任意の共有データ又はトランザクションデータストアのテーブルの宣言内で参照される。所与のデータセットは、多くても単一のチェックポイントグループによって「所有」される可能性があり、その理由は、それが、そのチェックポイント間隔を決定するものであるからである。一部の例において、チェックポイントグループの宣言は、所望の複製方式、チェックポイント及びジャーナルが保たれ得るデータディレクトリ、パルスの頻度などの追加的な情報を含む。
【０１７４】
すべてのデータ及びすべてのグラフが、チェックポイントグループ内にあるとはかぎらない。例えば、トランザクションデータストアのテーブルは、主として、ストリーミング摂取グラフよりもトランザクションサービスによって使用される可能性がある。Ｃａｓｓａｎｄｒａ及びＯｒａｃｌｅなどのサードパーティの永続的なストアに記憶されたデータは、必ずチェックポイントグループの外にあることになる。
【０１７５】
４．１０．２  内部及び外部アクセス
これに関連して、タスクの２つのクラス（内部及び外部）並びにデータの２つのクラス（内部及び外部）が存在し、「内部」とはチェックポイントグループによって管理されることを意味し、「外部」とはチェックポイントグループによって管理されないことを意味する。複数のチェックポイントグループが存在する場合、それらのチェックポイントグループの各々は、それ以外のチェックポイントグループを「外部」と見なす。内部と外部との間のすべてのアクセスは、「対外的（foreign）」と見なされる。概して、対外的アクセスの４つの場合、すなわち、内部タスクが外部データを読む場合、内部タスクが外部データを書き込む場合、外部タスクが内部データを読む場合、及び外部タスクが内部データを書き込む場合がある。これらの各々は、正確さに関して関連する問題を有する。
【０１７６】
４．１０．２．１  内部タスクが外部データを読む
チェックポイントグループ内のタスクは、正確さにいかなる影響も与えずにチェックポイントグループ外のデータを読む可能性がある。例えば、内部タスクがＣａｓｓａｎｄｒａからデータを読み、障害があり、チェックポイントがロールバックされ、タスクが再始動され、タスクが再始動後にＣａｓｓａｎｄｒａからデータを読み、異なる答えを得る状況を考える。
【０１７７】
一見すると、システムは、第２の読み取りで異なる答えを得たので不整合に晒されているように見える可能性がある。しかし、第１の読み取りのすべての証拠がロールバックによって消去されたので、不整合は存在しない。これは、丁度、アプリケーションがしばらくスリープし、それから、スリープから覚め、Ｃａｓｓａｎｄｒａから「第２の」答えを得たかのようである。したがって、システムは、リカバリ可能性の定義を確かに満たす。
【０１７８】
４．１０．２．２  内部タスクが外部データを書き込む
チェックポイントグループ内のタスクがそのチェックポイントグループ外にデータを書き込む場合、システムは、おそらく、２つの方法のうちの１つでリカバリ可能性を妨害する可能性がある。第１に、書き込みは恒久的になり得るが、更新をしたタスクがロールバックされる。これは、重複した更新を生じる結果となる可能性があり、したがって、それらの更新は、誤っている。これは、慎重なアプリケーションの設計によってのみ対処され得る。第２に、書き込みは、更新が恒久的になるのを書き込み側が待たない（又は待てない）場合、失われる可能性がある。したがって、例えば、内部タスクが、Ｃａｓｓａｎｄｒａを更新し、それから、ロールバックされる可能性があり、Ｃａｓｓａｎｄｒａの更新が、恒久的になる可能性がある。慎重なアプリケーションの設計は、そのような不測の事態を避けることを求められる。
【０１７９】
４．１０．２．３  外部タスクが内部データを読む
チェックポイントグループ外のタスクが内部のデータを読む場合、システムは、障害後にロールバックされる可能性があるデータの「ダーティリード」を行う危険を冒す。以下は、この問題を解決するための２つの方法の例である。第１に、システムが、楽観的にダーティリードを実行する可能性がある。例えば、アドホッククエリが、メモリ内のデータに対して実行され、ダーティリードの影響がいずれかの検出可能な結果を生じることは、極めて疑わしい。加えて、データベーストランザクションが処理の正常な過程でロールバックされる一方で、チェックポイントグループのロールバックが大きな障害の後にのみ行われ、処理の正常な過程では行われないので、チェックポイントグループ内のダーティリードは、データベースに対してよりもずっと安全である。これは、ダーティリードがともかくいずれかの影響をもたらすことが極めてまれになることを意味する。
【０１８０】
第２に、システムは、読み取りをチェックポイントグループにプッシュする可能性がある。この形態において、システムは、チェックポイントグループ内で実行されるサービスにＳＶ  ａｐｐｌｙ又はトランザクションデータストアのトランザクションを送信し、答えは、次のチェックポイントまで第三者預託して保有される。この動作は、レイテンシーを招くが、ダーティリードをクリーンな読み取りに変換する。また、この動作は、ユーザがリード−プッシュ（read-push）に気がつかないように完全にサーバソフトウェア内で処理され得る。
【０１８１】
第２の手法は、データが第三者預託から解放されるまで読み取り側のチェックポイントグループがチェックポイントを作成し得ない（すべてのタスクが終了するまでシステムがチェックポイントを行わない）ので、あるチェックポイントグループが別のチェックポイントグループ内のデータにアクセスすることを可能にするために使用され得ないことに留意されたい。これは、潜在的に、チェックポイントグループＡ内のタスクがチェックポイントグループＢからの読み取りに対する答えが返るのを待っており、したがって、グループＡがチェックポイントを作成し得ないデッドロックにつながる可能性がある。同時に、チェックポイントグループＢ内のタスクは、まったく同じことをしている。どちらのグループも、いつまでも休止になることができず、どちらのグループも、いつまでもチェックポイントを作成することができない。
【０１８２】
４．１０．２．４  外部タスクが内部データを書き込む
チェックポイントグループ外のタスクが内部にデータを書き込む場合、システムは、チェックポイントがロールバックされる場合、書き込みを喪失する危険を冒す。やはり、同じトレードオフが存在し、つまり、システムは、更新を喪失する可能性が小さいことを期待して任意の方法でそのような危険を冒す可能性があり、又はシステムは、書き込みを上述のようにチェックポイントグループにプッシュする可能性がある。そして、書き込みは、書き込み動作の確定を示す第三者預託された答えを待つ。その他の点で、問題は、上述の問題と同じである。
【０１８３】
なお、これは、チェックポイントグループ内のアプリケーションの正確さに影響を与えない。論理は、内部が外部を読む場合と同じであり、つまり、外部タスクが内部データを書き込み、システムが障害に遭い、外部タスクによる書き込みをロールバックするロールバックを行い、システムが再始動し、内部から、システムが外部タスクがこれまでに発生したことを伝える方法を持たず、したがって、システムが一貫した状態にある。外部のエンティティは、一貫性の障害を持つことになるが、それは、内部タスクの正確さに影響を与えない。
【０１８４】
まとめると、対外的アクセスは、（いつもではないが）ときどき、不整合の可能性を招く。内部が外部を読むことは、常に一貫性がある。内部が外部に書き込むことは、書き込み側を重複した及び／又は喪失した書き込みに晒す。外部が内部を読むことは、ダーティリードをもたらすが、これは、読み取りをチェックポイントグループにプッシュすることによって直され得る。外部が内部に書き込むことは、喪失した書き込みをもたらす可能性があるが、これは、書き込みをチェックポイントグループにプッシュすることによって直され得る。
【０１８５】
ダーティリード及び喪失した書き込みは、障害モードオンリーフォールト（failure-mode-only fault）である。システムは、システムがサーバ障害に遭うまでグループレベルのロールバックを実行せず、したがって、これらの故障は、障害の後にのみ現れる。通常動作において、対外的読み取り／書き込みは、まったく安全である。
【０１８６】
システムは、２つのグループの間のインタラクションがデッドロックにつながる可能性があるので、異なるチェックポイントグループの間で「読み取り／書き込みのプッシュ」の方策を使用しない可能性がある。必要な場合、これは、非同期動作を打ち出すこと、例えば、メッセージをキューに並べ、答えを待たないことによって直され得る。しかし、システムは、システムが（非常にまれな）ダーティリード又は喪失した書き込みを受け入れることができる限り、異なるチェックポイントグループ内のデータを引き続き読む／書き込むことができる。
【０１８７】
５  実施形態
（添付の付録を含む）本明細書において説明されたリカバリ可能性の技術は、例えば、好適なソフトウェア命令を実行するプログラミング可能なコンピューティングシステムを用いて実装される可能性があり、又はフィールドプログラマブルゲートアレイ（ＦＰＧＡ，field-programmable gate array）などの好適なハードウェアで、若しくは何らかの混成の形態で実装される可能性がある。例えば、プログラミングされる手法において、ソフトウェアは、それぞれが少なくとも１つのプロセッサ、（揮発性及び／又は不揮発性メモリ及び／又はストレージ要素を含む）少なくとも１つのデータストレージシステム、（少なくとも１つの入力デバイス又はポートを用いて入力を受け取るため、及び少なくとも１つの出力デバイス又はポートを用いて出力を与えるための）少なくとも１つのユーザインターフェースを含む（分散、クライアント／サーバ、又はグリッドなどのさまざまなアーキテクチャである可能性がある）１又は２以上のプログラミングされた又はプログラミング可能なコンピューティングシステム上で実行される１又は２以上のコンピュータプログラムのプロシージャを含み得る。ソフトウェアは、例えば、データ処理グラフの設計、構成、及び実行に関連するサービスを提供するより大きなプログラムの１又は２以上のモジュールを含む可能性がある。プログラムのモジュール（例えば、データ処理グラフの要素）は、データリポジトリに記憶されたデータモデルに準拠するデータ構造又はその他の編成されたデータとして実装され得る。
【０１８８】
ソフトウェアは、ある時間の期間（例えば、ダイナミックＲＡＭなどのダイナミックメモリデバイスのリフレッシュ周期の間の時間）媒体の物理特性（例えば、表面ピット及びランド、磁区、又は電荷）を使用して、揮発性若しくは不揮発性ストレージ媒体又は任意のその他の非一時的媒体に具現化されるなど、非一時的形態で記憶され得る。命令をロードするのに備えて、ソフトウェアは、ＣＤ−ＲＯＭ又は（例えば、多目的若しくは専用のコンピューティングシステム若しくはデバイスによって読み取り可能な）その他のコンピュータ可読媒体などの有形の非一時的媒体上に提供される可能性があり、或いはそのソフトウェアが実行されるコンピューティングシステムの有形の非一時的媒体にネットワークの通信媒体を介して配信される（例えば、伝播信号に符号化される）可能性がある。処理の一部又はすべては、専用のコンピュータ上で、又はコプロセッサ若しくはフィールドプログラマブルゲートアレイ（ＦＰＧＡ）若しくは専用の特定用途向け集積回路（ＡＳＩＣ，application-specific integrated circuit）などの専用のハードウェアを使用して実行される可能性がある。処理は、ソフトウェアによって規定された計算の異なる部分が異なるコンピューティング要素によって実行される分散された方法で実施される可能性がある。それぞれのそのようなコンピュータプログラムは、本明細書において説明された処理を実行するためにストレージデバイスの媒体がコンピュータによって読み取られるときにコンピュータを構成し、動作させるために、多目的又は専用のプログラミング可能なコンピュータによってアクセスされ得るストレージデバイスのコンピュータ可読ストレージ媒体（例えば、ソリッドステートメモリ若しくは媒体、又は磁気式若しくは光学式媒体）に記憶されるか又はダウンロードされることが好ましい。本発明のシステムは、コンピュータプログラムによって構成された有形の非一時的媒体として実装されると考えられる可能性もあり、そのように構成された媒体は、本明細書において説明された処理ステップのうちの１又は２以上を実行するために特定の予め定義された方法でコンピュータを動作させる。
【０１８９】
本発明のいくつかの実施形態が、説明された。しかしながら、上述の説明は、添付の請求項の範囲によって画定される本発明の範囲を例示するように意図されており、限定するように意図されていないことを理解されたい。したがって、その他の実施形態も、添付の請求項の範囲内にある。例えば、本発明の範囲を逸脱することなくさまざまな修正がなされ得る。さらに、上述のステップの一部は、順序に依存しない可能性があり、したがって、説明された順序とは異なる順序で実行される可能性がある。
【図１】
2019505916.tif 000003
【図２Ａ】
2019505916.tif 000004
【図２Ｂ】
2019505916.tif 000005
【図２Ｃ】
2019505916.tif 000006
【図３】
2019505916.tif 000007
【図４】
2019505916.tif 000008
【図５】
2019505916.tif 000009
【図６】
2019505916.tif 000010
【図７Ａ】
2019505916.tif 000011
【図７Ｂ】
2019505916.tif 000012
【図７Ｃ】
2019505916.tif 000013
【図７Ｄ】
2019505916.tif 000014
【図７Ｅ】
2019505916.tif 000015
【図７Ｆ】
2019505916.tif 000016
【図７Ｇ】
2019505916.tif 000017
【図８】
2019505916.tif 000018
【図９Ａ】
2019505916.tif 000019
【図９Ｂ】
2019505916.tif 000020
【国際調査報告】
2019505916.tif 000021
2019505916.tif 000022
2019505916.tif 000023