(57)【特許請求の範囲】
【請求項１】
複数のイベントを有するデータストリームを処理する複数のクエリの部分集合を含む分散グループを、複数のノードに配備するプログラムであって、前記イベントは１つ以上のプロパティを含み、
前記データストリーム、及び／又は、前記複数のクエリの各々の定義から、前記複数のクエリの各々の入力イベント及び出力イベントに含まれる複数のプロパティの間の関係を抽出し、
クエリの定義に記された分散キーと、前記複数のプロパティの間の関係と、前記関係の確率とに基づいて、前記分散グループに含まれる前記複数のクエリの部分集合に共通に利用し得る共通分散キーを特定し、
前記特定された共通分散キーに基づいて、並列分散されたノードの各々に、前記分散グループに所属するべき前記複数のクエリの部分集合を配備する、
処理をコンピュータに実行させるデータストリーム処理の並列化プログラム。
【請求項２】
前記複数のプロパティの間の関係を抽出する処理は、
第1のクエリに入力される複数の入力イベントを保存し、
前記保存された複数の入力イベントに含まれる複数のプロパティの間のうち所定の第１の２つのプロパティが、１対Ｎ又は１対１［Ｎは整数］となる関係の確率が、所定の第１の閾値を超える場合、前記所定の第１の２つのプロパティを特定する処理、を含み、
前記共通分散キーを特定する処理は、前記特定された所定の第１の２つのプロパティ及び前記特定された所定の第１の２つのプロパティの間の関係の確率を、前記共通分散キーを特定するために用いる、
請求項１記載のデータストリーム処理の並列化プログラム。
【請求項３】
前記複数のプロパティの間の関係を抽出する処理は、
第２のクエリが、分散キーを関数として定義している場合、前記関数と、前記関数に関連する複数のプロパティとを特定する処理を含み、
前記共通分散キーを特定する処理は、前記関数と、前記関数に関連する複数のプロパティとを、前記共通分散キーを特定するために用いる、
請求項１又は２記載のデータストリーム処理の並列化プログラム。
【請求項４】
前記共通分散キーを特定する処理は、
第１のクエリが定義する第１の関数が第１の周期長を持ち、前記第１のクエリに後続する第２のクエリが定義する第２の関数が第２の周期長を持つ場合であって、前記第１の周期長及び前記第２の周期長の最小公倍数を持つ第３の関数を共通分散キーとして、前記第１のクエリと前記第２のクエリとを同一の分散グループに所属させた場合、前記分散グループに並列配備された複数のノードに入力されるデータストリームの全イベント数に対する、前記複数のノードの間をまたがって通信されるイベント数の割合が、第２の閾値以下となる、前記第３の関数を生成する処理を含み、
前記共通分散キーを特定する処理は、前記第３の関数を、前記共通分散キーを特定するために用いる、
請求項３記載のデータストリーム処理の並列化プログラム。
【請求項５】
複数のイベントを有するデータストリームを処理する複数のクエリの部分集合を含む分散グループを、複数のノードに配備する方法であって、前記イベントは１つ以上のプロパティを含み、
コンピュータが、
前記データストリーム、及び／又は、前記複数のクエリの各々の定義から、前記複数のクエリの各々の入力イベント及び出力イベントに含まれる複数のプロパティの間の関係を抽出する処理と、
クエリの定義に記された分散キーと、前記複数のプロパティの間の関係と、前記関係の確率とに基づいて、前記分散グループに含まれる前記複数のクエリの部分集合に共通に利用し得る共通分散キーを特定する処理と、
前記特定された共通分散キーに基づいて、並列分散されたノードの各々に、前記分散グループに所属するべき前記複数のクエリの部分集合を配備する処理と、
を実行するデータストリーム処理の並列化方法。
【請求項６】
前記複数のプロパティの間の関係を抽出する処理は、
第1のクエリに入力される複数の入力イベントを保存する処理と、
前記保存された複数の入力イベントに含まれる複数のプロパティの間のうち所定の第１の２つのプロパティが、１対Ｎ又は１対１［Ｎは整数］となる関係の確率が、所定の第１の閾値を超える場合、前記所定の第１の２つのプロパティを特定する処理と、を含み、
前記共通分散キーを特定する処理は、前記特定された所定の第１の２つのプロパティ及び前記特定された所定の第１の２つのプロパティの間の関係の確率を、前記共通分散キーを特定するために用いる、
請求項５記載のデータストリーム処理の並列化方法。
【請求項７】
前記複数のプロパティの間の関係を抽出する処理は、
第２のクエリが、分散キーを関数として定義している場合、前記関数と、前記関数に関連する複数のプロパティとを特定する処理を含み、
前記共通分散キーを特定する処理は、前記関数と、前記関数に関連する複数のプロパティとを、前記共通分散キーを特定するために用いる、
請求項５又は６記載のデータストリーム処理の並列化方法。
【請求項８】
前記共通分散キーを特定する処理は、
第１のクエリが定義する第１の関数が第１の周期長を持ち、前記第１のクエリに後続する第２のクエリが定義する第２の関数が第２の周期長を持つ場合であって、前記第１の周期長及び前記第２の周期長の最小公倍数を持つ第３の関数を共通分散キーとして、前記第１のクエリと前記第２のクエリとを同一の分散グループに所属させた場合、前記分散グループに並列配備された複数のノードに入力されるデータストリームの全イベント数に対する、前記複数のノードの間をまたがって通信されるイベント数の割合が、第２の閾値以下となる、前記第３の関数を生成する処理を含み、
前記共通分散キーを特定する処理は、前記第３の関数を、前記共通分散キーを特定するために用いる、
請求項７記載のデータストリーム処理の並列化方法。
【請求項９】
複数のイベントを有するデータストリームを処理する複数のクエリの部分集合を含む分散グループを、複数のノードに配備するシステムであって、前記イベントは１つ以上のプロパティを含み、
前記データストリーム、及び／又は、前記複数のクエリの各々の定義から、前記複数のクエリの各々の入力イベント及び出力イベントに含まれる複数のプロパティの間の関係を抽出する、プロパティ関係抽出部と、
クエリの定義に記された分散キーと、前記複数のプロパティの間の関係と、前記関係の確率とに基づいて、前記分散グループに含まれる前記複数のクエリの部分集合に共通に利用し得る共通分散キーを特定する、共通分散キー特定部と、
前記特定された共通分散キーに基づいて、並列分散されたノードの各々に、前記分散グループに所属するべき前記複数のクエリの部分集合を配備する、クエリ配備部と、
を有するデータストリーム処理の並列化システム。
【請求項１０】
前記プロパティ関係抽出部は、
第1のクエリに入力される複数の入力イベントを保存する入力イベント保存部と、
前記保存された複数の入力イベントに含まれる複数のプロパティの間のうち所定の第１の２つのプロパティが、１対Ｎ又は１対１［Ｎは整数］となる関係の確率が、所定の第１の閾値を超える場合、前記所定の第１の２つのプロパティを特定する、関係特定部と、を含み、
前記共通分散キー特定部は、前記特定された所定の第１の２つのプロパティ及び前記特定された所定の第１の２つのプロパティの間の関係の確率を、前記共通分散キーを特定するために用いる、
請求項９記載のデータストリーム処理の並列化システム。
【請求項１１】
前記プロパティ関係抽出部は、
第２のクエリが、分散キーを関数として定義している場合、前記関数と、前記関数に関連する複数のプロパティとを特定する、関数特定部、を含み、
前記共通分散キー特定部は、前記関数と、前記関数に関連する複数のプロパティとを、前記共通分散キーを特定するために用いる、
請求項９又は１０記載のデータストリーム処理の並列化システム。
【請求項１２】
前記共通分散キー特定部は、
第１のクエリが定義する第１の関数が第１の周期長を持ち、前記第１のクエリに後続する第２のクエリが定義する第２の関数が第２の周期長を持つ場合であって、前記第１の周期長及び前記第２の周期長の最小公倍数を持つ第３の関数を共通分散キーとして、前記第１のクエリと前記第２のクエリとを同一の分散グループに所属させた場合、前記分散グループに並列配備された複数のノードに入力されるデータストリームの全イベント数に対する、前記複数のノードの間をまたがって通信されるイベント数の割合が、第２の閾値以下となる、前記第３の関数を生成する、第３の関数生成部、を含み、
前記共通分散キー特定部は、前記第３の関数を、前記共通分散キーを特定するために用いる、
請求項１１記載のデータストリーム処理の並列化システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データストリーム処理の並列化プログラム、システム、方法に関する。
【背景技術】
【０００２】
近年、ネットワークに接続される様々な情報ソース、機器、センサ等から提供される大量のデータであるビッグデータを収集し活用するサービスの需要が高まってきている。実世界で発生する大量のデータを順次処理できれば、リアルタイムに近い状態で情報を得ることができる。例えば、様々なセンサから常時提供される大量のデータストリームを順次処理できる技術が必要とされている。【０００３】
このような要求に応える技術として、ビックデータを扱う複合イベント処理が知られている。しかしながら、近年のスマートフォンやタブレット端末の普及は、通信量を飛躍的に増大させている。また、今後、人間だけでなく大量の機器がネットワークにつながるようになると、通信量はますます増加することが予想される。したがって、このような技術のさらなる発展が必要となってきている。【０００４】
この場合、例えば、データストリームから得られたデータ（イベントの列）を一旦データベースに格納してから、データの抽出や加工を行うことができる。しかしながら、リアルタイムに的確な情報を簡便に得る観点からは、上記のような方策は、ニーズに対する十分な結果が得られないことが多い。したがって、大量のデータストリームをリアルタイムで（または、リアルタイムに近い状態で）処理し分析する技術が必要とされている。そして、このニーズを満足するためには、データストリームを並列的に順次処理する技術が必要とされる。【０００５】
本明細書では、データストリームは、複数のイベントを含むため、イベント列とも称す。【０００６】
図１は、データストリーム処理の例を示している。図示されるように、３つの入力ストリーム（１１０，１２０，１３０）に対して、ストリーム処理システム１４０が、データストリームを順次処理する。そして、このストリーム処理システム１４０が、２つの出力ストリーム（１５０，１６０）を提供する。例えば入力ストリーム１１０においては、複数のイベント（１１１，１１２，１１３）が、時系列的にストリーム処理システム１４０に投入される。【０００７】
ストリーム処理システム１４０は、複数のクエリ（１４２，１４４，１４６，１４８，１４９）を含んでいる。これらのクエリは、静的なデータベースの処理に用いられるクエリと近似したものである。しかしながら、ストリーム処理システム用のクエリは、入力情報に対して常時動作し、必要とされる出力を提供する点で、データベースのためのクエリとは異なる側面を有する。また、あるクエリの出力が別のクエリの入力になっていることも、データベース用のクエリとは異なる。したがって、本明細書で用いる用語「クエリ」は、データベースのクエリとは異なる機能をも有していることに留意すべきである。【０００８】
また、各クエリは、複数の矢印で示されるように連結されている。これらの矢印は、データの流れ（データストリーム）を示している。そして、ストリーム処理システム１４０から出力されたストリーム１５０には、例えば複数の処理結果（１５１，１５２）が含まれる。なお、本明細書においては、ストリーム処理システム１４０に含まれる複数のクエリの結合関係を示すグラフをクエリグラフと呼ぶ。そして、クエリグラフで表されるクエリの集合及び各クエリの関係を含む処理プログラムをデータストリームプログラムと呼ぶ。【０００９】
データストリームプログラムは、静的なデータベースで用いられるSQL言語と近似したクエリ言語で記述される。データストリームプログラムの言語には、例えばContinuous Query Language (CQL) （例えば、非特許文献１参照） とComplex Event Processing Language（例えば、非特許文献２参照）がある。本明細書では、Complex Event Processing Languageを用いて説明する。【００１０】
図２（Ａ）においては、２つのクエリＱ１及びＱ２が中間ストリーム２４０で連結されている。そして、入力ストリーム２１０を、クエリＱ１及びクエリＱ２が処理し、クエリＱ２が出力ストリーム２７０を出力する。そして、クエリＱ１は、分散キーとして、A及びBを持ち、クエリＱ２は、分散キーとしてBとCを持っている。【００１１】
なお、分散キーとは、並列分散のために入力ストリームを分割（partitioning）する際に、データの宛先ノードの判定に使用されるハッシュ関数に適用され得る分散キーに対応する。例えば、クエリを構成する集計結果グルーピングオペレータ（group by）に利用されるキーは分散キーとして認識することがある。例えば、クエリQ1のプログラムに"group by A,B"という句が記載された場合、AとBというイベントのプロパティがクエリQ1の分散キーとして認識される。そのように複数のプロパティが分散キーとして認識された場合、その集合を分散キーセットと呼ぶ。また、クエリを構成する結合（join）オペレータにおいて結合用に利用されるキーも分散キーとして認識されることもある。【００１２】
また、本明細書では、実施形態において説明するように、クエリの入力イベントのプロパティと出力イベントのプロパティとの関係を示す関数も、分散キーとして扱っている点に留意すべきである。なお、プロパティとは、イベントに属するデータの属性を意味する。イベントは、1つ以上のプロパティを持つ。また、プロパティは、分散キーとして用いられる場合がある。【００１３】
図２（Ｂ）は、図２（Ａ）で示されたデータストリームプログラムを、入力ストリーム２１０を処理するために、並列分散して実行する一例を示している。【００１４】
入力ストリーム２１０は、データベースで扱われる表に準じた表記を用いて表現している。入力ストリーム２１０は、複数のプロパティ（｛A,B,C｝を持っている。また、具体的な複数のイベント（２１２，２１４，２１６，２１８）が時系列的に並んで、入力ストリーム２１０を形成している。クエリＱ１は、ノード２３２及びノード２３４に配備される。ここで、ノードとは、具体的には、例えば物理マシン又は仮想マシンであってもよい。クエリＱ１を２つのノード（２３２，２３４）によって分散処理する。ポイント２２０において、入力ストリーム２１０を、ノード２３２及びノード２３４に振り分けるために、適切なハッシュ関数に分散キーセット{A，B}を適用し、ストリーム２２１とストリーム２２２に分ける。ストリーム２２１によって、イベント２１２ａとイベント２１４ａがノード２３２に順次到着し、処理される。そして、ストリーム２２２によって、イベント２１６ａとイベント２１８ａがノード２３４に順次到着し、処理される。なお、ハッシュ関数としては、静的なデータベースで用いられている技術が利用できる。具体的には、ハッシュテーブル等を用いてもよい。この場合には、分散キーセット{A，B}を用いてデータストリーム２１０を２つのストリーム（２２１，２２２）に分離する様々なハッシュ関数が適用可能である。【００１５】
図２（Ｂ）において、さらに、クエリＱ２が、ノード２５２及びノード２５４に配備される。Ｑ２は分散キーセット{B，C}を持っており、Ｑ１とは異なっている。このため、例えばノード２５２におけるＱ２が処理すべきイベントは、ノード２３２からのイベント２１２ｂと、ノード２３４からのイベント２１６ｂとなる。同様に、ノード２５４におけるＱ２が処理すべきイベントは、ノード２３２からのイベント２１４ｂと、ノード２３４からのイベント２１８ｂとなる。【００１６】
このため、ノード２３２においては、Ｑ２の分散キーセット{B，C}と、適切なハッシュ関数に従って、出力をストリーム２４２とストリーム２４４に振り分けて、出力のうちの適切なイベントをそれぞれノード２５２とノード２５４に送る必要がある。同様に、ノード２３４においては、Ｑ２の分散キーセット{B，C}と、適切なハッシュ関数に従って、出力をストリーム２４６とストリーム２４８に振り分けて、出力のうちの適切なイベントをそれぞれノード２５２とノード２５４に送る必要がある。【００１７】
このように、図２（Ｂ）に示した例では、４つのノード（２３２，２３４，２５２，２５４）を設けて、クエリＱ１及びＱ２を並列実行したにもかかわらず、４つのノード（２３２，２３４，２５２，２５４）の間で、４つのストリーム（２４２，２４４，２４６，２４８）による相互通信が発生してしまうことが分かる。この通信は、ノード間のネットワークリソースを消費することとなる。【００１８】
複数のクエリを含むクエリプランを受け入れ、複数のクエリを分類し、複数のクエリのそれぞれに対して最適化されたパーティションセットを計算し、複数のクエリの各々の最適化されたパーティションセットを、複数のクエリの少なくとも１つのサブセットに調和させ、複数のクエリの各々のクエリによって用いられるよう、少なくとも１つの調和された最適化されたパーティションセットを選択し、選択された少なくとも１つの調和された最適化されたパーティションセットを、コンピュータ媒体に格納する発明が存在する（例えば、特許文献１参照）。【００１９】
また、ストリームデータ処理システムにおいて、ストリームデータ処理システムが備える固有のウィンドウオペレータを採用している場合、ウィンドウオペレータの処理を考慮して結果の原因分析を行なう技術が存在する（例えば、特許文献2参照）。【００２０】
また、複合イベント処理向けのクエリをイベントログから自動的に生成する技術がある。すなわち、イベントログに頻出する属性値の組み合わせのパターンを求め、当該パターンに基づいて頻出イベントを自動的に生成する。この後、ラベルを付した頻出イベントをイベントの発生順に配列した頻出イベント列を生成する。この頻出イベント列に基づいて、インシデントの発生検出に必要なクエリを生成する技術がある（例えば、特許文献３参照）。
【先行技術文献】
【特許文献】
【００２１】
【特許文献１】米国出願特許公開２０１０／００３０７４１号明細書
【特許文献２】特許第４９２５１４３号公報
【特許文献３】特開２０１１−７６１５３号公報
【非特許文献】
【００２２】
【非特許文献１】Arasu, Arvind, Shivnath Babu, and Jennifer Widom. "CQL: A language for continuous queries over streams and relations." Database Programming Languages. Springer Berlin Heidelberg, 2004. http://link.springer.com/chapter/10.1007/978-3-540-24607-7_1
【非特許文献２】Interstage Big Data Complex Event Processing Server V1.0.0 Developer's Reference. http://software.fujitsu.com/jp/manual/manualfiles/m120021/j2ul1668/01enz200/j2ul-1668-01enz0-00.pdf
【発明の概要】
【発明が解決しようとする課題】
【００２３】
上述のノード間の相互通信によるネットワークのリソースの消費量は、並列分散のためのノードを増やすほど増大することとなり、並列分散処理を適切に実現する上での課題となっている。【００２４】
大量のデータを含むデータストリームを扱うためには、処理対象に対する適切なプランを見いだすことが必要であるが、従来のように、クエリ等の性質に基づくプランの抽出では、抽出できるプラン（分散グループの適用）は限られている。【００２５】
そこで、一側面では、本発明は、並列分散されたノード間のデータ通信量の削減を図ることを目的とする。  
【課題を解決するための手段】
【００２６】
一実施形態によれば、複数のイベントを有するデータストリームを処理する複数のクエリの部分集合を含む分散グループを、複数のノードに配備するプログラムであって、前記イベントは１つ以上のプロパティを含み、前記データストリーム、及び／又は、前記複数のクエリの各々の定義から、前記複数のクエリの各々の入力イベント及び出力イベントに含まれる複数のプロパティの間の関係を抽出し、クエリの定義に記された分散キーと、前記複数のプロパティの間の関係と、前記関係の確率とに基づいて、前記分散グループに含まれる前記複数のクエリの部分集合に共通に利用し得る共通分散キーを特定し、前記特定された共通分散キーに基づいて、並列分散されたノードの各々に、前記分散グループに所属するべき前記複数のクエリの部分集合を配備する、処理をコンピュータに実行させるデータストリーム処理の並列化プログラムが提供される。
【発明の効果】
【００２７】
実施形態によれば、データストリーム処理において並列分散されたノード間のデータ通信量の削減を図ることができる。
【図面の簡単な説明】
【００２８】
【図１】クエリを用いたデータストリーム処理の概念を説明する図。
【図２】クエリの並列分散とクエリの実行の例を示す図。
【図３】分散キーを用いてクエリを分散グループに統合する例を示す図。
【図４】関数が分散キーとして用いられている例を示す図。
【図５】２つの関数の周期長の最小公倍数を持つ関数を示す図。
【図６】関数を共通分散キーとして用いた場合にノード間通信が発生する例を示す図。
【図７】２つのクエリに共通の分散キーが単純には見出せない場合の例を示す図。
【図８】プロパティ間の関係がクエリプログラムに記述されている例を示す図。
【図９】クエリの入力イベント列のプロパティの間に動的な関係を見出す例を示す図。
【図１０】イベント列に含まれるプロパティの動的関係を考慮して複数の分散グループを形成する例を示す図。
【図１１】一実施形態の機能ブロック図。
【図１２】テーブル記憶部に記憶され得る主要なテーブルの例を示した図。
【図１３】一実施形態の動作の概要を示すフローチャート。
【図１４】プロパティ間の関係の確率を計算する例を示した図。
【図１５】クエリを定義するプログラムからプロパティの関係を抽出する例を示す図。
【図１６】クエリから分散キーセットを抽出する動作の例を示す図。
【図１７】分散グループとそれに続くクエリとに共通な分散キーセットの算出の例を示すフローチャート。
【図１８】抽出された関数を解析する例を示す図。
【図１９】ノード間通信を減少させるための分散キーとして利用できる関数を求める動作の例を示す図。
【図２０】２つの関数の周期長が割り切れない場合に、ノード間通信を減少させるための分散キーとして利用できる関数を求める例を示す図。
【図２１】２つの関数の周期長が割り切れる関係にある場合の例を示す図。
【図２２】クエリを分散グループに所属させる例を示す図。
【図２３】更なるクエリを分散グループに所属させる例を示す図。
【図２４】入力イベントのプロパティ間の動的関係を利用して分散グループを作る例を示す図。
【図２５】入力イベントのプロパティ間の動的関係を利用して分散グループを作る例を示す図。
【図２６】クエリの正規化（分散キーセットの正規化）の例を示す図。
【図２７】クエリを分散グループに所属させる動作の他の例を示す図。
【図２８】一実施形態のハードウェア構成例を示す図。
【発明を実施するための形態】
【００２９】
以下に、図面を用いて本発明の実施形態を詳細に説明する。なお、以下の実施形態は、発明を理解するためのものであり、本発明の範囲を限定するためのものではない点に留意すべきである。また、以下の複数の実施形態は、相互に排他的なものではない。したがって、矛盾が生じない限り、実施形態の各要素を組み合わせることも意図されていることに留意すべきである。また、請求項に記載された方法やプログラムに係る発明は、矛盾のない限り処理の順番を入れ替えてもよく、あるいは、複数の処理を同時に実施してもよい。そして、これらの実施形態も、請求項に記載された発明の技術的範囲に包含されることは言うまでもない。また、同様の構成要素に対しては、複数の図において同様の参照符号を付す場合がある点に留意すべきである。
【００３０】
図３は、分散キーを用いてクエリを分散グループに統合する例の概略を示している。図３（Ａ）は、図２と同様のクエリＱ１及びクエリＱ２を含むデータストリームプログラムのクエリグラフを示している。図２と異なる点は、クエリＱ１及びクエリＱ２を統合した分散グループ３１０が導入されている点である。分散グループ３１０は、クエリＱ１及びクエリＱ２の共通の分散キーセットである分散キーセット{B}を持つ。一連のクエリのうちで、共通の分散キーセットを持つクエリが、同一の分散グループに所属し、分散グループは、この共通の分散キーセット（共通分散キーセット）を持っている。
【００３１】
図２では、各ノードに１つのクエリしか考慮していなかった。データストリームの処理において、各クエリ（すなわちクエリＱ１及びクエリＱ２）で分散キーセットが完全に一致しない場合では、各クエリが配備されているノード間で錯綜した通信が発生していた。
【００３２】
図３（Ｂ）は、図２（Ｂ）で発生していた上記の錯綜したノード間（クエリ間）の通信を減少させるための方策の一例を示している。図３（Ｂ）のように、４つのノード（３１２，３１４，３１６，３１８）のそれぞれに、分散グループ３１０に所属するクエリＱ１及びクエリＱ２が配備されている。なお、分散グループとは、同一のノードに配備できる１つ以上のクエリをひとまとめにした、クエリの部分集合を意味する。
【００３３】
そして、データストリーム２１０は、適切なハッシュ関数に分散キーセット{B}を適用して、ポイント３２０において振り分けられる。すなわち、イベント（２１２ｃ，２１４ｃ、２１６ｃ、２１８ｃ）は、それぞれストリーム（３２１，３２２，３２３，３２４）を介してノード（３１２，３１４，３１６，３１８）に与えられる。
【００３４】
この場合、クエリＱ１及びクエリＱ２の共通の分散キーセットである分散キーセット{B}をハッシュ関数に適用してストリーム２１０が振り分けられ、分散処理される。このため、例えばノード３１２内では、ノード内でクエリＱ１の出力をクエリＱ２に与えればよい。他のノード）（３１４，３１６，３１８）についても同様である。したがって、この場合には、図２（Ｂ）に見られたような、ノード間での錯綜した通信（２４２，２４４，２４６、２４８）は発生しない。そして、各ノードの出力は、最終的に結合され、出力ストリーム２７０が得られる。
【００３５】
更に図３（Ａ）を参照する。このように、連続したクエリで、共通の分散キーセットが存在する場合には、クエリグラフにおいてこれらを１つの分散グループとしてまとめる。そして、同一の分散グループに含まれる１つ以上のクエリを、１つのノードに配備する。これによって、ノードが並列分散されても、錯綜したノード間の通信の発生は防止される。
【００３６】
なお、分散グループやクエリを並列分散させるノードの数は、クエリの処理の重さ、ノードとして採用できる物理マシンの数、ストリーム量などに依存して決定すればよい。決定された分散処理のノードの数によって、分散グループの分散キーセットを適用すべき適切なハッシュ関数を定義すればよい。また、ハッシュ関数については、データストリームのイベントが、なるべく均等になるように、適切なハッシュ関数を用いてもよい。
【００３７】
図３に示した例は、クエリＱ１及びクエリＱ２のそれぞれのプログラム内に、分散キーA、B、及びB、Cが明示的に記述されている場合の例を示したものである。
【００３８】
図４は、関数が分散キーとして用いられている例を示している。図４では、クエリＱ１及びクエリＱ２が、例えば以下のように定義されている場合における例を示している。
Q1:
insert into E2
select A, COUNT(*) as B
from E1
group by A/2;
Q2:
insert into E3
select  A, B, COUNT(*) as C
from E2
group by A/3;
ここで、Ａ／２は、Ａを２で割って、小数点以下を切り捨てる関数を意味する。Ａ／３は、Ａを３で割って、少数点以下を切り捨てる関数を意味する。
【００３９】
図４（Ａ）において、ノード４０１及びノード４０２にＱ１を配備し、分散キーとして、ポイント４１０でハッシング（Ａ／２）％２を適用している。そして、ノード４０１及びノード４０２で、更にハッシング（Ａ／３）％２を適用している。ここで、Ｋ％Ｎは、Ｎ個のハッシュ値を出力するハッシュ関数に分散キーセットＫを適用することを意味する。上述の場合には、分散キーセットとして、関数Ｆ（Ａ）＝Ａ／２及び関数Ｇ（Ａ）＝Ａ／３が用いられている。
【００４０】
関数Ｆ（Ａ）＝Ａ／２はステップ関数という数学的な関数の種類に属する。Ａの値が２つ増えるたびに、Ｆ（Ａ）の値が１つ増えるが、それまでには固定である。関数Ｇ（Ａ）＝Ａ／３もステップ関数に属した関数であり、Ａの値が３つ増えるたびにＧ（Ａ）が１つ増える。このようにＡの値に対して一定の間隔で増え続けるステップ関数には周期性があるとみなして、関数の値が増えるまでのＡの間隔を周期長と呼ぶ。この例の場合、関数Ｆ（Ａ）の周期長は２である。また、関数Ｇ（Ａ）の周期長は３である。
【００４１】
図４（Ｃ）は、ステップ関数Ｆ（Ａ）とＡとの関係を示している。そして、Ｆ（Ａ）の周期長βが２であることがわかる。
【００４２】
２つの連続したクエリの分散キーセットとして２つの異なる関数が用いられた場合、２つの関数の値の間に、１対1な関係が存在した場合、２つの関数のうち任意な関数を用いて、２つのクエリを分散グループとしてまとめることができる。例えば２つの関数が連続的な一次関数であった場合はその例に当たる。ただし、２つの関数が上記のような周期性のあるステップ関数であった場合、単純に２つのクエリを分散グループとしてまとめることができない。
【００４３】
図４（Ａ）の場合には、入力イベント列Ｅ１をポイント４１０で、ハッシング関数（Ａ／２）％２で振り分け、ノード４０１及びノード４０２で、分散してクエリＱ１を実行している。この時点では、クエリＱ１が２つのノード４０１及びノード４０２で、分散して独立に実行されているため、効率よくクエリＱ１の処理が行える。しかしながら、ノード４０１及びノード４０２で、更にハッシング（Ａ／３）％２を適用しているため、錯綜した通信４２１及び通信４２２が発生していることが分かる。
【００４４】
図４（Ｂ）では、この錯綜した通信を無くすために、ノード４３１及びノード４３２に、それぞれＱ１及びＱ２を配備させ、分散キーセットとして、ポイント４３０において、（Ａ／６）％２で、データストリームＥ１をハッシングしている。このようにすることにより、ノード４３１とノード４３２との間での錯綜した通信を無くすことができる。
【００４５】
以上の例は、２つの連続したクエリであるクエリＱ１とクエリＱ２に、それぞれ、入出力のプロパティ間に関する関数Ａ／２と関数Ａ／３が用いられている例である。そして、関数Ａ／２の周期長は２であり、関数Ａ／３の周期長は３である。この場合に、周期長２と周期長３の最小公倍数である周期長６の関数Ａ／６が、Ｑ１とＱ２の共通分散キーとして用いられている。そして、Ｑ１とＱ２が１つの分散グループに割り当てられている。
【００４６】
そして、この分散グループをノード４３１及びノード４３２に配備する。入力イベントＥ１を、ポイント４３０で、ハッシュ関数（Ａ／６）％２でハッシュすることにより、適切に、入力イベントＥ１がハッシュされ、ノード４３１及びノード４３２との間での錯綜した通信が発生しないようにクエリＱ１及びＱ２が配備された。
【００４７】
以上のことは、分散キーとして周期性のあるステップ関数が使われていても、共通分散キーを新たに生成することができることを意味している。
【００４８】
なお、上述の説明では、関数とは、クエリの入力イベントのプロパティとクエリの出力イベントのプロパティとの関係として定義した。しかしながら、クエリの定義の仕方によっては、関数がクエリ内に内在している場合もある。この点については、図２６を用いて後述する。
【００４９】
図５は、図４（Ｂ）の例に用いた関数Ｆ（Ａ）＝Ａ／２、Ｇ（Ａ）＝Ａ／３、及びこの２つの関数の各々の周期長の最小公倍数の周期長を持つＨ（Ａ）＝Ａ／６の取り得る値を、Ａの値と対応付けて示した図である。Ｈ（Ａ）の周期５２１は、Ｆ（Ａ）の周期５０１、５０２、５０３を含み、かつ、Ｇ（Ａ）の周期５１１、５１２を含んでいる。
【００５０】
したがって、Ｆ（Ａ）の周期とＧ（Ａ）の周期の切れ目が、関数Ｈ（Ａ）の周期の切れ目と合致する。この関数Ｈ（Ａ）を用いて、入力イベント列Ｅ１をハッシングし（例えばＨ（Ａ）％２）、クエリＱ１とクエリＱ２とを、同じ分散グループに所属させれば、この分散グループを複数のノードに並列分散しても、ノード間での錯綜した通信は発生しないのである。
【００５１】
図６は、関数を共通分散キーとして用いてもノード間通信が発生する例を示している。図６（Ａ）は、クエリＱ１における分散キーとしての関数がＦ（Ａ）＝Ａ／２であり、Ｑ２における分散キーとしての関数がＧ（Ａ）＝（Ａ＋１）／３である場合であって、分散グループＱ１及びＱ２の共通分散キーとして関数Ｈ（Ａ）＝Ａ／６が用いられた例を示している。
【００５２】
図６（Ａ）に示すように、Ａ＝５の場合に、関数Ｆ（Ａ）の周期と関数Ｇ（Ａ）の周期とにズレが生じている。このため、ノード６０１からノード６０２に、通信６１０が発生している。ポイント６３０においては、Ｈ（Ａ）＝Ａ／６を適用して入力イベント列Ｅ１（データストリーム）をハッシングしている。
【００５３】
この場合のノード間通信は、データストリームに含まれるイベントがランダムであれば、平均１／６の割合で発生する。このノード間通信の発生割合は、単純にＱ１の分散キーとして関数Ｆ（Ａ）＝Ａ／２を用い、Ｑ２の分散キーとしてＧ（Ａ）＝Ａ／３を用いた場合のノード間通信の割合（２／６）よりも小さい。
【００５４】
また、図６（Ｃ）は、クエリＱ１における分散キーとしての関数がＦ（Ａ）＝Ａ／２であり、Ｑ２における分散キーとしての関数がＧ（Ａ）＝（Ａ＋１）／４である場合であって、分散グループＱ１及びＱ２の共通分散キーとして関数Ｈ（Ａ）＝Ａ／４が用いられた例を示している。ポイント６４０においては、Ｈ（Ａ）＝Ａ／４を適用して入力イベント列Ｅ１をハッシングしている。
【００５５】
図６（Ｃ）の場合には、図６（Ｄ）に示すように、例えば、Ａ＝３の場合に、ノード６０３からノード６０４にノード間通信６２０が発生している。そして、ノード間通信の割合は、平均１／４である。このノード間通信の発生割合は、単純にＱ１の分散キーとして関数Ｆ（Ａ）＝Ａ／２を用い、Ｑ２の分散キーとしてＧ（Ａ）＝Ａ／４を用いた場合のノード間通信の割合（２／４）よりも小さい。
【００５６】
なお、図６（Ａ）の場合には、最小公倍数の周期長を持つ、他の関数を共通分散キーとして用いることにより、ノード間通信を無くすことができる。この点については、図２０を用いて後述する。
【００５７】
以上の例は、Ｑ１とＱ２における分散キーとしての関数のそれぞれの周期長の最小公倍数の周期長を持つ関数を、分散グループＱ１及びＱ２に共通分散キーとして適用することによって、ノード間通信の割合を減少させることができる例である。
【００５８】
したがって、ノード間通信が、仮に発生するとしても、その転送コストを減少させることができる。したがって、所定のコスト以下である場合には、その分散グループを採用することが望ましい。例えば、所定のコストは、第２の閾値の一例である。
【００５９】
なお、図６（Ｃ）及び図６（Ｄ）の例の場合は、関数Ｆ（Ａ）と関数Ｇ（Ａ）に必ず、ズレが生じているため、共通分散キーとしてどのような新たな関数を用いても、Ｑ１とＱ２とで構成される分散グループのノード間通信を無くすことはできない。
【００６０】
上述の実施形態では、例えば２つのクエリのそれぞれに分散キーとして用いることができる関数が存在した例である。以下の実施形態は、上述のように２つの関数の周期長の最小公倍数を周期に持つ関数を単純に見いだすことに困難を伴う場合の例を示す。
【００６１】
図７は２つのクエリに共通の分散キーが単純には見出せない場合の例を示している。
【００６２】
クエリＱ１を定義するプログラム７０１に示すように、Ｑ１は、ウィンドウや集約関数による内部状態がないため、自由分散可能である。すなわち、入力イベントの全てのプロパティが分散キーとなり得る。Ｑ１の入力イベントは、プロパティＡを持つ。したがって、Ｑ１の分散キーセットは、｛Ａ｝である。
【００６３】
クエリＱ２定義するプログラム７０２は、AVG(A)という集約関数が規定されているため、内部状態を持つ。また、GROUP BY Bがあるため、Ｑ２の分散キーセットは｛Ｂ｝である。
【００６４】
以上のように、Ｑ１とＱ２には、外見上共通の分散キーが見いだせない。したがって、このままでは、Ｑ１とＱ２を同一の分散グループとし、グルーピングして複数のノードに並列分散することができない。
【００６５】
しかしながら、クエリＱ１のプログラム中には、"A/2 as B"が存在する。したがって、Ｂ＝Ａ／２の関係が存在することになる。
【００６６】
図８は、図７と同じクエリＱ１及びクエリＱ２を用いている。図８を用いて、プロパティ間の関係がクエリプログラムに記述された場合に、その関係を利用して２つのクエリを同じ分散グループとしてまとめる方法を示す。
【００６７】
まず、図８（Ａ）において、クエリＱ１の定義から、２つのクエリ間の入力イベント列Ｅ１（８０１）のプロパティであるＡと、出力イベントＥ２（８０２）のプロパティであるＢとの間には、Ｂ＝Ｆ（Ａ）＝Ａ／２という関係が成立している。
【００６８】
図８（Ｂ）に示すように、イベント列Ｅ１（８１１）及びイベント列Ｅ２（８１２）は、図８（Ａ）と同じである。この場合、クエリＱ１とクエリＱ２は、同じ分散キーＢを持つことになる。言葉を換えて説明すれば、Ｂ＝Ａ／２という関係があるため、クエリＱ１とクエリＱ２は、同じ分散キーとしての関数Ａ／２を持つと言うこともできる。
【００６９】
図８（Ｃ）は、クエリＱ１とクエリＱ２を分散グループとして、ノード８３１とノード８３２に並列分散させた例を示している。この場合に利用される共通分散キーは、Ｂ（すなわちＦ（Ａ）＝Ａ／２）である。したがって、イベント列Ｅ１（８２１）を（Ａ／２）％２（すなわち、Ｂ％２）でハッシングして、２つのストリームすなわちストリーム８２２と、ストリーム８２３とに振り分ければよい。
【００７０】
このように、Ｑ１とＱ２には、外見上共通の分散キーが見いだせない場合であっても、Ｑ１とＱ２に係る入力イベントのプロパティ及び出力イベントのプロパティのうち、プロパティの関係を分析することで、共通の分散キーを見出すことができる。
【００７１】
図９は、クエリの入力イベント列Ｅ１のプロパティ（すなわち、プロパティＡとプロパティＢ）の間に動的な関係を見出す例を示している。
【００７２】
クエリのプログラムを解析しても、イベントに含まれるプロパティ間の関係が見いだせない場合がある。しかしながら、入力イベント列に含まれるプロパティ間に、完全ではないが、ある程度の関係が内在している場合がある。或いは、長期間にわたっては、特段の関係が存在しない場合であっても、クエリのウィンドウの範囲内であれば、ある程度の関係が存在する場合がある。このような場合、従来では、クエリのウィンドウの範囲を超えた部分では、定常的な関係が存在しないことにより、クエリを分散グループにまとめるためのプランの抽出が困難であった。
【００７３】
図９におけるクエリＱ１は、プログラム９１１に従って動作する。また、クエリＱ２は、プログラム９１２によって動作する。まず、クエリＱ１のプログラム８０１には、内部状態が存在する。すなわち、「FROM E1.win:time(1 min)」は、タイムウィンドウと呼ばれるシンタクスである。このシンタクスは、入力イベント列Ｅ１を１分間蓄積し、この蓄積されたイベント列から、所定の処理を施すことを意味する。なお、その他のシンタクスについては、データベースを処理するクエリのシンタクスと同様であるため、説明は省略する。そして、「GROUP BY A」があることから、クエリＱ１の分散キーとしては、「Ａ」が抽出される。
【００７４】
クエリＱ１は、タイムウィンドウ９０１を持ち、クエリＱ２は、タイムウィンドウ９０２を持つ。
【００７５】
ここでは、入力イベント列Ｅ１をクエリＱ１が蓄積したタイムウィンドウ９０１の複数のイベントに着目する。クエリＱ１の入力イベントに含まれるプロパティ（この場合は、Ａ及びＢ）は、クエリＱ１が受動的に受信するデータであるため、クエリＱ１が、プロパティＡとＢとの関係を定義することはできない。しかしながら、タイムウィンドウ９０１に記憶された複数のイベントのプロパティＡとＢとの間には、ある確率で、関係を持つ場合がある。あるいは、長期間にわたっては特段の関係が存在しない場合であっても、クエリのタイムウィンドウの範囲内のそれぞれにおいて、それぞれの関係がある確率で存在する場合がある。
【００７６】
タイムウィンドウ９０１では、プロパティＡとＢとの間にＢ＝Ａ／２という関係が存在している例を示している。この関係Ｂ＝Ａ／２は、クエリＱ１のプログラム８０１からは抽出することができない関係である。なお、関数Ａ／２は、Ａを２で割った商のあまりを切り捨てる関数を意味する。この関係Ｂ＝Ａ／２は、１つのＢの値に対して複数のＡが対応する関係である。この関係を１対Ｎ［Ｎは整数］の関係と表記することとする。
【００７７】
タイムウィンドウ９０１に蓄積されたイベントは、１対Ｎの関係を１００％満たしている。なお、１対Ｎの関係が１００％を満たさない場合も現実には存在する。そのような場合の例は、図１３及び図１４において触れる。クエリＱ１のプログラム８０１からは、クエリＱ１の分散キーとして「Ｂ」が抽出される。
【００７８】
なお、一般に、プロパティＸとプロパティＹとが、１対Ｎの関係を有する場合には、１に対応するプロパティ（この例の場合には、Ｘ）が、分散キーとしての役割を果たし得る。
【００７９】
図９において、クエリＱ２のプログラム９１２は、同様にタイムウィンドウ９０２が定義されており、内部状態が存在する。そして、「GROUP BY B」のシンタクスが存在する。このため、クエリＱ２の分散キーとして「Ｂ」が抽出される。
【００８０】
したがって、このままでは、クエリＱ１とクエリＱ２の分散キーが異なるために、共通の分散キーは存在しない。よって、クエリＱ１とクエリＱ２を、分散グループに所属させることはできない。
【００８１】
図１０は、イベント列に含まれるプロパティの動的関係を考慮して複数のクエリを有する分散グループを形成する例を示している。図１０では、上述したタイムウィンドウ９０１から得られたＢ＝Ａ／２という関係を利用している。図１０（Ａ）は、図９におけるクエリプログラムから得られた、クエリＱ１の分散キー「Ａ」と、クエリＱ２の分散キー「Ｂ」が示されている。そして、クエリＱ１とクエリＱ２は、分散グループにまとめられていない状態を示している。
【００８２】
図１０（Ｂ）は、Ｂ＝Ａ／２の関係を利用し、共通分散キーとして、「Ｂ」（すなわち、Ａ／２）を用いて、クエリＱ１及びクエリＱ２を分散グループに所属させ、この分散グループを、並列分散されたノード１０１０とノード１０２０に配備した例を示している。
【００８３】
そして、ポイント１００１において、ハッシュ関数Ｂ％２が、入力イベント列をハッシュし、ノード１０１０及びノード１０２０に振り分けている。ノード１０１０には、ハッシュされたイベント列１００２が与えられる。ノード１０２０には、ハッシュされたイベント列１００３が与えられる。
【００８４】
なお、この場合、イベントに含まれるプロパティ間の動的な関係を利用し、共通分散キーでクエリＱ１及びクエリＱ２を分散グループに所属させている。そして、その関係が１００％成り立たない場合もあり得る。したがって、このような例の場合には、並列分散されたノード１０１０とノード１０２０との相互間で通信が発生する場合が、十分想定される。しかしながら、得られた関係が、所定のレベルを超える確率を有する場合には、この相互間の通信は、許容されるレベルに押さえることが可能である。この所定のレベルは、第１の閾値の一例である。
【００８５】
なお、図９及び図１０の例では、ある２つのプロパティ間の関係として、具体的な関係すなわちＢ＝Ａ／２が見出せた例である。しかしながら、実際の入力イベントにおいては、プロパティ間に１対Ｎの関係は見出せるが、具体的な関係を定義する関数を見出せない場合も十分想定される。このような場合であっても、例えばクエリＱ１でプロパティＢとＡとの間に１対Ｎ（又は１対１）の関係が見出せさえすれば、プロパティＢは、クエリＱ１においてイベント列を集約できる能力があることを意味している。したがって、クエリＱ１に続くクエリＱ２において、分散キーが同じＢであるならば、クエリＱ１とクエリＱ２は、共通分散キーとしてＢを持つ分散グループが形成できることを示唆する。したがって、プロパティＢとＡとに１対Ｎの関係が所定の確率で見出せれば、その間の関係が具体的に特定できなくてもよいということができる。
【００８６】
また、図９及び図１０においては、クエリにタイムウィンドウのシンタクスが存在する例を示した。このシンタクスが存在すれば、所定の時間のイベント列がクエリに保存される。
【００８７】
このようなタイムウィンドウなどの複数のイベントを記憶して処理するシンタクスを一般にスライディングウィンドウと称する。スライディングウィンドウのシンタクスがクエリに存在する場合には、スライディングウィンドウによって蓄積された複数のイベントに含まれる複数のプロパティの間の関係を求めることができる。
【００８８】
なお、スライディングウィンドウを持たないクエリの場合には、例えば、そのクエリに入力されるデータストリームのイベントを適切な間隔でサンプリングし、蓄積してもよい。サンプリング間隔は、図１３（Ｂ）において更に説明する。或いは、複数のプロパティ間の関係を逐次計算し、計算結果を記憶し、新たなイベントが入力される度に、この計算結果をインクリメンタルに修正してゆく処理を行ってもよい。
【００８９】
図１１は、一実施形態の機能ブロック図を示している。データストリーム処理の並列化システム１１００は、プロパティ関係抽出部１１１０と、共通分散キー特定部１１５０と、テーブル記憶部１１６０と、クエリ配備部１１７０とを有する。データストリーム処理の並列化システム１１００は、複数のクエリ定義を含むプログラムを入力とし、複数のノードにクエリを配備する能力を有する。なお、データストリーム処理の並列化システム１１００は、データストリームのイベントに含まれるプロパティの関係を用いることができる。
【００９０】
プロパティ関係抽出部１１１０は、更に動的プロパティ関係抽出部１１２０と、静的プロパティ関係抽出部１１３０とを有する。
【００９１】
動的プロパティ関係抽出部１１２０は、データストリームの複数のイベントを用いて、動的に複数のプロパティの間の関係を抽出することができる。ここで、動的とは、動的なデータであるデータストリームの複数のイベントを用いていることを意味する。データストリームから得られたプロパティ間の関係を動的関係と称す。この動的関係は、データストリームに依存して変化し得る。
【００９２】
静的プロパティ関係抽出部１１３０は、複数のクエリ定義を含むプログラムから、静的に、複数のプロパティの間の関係を抽出することができる。ここで、静的とは、静的なデータである、複数のクエリ定義を含むプログラムを用いていることを意味する。このプログラムから得られたプロパティ間の関係を静的関係と称す。この静的関係は、プログラムが変更されない限り変化しない。
【００９３】
動的プロパティ関係抽出部１１２０は、更に、入力イベント保存部１１２２と、関係確率算出部１１２４と、関係特定部１１２６とを有する。
【００９４】
入力イベント保存部１１２２は、あるクエリがスライディングウィンドウを持つ場合には、スライディングウィンドウのシンタクスで定義された量の入力イベントが、そのクエリに保存される。一方、別のクエリがスライディングウィンドウを持たないクエリである場合には、そのクエリの入力イベント列をトラップし、メモリに蓄積してもよい。なお、クエリへの入力イベントは、膨大な数になるため、そのクエリに関する入力イベントの全てをメモリに蓄積することは非現実的である。したがって、そのクエリの入力イベント列をサンプリングして、ファーストインファーストアウトで、所定個数をメモリに蓄積してもよい。
【００９５】
或いは、そのクエリの入力イベントの関係を計算し、計算結果を蓄積し、新たなイベントが入力された時点で、計算結果を更新してインクリメンタルに上書きして蓄積するようにしてもよい。
【００９６】
関係確率算出部１１２４は、各クエリに関与するイベントに含まれるプロパティ間の関係とその関係の確率を求める。
【００９７】
なお、各クエリの入力イベント列に含まれるプロパティ間の関係を求めることは、その組合せが膨大になることから、現実的でない場合がある。したがって、過去の全てのイベントではなく、スライディングウィンドウにあるイベント列のみを対象としてもよい。また、入力ストリームの各プロパティから、入力ストリームに直接繋がっているクエリの各分散キーに向かったN対1の関係のみを対象としてもよい。
【００９８】
また、あるクエリの入力ストリームをサンプリングする場合、そのクエリの出力先に接続されているクエリの分散キーとなっているプロパティと他のプロパティとの関係の抽出に限定してもよい。
【００９９】
また、サンプリングによってある程度高い確率（例えば、５０％）以上のプロパティの組合せが見つかった場合には、その組合せに関して、より短いサンプリング間隔で、イベントを取得してもよい。そして、その関係の確率が閾値（例えば８０％）以上のプロパティの組合せが見つかった場合は、関係があると判断してもよい。このように複数段階（２つ以上）に分けられた効率的なサンプリングを採用してもよい。
【０１００】
関係特定部１１２６は、関係確率算出部１１２４において見つかった、確率の高い関係に係るプロパティを特定する。特定されたプロパティの組合せは、テーブル記憶部１１６０に存在するテーブルに保存されてもよい。なお、関係を発見する例、及び関係の確率の計算例については、図１４を用いて後述する。この閾値は、第１の閾値の一例である。
【０１０１】
静的プロパティ関係抽出部１１３０は、関数特定部１１３４を有する。静的プロパティ関係抽出部１１３０は、複数のクエリを定義するプログラムから、プロパティ間の関係を関数として抽出する。
【０１０２】
共通分散キー特定部１１５０は、分散キー抽出部１１５２と、共通分散キー生成部１５４とを有する。
【０１０３】
分散キー抽出部１１５２は、複数のクエリを定義するプログラムから、静的に、分散キーを抽出する。
【０１０４】
共通分散キー生成部１１５４は、第3の関数生成部１１５５と、関数精度算出部１１５６とを有する。
【０１０５】
第３の関数生成部１１５５は、上述の関数Ｈ（Ａ）が複数存在する場合、クエリ間の通信量の平均値の予測値が一番小さい関数Ｈ（Ａ）を生成（選択）する。なお、この第３の関数生成部１１５５は、静的プロパティ関係抽出部１１３０の中に存在してもよい。
【０１０６】
関数精度算出部１１５６は、クエリを定義するプログラムから見出された関数の特徴を判断する。関数精度算出部１１５６は、既に図６において説明したように、２つのクエリに存在する分散キーの役割を果たす関数Ｆ（Ａ）の周期長とＧ（Ａ）の周期長との最小公倍数の周期長を有する関数Ｈ（Ａ）について、クエリＱ１とクエリＱ２を分散グループに所属させて、複数のノードに並列分散させた場合に、ノード内での通信量に対するノード間での通信量の比（或いはノードに入力される通信量に対する他のノードへの通信量の比）の平均値を予測する。なお、この関数精度算出部１１５６は、静的プロパティ関係抽出部１１３０の中に存在してもよい。
【０１０７】
共通分散キー生成部１１５４は、分散キー抽出部１１５２と、プロパティ関係抽出部１１１０によって作成された関係及び関数を用いて、分散グループに所属する複数のクエリの共通分散キーを生成（選択）する。また、分散グループに属するべきクエリを特定する。
【０１０８】
クエリ配備部１１７０は、共通分散キー特定部１１５０によって生成された共通分散キーのプランに基づいて、並列分散された複数のクエリに、分散グループに所属するクエリを配備する。
【０１０９】
以上のようにして、データストリーム処理の並列化システム１１００は、データストリームを適切に処理する複数のノードに適切なクエリを配備することができる。
【０１１０】
なお、動的プロパティ関係抽出部１１２０によって、プロパティの動的関係に変化が発見された場合には、複数のノードの組合せの構成、及び複数のノードの各々に対するクエリの配備計画（プラン）を変更してもよい。このようにすることによって、時間の経過によって変化し得る、プロパティ間の関係の変動にも適切に対応できる。
【０１１１】
図１２は、テーブル記憶部１１６０に記憶され得る主要なテーブルの例を示した図である。
【０１１２】
分散キーテーブル１２１０は、各クエリを定義するプログラムから直接導かれる分散キーセットを記憶するテーブルである。なお、本明細書では、分散キーの集合を分散キーセットと称す。なお、説明の簡潔性から、分散キーセットを単に分散キーと呼ぶ場合がある点に留意すべきである。
【０１１３】
また、本明細書では、既に述べたように、イベントのプロパティ自体がクエリの分散キーとして抽出される場合に加えて、イベントのプロパティ間に見出された動的な関係、及びクエリプログラムから抽出された関数から分散キーが求められる場合もある。したがって、例えば、後述する各表において、分散キー又は分散キーセットとして明示的に記載された分散キー以外に、関数（式）、多重度、確率などを用いて、分散キーとして機能し得るものが、関係特定部１１２６、関数特定部１１３４、共通分散キー生成部１１５４等で、別途抽出され得る点に留意すべきである。
【０１１４】
分散キーテーブル１２１０は、クエリ１２１１、入力イベント１２１２、分散キーセット１２１３のエントリを有する。
【０１１５】
プロパティ関係テーブル１２２０は、２つのプロパティの関係を記憶するテーブルである。イベント２（１２２１）には、原則として、クエリの出力イベントが記入される。例外として、クエリの入力イベントが記入される場合がある。この点は、図１３（Ｃ）及び図１６において、例を示す。
【０１１６】
イベント２のプロパティ１２２２には、イベント２（１２２１）の欄に記載されたイベントのプロパティが記入される。
【０１１７】
イベント１（１２２３）には、クエリの入力イベントが記入される。
【０１１８】
イベント１のプロパティセット１２２４には、イベント１のプロパティセットが記入される。なお、イベント１のプロパティセットには、複数のプロパティが記入される場合がある。たとえば、以下のようなクエリは、イベント１のプロパティセット１２２４に｛Ａ，Ｂ｝が記入される。
insert into E2
select A+B as C
from E1
関数（式）１２２５には、イベント２のプロパティ１２２２とイベント１のプロパティセット１２２４との間の関係が記入される。その関係が、関数又は式として記述できる場合には、明示的に関数又は式が記入される。
【０１１９】
多重度１２２６には、イベント２のプロパティ１２２２とイベント１のプロパティセット１２２４との間の関係の多重度が記入される。多重度には、１対Ｎ又は１対１が記入される。
【０１２０】
確率１２２７には、多重度の確率が記入される。この確率は、関係確率算出部１１２４又は関数精度算出部１１５６において算出された確率が記入される。
【０１２１】
分散グループ一覧１２３０には、分散グループに所属するクエリが記入される。分散グループ１２３１には、分散グループを特定するためのグループＩＤが記入される。所属クエリ１２３２には、分散グループに所属するクエリが記入される。
【０１２２】
分散グループごとの分散キー一覧１２４０には、分散グループに適用される分散キーが記入される。分散グループ１２４１には、分散グループＩＤが記入される。
【０１２３】
入力イベント１２４２には、分散グループの入力イベントが記入される。分散キー１２４３には、分散グループに適用される分散キーが記入される。なお、この分散キー１２４３は、複数の分散キー（分散キーセット）を含む場合がある。
【０１２４】
関数１２４４には、プロパティ関係テーブルの関数（式）１２２５と同じものが記入される。
【０１２５】
なお、関数１２４４が記入されている場合には、この関数は、分散キーの役割を果たす場合がある。
【０１２６】
図１３は、一実施形態の動作の概要を示すフローチャートである。図１３（Ａ）は、一実施形態の動作を示す。
【０１２７】
ステップ１３０２で、プロパティ関係抽出部１１１０は、イベントに含まれるプロパティの関係を抽出する。このプロパティの関係は、動的関係と静的関係が含まれる。
【０１２８】
ステップ１３０４で、共通分散キー特定部１１５０は、プロパティの関係を用いて、分散キーを抽出し、更に、分散グループに所属する１つ以上のクエリに適用される共通分散キーを特定する。
【０１２９】
ステップ１３０６で、クエリ配備部１１７０は、分散グループに所属する１つ以上のクエリを並列分散されたノードに配備する。
【０１３０】
図１５（Ｂ）は、イベント列に含まれるプロパティ間の関係を抽出する動作の概要を示すフローチャートである。この処理は、例えばクエリＱ１への入力イベントの到着により割り込みが発生し、開始されてもよい。
【０１３１】
ステップ１３２２で、入力イベント保存部１１２２は、例えば、クエリＱ１の入力イベントのプロパティＡとＢとを取得する。スライディングウィンドウを持つクエリの場合には、スライディングウィンドウによってそのクエリに蓄積された複数のイベントを処理対象としてもよい。スライディングウィンドウを持たないクエリの場合には、所定のサンプリングレートで、入力イベントをサンプリングし、適切なメモリ（不図示）にサンプリングされた所定数の入力イベントを保存してもよい。
【０１３２】
また、サンプリングレートは、定常時は、低い値を設定しておいてもよい。そして、後述するステップ１３２６で、ＡとＢとのＮ対１の関係が閾値α１よりも高い確率で発見された場合には、サンプリングレートを低い値から高い値に変更し、閾値α１よりも大きい閾値α２を用いて、図１３（Ｂ）の処理を再実行してもよい。
【０１３３】
ステップ１３２４で、関係確率算出部１１２４は、プロパティＡとＢとの比較テーブルの更新を行う。この比較テーブルの利用に関しては、図１４を用いて後述する。このステップにおいて、プロパティＡとＢとの関係がＮ対１又は１対１であるかが判断され、かつ、その関係の確率が計算される。
【０１３４】
ステップ１３２６で、関係特定部１１２６は、プロパティＡとＢとの関係がＮ対１（又は１対１）の関係の確率が、所定の閾値α１を超えるか否かが判断される。関係の確率が、所定の閾値α１を超える場合には（はい）、処理が、ステップ１３２８に移る。関係の確率が、所定の閾値α１以下の場合には（いいえ）、処理は終了する。なお、上述のように、ＡとＢとのＮ対１の関係が閾値α１よりも高い確率で発見された場合には、サンプリングレートを低い値から高い値に変更し、閾値α１よりも大きい閾値α２を用いて、図１３（Ｂ）の処理を再実行してもよい。α１又はα２は、所定の第１の閾値の一例である。
【０１３５】
プロパティ
ステップ１３２８で、プロパティ関係テーブルにプロパティＡ及びＢ、多重度、確率などを保存する。
【０１３６】
図１３（Ｃ）は、図１３（Ｂ）のステップ１３２８における動作において作成されるプロパティ関係テーブルのエントリの一例を示している。イベント２（１３６１）には、入力イベントであるＥ１が記入されている。イベント２のプロパティ１２６２には、プロパティＢが記入されている。イベント１（１３６３）にも入力イベントＥ１が記入されている。イベント１のプロパティセット１３６４には、｛Ａ｝が記入されている。関数１３６５は、記入されていない。多重度は、イベント２のプロパティ（１３６２）とイベント１のプロパティセット（１３６４）との多重度を示しており、１対Ｎが記入されている。確率１３６７には、９５％が記入されている。
【０１３７】
図１３（Ｃ）は、図９及び図１０で説明した例を示している。なお、関数１３６５には、具体的な関数が記入されていない。この理由は、既に述べたように、プロパティＢとＡとの多重度が１対Ｎであることが９５％の確率で求められているため、分散グループを作る際に、必ずしも関数を利用する必要はないからである。なお、具体的な関数が求まっている場合には、その関数を記入してもよい。また、多重度は、１対Ｎ又は１対１のいずれかであればよい。
【０１３８】
図１３（Ｃ）は、イベント２（１３６１）及びイベント１（１３６３）の両者に、入力イベントＥ１が記入される一例である。この理由は、クエリに入力されるイベントのプロパティの関係を求めた結果が記入されているためである。クエリの入力イベントのプロパティは、そのクエリが受動的に受け入れるプロパティである。したがって、クエリの入力イベントのプロパティは、そのクエリの制御が及ばないプロパティであるということができる。図１３（Ｃ）では、このような入力イベントのプロパティの間の関係を記述することがその目的である。
【０１３９】
図１４は、プロパティ間の関係の確率を計算する例を示した図である。イベント列１４１０は、例えば、スライディングウィンドウによってクエリに蓄積されたイベント列である。このイベント列において、プロパティＢとＡとの関係が１対Ｎであるか否かを求める例を以下に示す。
【０１４０】
まず、全てのＢの値に対して、ＢとＡとの値の組合せパターンが同じ個数（Ａ値の数）を計算する。１つのＢに関して、Ａの数が所定の閾値以上の値を持つエントリにフラグ１を立てる。残りのエントリにフラグ０を立てる。図１４の表１４２０は、閾値を２とした例である。そして、（フラグ１のエントリのＡ値の数の合計）／（Ａ値の総合計）＝Ｘを計算する。Ｘは、プロパティＢとＡとが１対Ｎの関係の確率の近似値を示す。図１４の例の場合には、８５％の確率となる。なお、この場合に用いられる所定の閾値は、たとえば、１つのＢに関して、複数のＡの値が存在する場合、複数のＡの値の各々の数の中央値を採用してもよい。Ｂに関して、１つのＡの値が対応する場合には、フラグ１を立ててもよい。
【０１４１】
或いは、全てのＢの値に関連するＡ値の数をカウントする。１つのＢに関して、Ａの数が多いエントリにラグ１を立て、その他のエントリにフラグ０を立てる。そして、（フラグ１のエントリのＡ値の数の合計）／（Ａ値の総合計）＝Ｘを計算してもよい。
【０１４２】
図１５は、クエリを定義するプログラムから（静的に）プロパティの関係を抽出する例を示す。プログラムに書かれたクエリの定義から、関数を抽出する。プログラム１５１０は、クエリＱ１の定義を示している。プログラム１５２０は、クエリＱ２の定義を示している。
【０１４３】
プログラム１５１０には、A/2 AS Bが記載されている。この記載から、たとえば、以下の関係を抽出する。
E2.B=F(E1.A)=E1.A/2
上式の意味は、イベントＥ２のプロパティＢは、イベントＥ１のプロパティＡの関数であり、その関数は、イベントＥ１に関連するものであり、具体的には関数Ａ／２である。そして、多重度は１対Ｎである。このようにして抽出したプロパティの関係を、図１５のプロパティ関係テーブル１５３０に登録する。
【０１４４】
図１６は、クエリから分散キーセットを（静的に）抽出する動作の例を示す図である。このフローは、特定のクエリＱ１についてのフローを示しているが、その他のクエリについても同様の動作を行うことができる。
【０１４５】
ステップ１６３２は、ステップ１６４８と対をなしており、複数のクエリの各々に対して、この２つのステップの間の処理を行うことを意味する。以下、クエリＱ１を例として、分散キーとなり得るものが、関数（式）である例を取り上げて説明する。なお、クエリを定義するプログラムから分散キーを抽出する一般的な手法は、例えば、データベースにおいて並列ハッシュ結合の処理において使用されるハッシュ関数に適用され得る分散キーの抽出に準ずる。他に集約結果のグルーピングオペレータ（group by）から分散キーを抽出する方法も一般的な手法である。このため、以下の例では、本実施形態に特有の例を取り上げて説明することとする。
【０１４６】
ステップ１６３４で、静的プロパティ関係抽出部１１３０は、クエリＱ１の全ての分散キーを取得する。図１６には、クエリ１を定義するプログラムの例が示されている。この例では、イベント列Ｅ１を入力とし、イベント列Ｅ２を出力することが分かる。そして、「GROUP BY A/2」のシンタクスから、関数Ａ／２が分散キーとして抽出される。
【０１４７】
ステップ１６３８で、静的プロパティ関係抽出部１１３０は、抽出された分散キーが、イベントのプロパティそのものであるかを判断する。クエリＱ１のプログラムから抽出されるプロパティは、イベントＥ１のプロパティＡである。これに対して、抽出された分散キーは、上述のように関数Ａ／２である。したがって、この場合には、抽出された分散キーは、イベントのプロパティとは異なる。したがって、この例の場合には、「いいえ」となり、ステップ１６４２に進む。判断が「はい」であれば、ステップ１６４０に進む。
【０１４８】
ステップ１６４２で、関数精度算出部１１５６は、分散キーを表す仮想的なプロパティ（例えばＫ）と、関数（式）、多重度、確率を、プロパティ関係テーブル１６１０に登録する。
【０１４９】
ステップ１６４４で、仮想的プロパティＫを分散キーテーブル１６２０に登録する。
【０１５０】
ここで、仮想的なプロパティＫをイベント２のプロパティの欄に登録する意味は、抽出された関数が、複数のプロパティとの関係を示すものであることに起因する。したがって、仮想的なプロパティＫを置き、Ｋ＝Ａ／２という関係を作り、プロパティ関係テーブル１６１０に登録しておくことが望ましい。その理由について、図２６を用いて説明する。
【０１５１】
図２６は、クエリの正規化（分散キーセットの正規化）の例を示している。図２６のクエリ２６１２は、図１６のクエリプログラムと同様の例を示している。
【０１５２】
ステップ２６０２で、関数精度算出部１１５６は、クエリＱ１の分散キーのうち、関数（式）を使用した分散キーを取得する。この場合には、関数（式）Ａ／２が取得される。
【０１５３】
ステップ２６０４で、関数精度算出部１１５６は、分散キーがプロパティとして存在するように、SELECT句に仮想的なプロパティＫを追加し、クエリＱ１を２つのクエリプログラム２６１４に書き換える。
【０１５４】
クエリプログラム２６１４の２番目のクエリを定義するクエリプログラムにおいて、SELECT *, A/2 as Kが存在する。したがって、TempStrという仮想的なストリーム中に、プロパティＫが存在する。そして、２番目のクエリから、関数（式）Ｋ＝Ａ／２が抽出される。この２番目のクエリの次に１番目のクエリが実行される。２番目のクエリは、TempStrが入力イベント列となり、出力イベントOutStrを出力する。このように、クエリを書き換えることで、仮想的なプロパティＫを利用することの正当性が証明できる。また、このような仮想的なプロパティを用いることによって、プロパティ関係テーブル及び分散キーテーブルに一貫性を持たせることができる。そして、プロパティ関係テーブル及び分散キーテーブルの取り扱いが統一化できる。
【０１５５】
図１６に戻る。ステップ１６４０で、静的プロパティ関係抽出部１１３０は、分散キーのプロパティを分散キーテーブルに登録する。
【０１５６】
以上の動作によって、クエリプログラムから、分散キー、及び分散キーを生成する際に利用可能な関数が抽出され、テーブル記憶部１１６０に記憶される。
【０１５７】
図１７は、共通分散キー特定部１１５０が、分散グループに属する複数のクエリの共通分散キーを抽出する例を示している。図１７では、前提として、既に分散グループＧ１が作成されており、この分散グループＧ１に後続するクエリＱ２がある場合を想定している。そして、分散グループＧ１にクエリＱ２を所属させる動作を示している。加えて、グループＧ１にＱ２が属することとなる場合の共通分散キーセットをＲとする。なお、グループＧ１が未だ作成されていない場合は、グループＧ１に１つのクエリＱ１が所属しているものとする。
【０１５８】
ステップ１７０２で、共通分散キー生成部１１５４は、グループＧ１にＱ２を所属させたときの分散キー（共通分散キー）を記憶するＲを初期化する。したがって、Ｒは空集合となる。
【０１５９】
ステップ１７４０は、ステップ１７１２との間でループ処理される。具体的には、共通分散キー生成部１１５４は、グループＧ１の入力イベントＥ１とＱ２の入力イベントＥ２とに関連する全てのプロパティ間の関係について、処理を実行する。
【０１６０】
ステップ１７０４は、ステップ１７１２と対になっており、必要な処理を複数回繰り返す。具体的には、共通分散キー生成部１１５４は、グループＧ１の入力イベントＥ１とＱ２の入力イベントＥ２に関する全ての関係を網羅的に処理する。
【０１６１】
ステップ１７０６で、共通分散キー生成部１１５４は、E2.Z=F(E.A, E1.B,..)という関係が存在するかを判断する。ここで、E2.Zとは、イベントＥ２におけるプロパティＺを意味する。また、Ｆ（Ｘ）は、Ｘに所定の処理を実行する関数を意味する。この処理では、共通分散キー生成部１１５４は、静的プロパティ関係抽出部１１３０において既に作成されたプロパティ関係テーブルを参照する。この判断で、イベントＥ２のプロパティとイベントＥ１のプロパティとの間に関係が存在する場合には（はい）、ステップ１７０８に進む。「いいえ」の場合には、ステップ１７１２に進む。
【０１６２】
ステップ１７０８で、関数Ｆの引数｛E.A, E1.B,..｝が、グループＧ１の分散キーのサブセットで、かつE2.ZがＱ２の分散キーか否かが判断される。この判断が「はい」であれば、ステップ１７１０に進む。この判断が「いいえ」であれば、ステップ１７１２に進む。このステップにおいて、判断が「はい」であれば、関数ＦをグループＧ１とＱ２の共通の分散キーとして利用できる可能性がある。
【０１６３】
ステップ１７１０で、見つかった関係を解析し、その結果を分散キーセットＲに追加する。具体的には、例えば、関数としてＢ＝Ａ／２の関係が見つかった場合であって、ＡがグループＧ１の分散キーのサブセットであり、かつ、ＢがＱ２の分散キーである場合が挙げられる。この場合には、Ｂは、グループＧ１及びＱ２の両者の分散キーとなり得る資格を有する。なお、この処理において、更にグループＧ１に分散キーとしての関数Ｇが存在する場合の詳細は、図１８を用いて説明する。
【０１６４】
ステップ１７１４で、処理結果の分散キーセットＲを返す。
【０１６５】
図１８は、抽出された関数を解析する例（ステップ１７１０のうち、グループＧ１においても関数Ｇが分散キーとして利用されている場合の詳細処理）を示す。
【０１６６】
ステップ１８０２で、抽出された関数Ｆが単射（すなわち１対１の関数）であるかを判断する。この判断が「はい」であればステップ１８０４に移る。この判断が「いいえ」の場合（すなわち、関数が１対Ｎの関係を示す場合）には、ステップ１８０６に進む。
【０１６７】
ステップ１８０４で、関数Ｆの引数｛E.A, E1.B,..｝を、分散キーに追加する。そして、関数Ｆ自体は、分散キーとして登録しなくてよい。関数Ｆが単射であるため、関数の引数がそのまま、共通の分散キーとして利用できるからである。
【０１６８】
ステップ１８０６で、グループＧ１の分散キーとして、関数Ｇを利用しているかが判断される。関数Ｇは、グループＧ１において、分散キーとして既に利用されている関数であって、関数Ｆと同じ引数を使用している関数を意味する。この判断が「はい」であれば、ステップ１８１０に移る。この判断が「いいえ」であれば、ステップ１８０８に移る。
【０１６９】
ステップ１８０８で、分散キーセットＲに関数の引数｛E.A, E1.B,..｝及び関数Ｆを追加する。この場合には、例えば、関数がＢ＝Ａ／２であれば、関数の引数であるＡと関数Ａ／２を分散キーセットＲに追加する。
【０１７０】
ステップ１８１０で、第３の関数生成部１１５５は、関数Ｆの周期長と関数Ｇの周期長との最小公倍数の周期長を持つ新たな関数Ｈを計算する。なお、関数精度算出部１１５６において、最小公倍数の周期長を持つ関数Ｈとその精度が算出されている場合には、精度の大きい関数Ｈを採用してもよい。なお、関数精度算出部１１５６は、静的プロパティ関係抽出部１１３０の中に存在してもよい。なお、本実施形態は、最小公倍数に限定されるものではなく、公倍数であればよい。
【０１７１】
ステップ８１２で、関数Ｈが見つかったかが判断される。この結果が「いいえ」であれば処理を終了する。この結果が「はい」であれば、ステップ１８１４に移る。
【０１７２】
ステップ１８１４で、分散キーセットＲに、関数の引数｛E.A, E1.B,..｝及び関数Ｈを追加する。
【０１７３】
図１９は、ノード間通信を減少させるための分散キーとして利用できる関数を求める動作の例を示すフローチャートである。この処理は、ステップ１８１０の処理を詳細化した具体例である。なお、図１９は、図１８と同様に関数Ｆと関数Ｇとを用いている。
【０１７４】
ステップ１９０２で、関数Ｆと関数Ｇの両者に周期性があるか否かが判断される。この判断は、具体的には、小数点以下を切り捨てる関数（例えばＡ／２）が挙げられる。この判断が「はい」であれば、ステップ１９０４に移る。この判断が「いいえ」であれば、ステップ１９２０に移る。
【０１７５】
ステップ１９０４で、関数Ｆの周期長Ｎと、関数Ｇの周期長Ｍとを計算する。
【０１７６】
ステップ１９０６で、ＮとＭとが割り切れるか否かが判断される。割り切れる場合には（はい）、ステップ１９１２に移る。割り切れない場合には（いいえ）、ステップ１９０８に移る。
【０１７７】
ステップ１９０８で、ＮとＭとの最小公倍数Ｓ＝ＬＣＭ（Ｎ，Ｍ）を計算する。ＬＣＭは、最小公倍数を求める関数を意味する。
【０１７８】
ステップ１９１０で、周期長＝Ｓを切れなくカバーする関数を関数Ｈとしてプロパティ関係テーブルに設定する。ＮとＭが割り切れない場合には、Ｎの周期の境とＭの周期の境が一致する箇所が存在する。その一致する箇所と、Ｓの周期の境とを一致させるように関数Ｓを求める。この具体例については、図２０を用いて説明する。
【０１７９】
ステップＳ１９１２でＮとＭとの周期にズレがあるかが判断される。この判断が「はい」であればステップ１９１６に移る。この判断が「いいえ」であれば、ステップ１９１４に移る。
【０１８０】
ステップ１９１４で、関数Ｆと関数Ｇのうち周期長の大きい関数を関数Ｈとする。そして、関数Ｈをプロパティ関係テーブルに設定する。
【０１８１】
ステップ１９１６で、ＮとＭとの周期にズレが許容範囲かを判断する。この判断の詳細は、図２１（Ｂ）を用いて説明する。この許容範囲として、関数Ｈの周期長に対するズレの幅の割合が、所定の閾値以下であるかを判断してもよい。この所定の閾値は、第２の閾値の一例である。この判断が「はい」であれば、ステップ１９１８に移る。この判断が「いいえ」であれば、ステップ１９２０に移る。
【０１８２】
ステップ１９１８で、関数Ｆと関数Ｇとのうち周期長の大きい関数を関数Ｈとする。そして、ズレの幅と関数Ｈの周期長に対するズレの幅の割合を確率として、プロパティ関係テーブルに設定する。
【０１８３】
ステップ１９２０で、所望の関数Ｈは存在しないため、処理を終了する。
【０１８４】
以上のようにして、関数Ｆと関数Ｇとから、ノード間通信を減少させるための分散キーとして利用できる関数Ｈを求めることができる。
【０１８５】
図２０は、２つの関数の周期長が割り切れない場合に、ノード間通信を減少させるための分散キーとして利用できる関数Ｈを求める例を示している。
【０１８６】
欄２００１は、共通に用いられる引数としてのプロパティＡの値を示す。欄２００２は、関数Ｆ（Ａ）＝Ａ／２の取り得る値を示す。欄２００３は、関数Ｇ（Ａ）＝（Ａ＋１）／３の取り得る値を示す。関数Ｆは、周期長２０１４を持つ。関数Ｇは、周期長２０１６を持つ。関数Ｆと関数Ｇの取り得る値の共通の境は、Ａが１と２の間、及びＡが７と８の間に存在する。
【０１８７】
関数Ｆの周期長と関数Ｇの周期長の最小公倍数の周期長を持つ関数は、複数存在する。例えば、Ｈ（Ａ）＝（Ａ＋Ｌ）／６がある。ここで、Ｌは、任意の整数である。例えば、Ｌについて、０から＋１ずつインクリメントし、関数Ｈ（Ａ）の周期の境が関数Ｆと関数Ｇの周期の境に一致するときのＬの値を探索すればよい。図２０の例では、Ｈ（Ａ）＝（Ａ＋４）／６又はＨ（Ａ）＝（Ａ−２）／６のときに、関数Ｈ（Ａ）の周期の境が関数Ｆと関数Ｇの周期の境に一致する。このようにして探索されたＨ（Ａ）を分散キーとして用いれば、２つのクエリを１つの分散グループに、適切に所属させることができる。
【０１８８】
図２１は、２つの関数の周期長が割り切れる関係にある場合の例を示している。図２１（Ａ）は、関数Ｆ（Ａ）の周期の境と、関数Ｇ（Ａ）の周期の境が一致している例を示している。欄２１０１は、プロパティＡの値を示している。欄２１０２、２１０３、２１０４は、それぞれ関数Ｆ（Ａ）、Ｇ（Ａ）、Ｈ（Ａ）の値を示している。この場合には、両関数にズレが無いため、ステップ１９１４で説明したように、２つの関数のうち、周期長の長い関数と同じ関数を関数Ｈ（Ａ）として採用すればよい。
【０１８９】
図２１（Ｂ）は、両関数にズレがある場合の例である。欄２１１１は、プロパティＡの値を示している。欄２１１２、２１１３、２１１４は、それぞれ関数Ｆ（Ａ）、Ｇ（Ａ）、Ｈ（Ａ）の値を示している。両関数の周期長が割り切れるため、ズレが周期的に発生する。この場合には、２つの関数の周期長のうち長い方の周期長の関数と同じ関数を関数Ｈ（Ａ）として採用することができる。図２１（Ｂ）の場合には、２つのクエリを同一の分散グループに所属させて、複数ノードに配備した場合、例えば、Ａの値が２のときに、ノード間での転送が発生する。この転送の発生する割合の平均は、Ｈ（Ａ）の周期長が４であることから、１／４となる。したがって、Ｈ（Ａ）を分散キーとして用いた場合の関数精度は、３／４すなわち、７５％となる。この７５％が許容できる精度であれば、Ｈ（Ａ）を共通分散キーとして採用することができる。この判断には、精度が、所定の閾値を超えるか否かを判断すればよい。この所定の閾値は、第２の閾値の一例である。
【０１９０】
なお、本実施形態では、周期性を持つ関数Ｆ、Ｇ、及びＨについて、例示を行ったが、これらの関数は、周期性を有する関数に限られない。関数は、周期性のある関数以外に拡張可能である。以下に、拡張された関数への応用についての例を挙げる。
【０１９１】
たとえば、同じ引数を持つクエリＱ１が関数Ｆを分散キーとして持ち、クエリＱ２が関数Ｇを分散キーとして持ち、かつ、関数Ｆと関数Ｇが同じ引数を持つ場合を想定する。そして、クエリＱ１とクエリＱ２とを、同じ分散グループに所属させ、複数のノードに並列分散させる場合を想定する。この場合において、関数Ｈで、入力イベント列をハッシングした場合に、ノード間での通信の発生割合が許容限度内になるような関数Ｈを採用すればよい。
【０１９２】
図２２は、クエリを分散グループに所属させる例を示している。図２２（Ａ）に示すように、データストリームとしてのイベント列Ｅ１のプロパティは｛Ａ，Ｃ｝である。クエリＱ１は、イベント列Ｅ１を入力とし、イベント列Ｅ２を出力する。クエリＱ２は、イベント列Ｅ２を入力とし、イベント列Ｅ３を出力する。クエリＱ３は、イベント列Ｅ３を入力とし、イベント列Ｅ４を出力する。クエリＱ１は、クエリプログラム２２０１で定義されている。クエリＱ２は、クエリプログラム２２０２で定義されている。クエリＱ３は、クエリプログラム２２０３で定義されている。
【０１９３】
図２２（Ｂ）は、図２２（Ａ）に対する分散キーテーブル２２１０を示している。図２２（Ｃ）は、図２２（Ａ）に対するプロパティ関係テーブル２２２０を示している。
【０１９４】
図２３は、クエリを分散グループに所属させる例を示している。図２２（Ａ）に示すように、クエリＱ１が、既に分散グループＧ１（２３０１）に所属している。そして、クエリＱ２を分散グループに所属できるか否かを検討している段階が示されている。
【０１９５】
図２２（Ｂ）に戻る。クエリＱ１の分散キーセットは、｛Ａ，Ｃ｝であり、クエリＱ２の分散キーセットは｛Ｂ｝である。両者には共通した分散キーセットが存在しない。したがって、分散キーテーブル２２１０のみからは、Ｑ１が所属する分散グループに、Ｑ２を所属させることができない。
【０１９６】
そこで、図２２（Ｃ）のプロパティ関係テーブル２２２０から、以下の関係が抽出される。
E2.B=F(E1.A)=E1.A/2
このため、クエリＱ１は、さらに関数Ａ／２を分散キーとして持つことが分かる。このことはステップ１７０６における判断が「はい」であることを意味する。しかも、この関数Ａ／２は、Ｂに等しく、かつＱ２の分散キーでもある。このことは、ステップ１７０８における判断が「はい」である場合に該当する。そして、ステップ１７１０で、分散キーとして、関数Ａ／２（すなわちＢ）も分散キーとして認識される。
【０１９７】
したがって、図２３（Ｂ）に示すように、グループＧ１に、クエリＱ１及びクエリＱ２を所属させたことを分散グループ一覧に保存する。
【０１９８】
図２３（Ｃ）は、分散グループごとの分散キー一覧に、分散キーの欄には、Ａを記入し、関数の欄には、Ａ／２を記入する。この場合、関数の欄に記入されたＡ／２も、分散キーとしての役割を果たす。
【０１９９】
図２４は、更なるクエリＱ３を分散グループに所属させる例を示している。この場合は、イベントＥ３にもプロパティが含まれているため、以下の関係が成り立つ。
E3.B=E2.B=E1.A/2
このことは、同様に、ステップ１７０６の判断が「はい」であり、ステップ１７０８の判断も「はい」である。したがって、分散グループごとの分散キー一覧には、図２４（Ｂ）の情報が追記される。そして、Ｑ１、Ｑ２、及びＱ３は、同一の分散部ループに所属させることができる。
【０２００】
図２５は、入力イベントのプロパティ間の動的関係を利用して分散グループを作る例を示している。既にＱ２とＱ３は同じ分散グループ２５３０に所属している。しかしながら、イベント列Ｅ１（２５１０）に示すように、クエリＱ１の分散キーはＡである。そして、イベント列Ｅ２（２５２０）に示すように、分散グループ２５３０の分散キーはＢである。この場合、クエリＱ１と分散グループ２５３０の分散キーが異なるため、クエリＱ１を分散グループ２５３０に所属させることができない。
【０２０１】
しかしながら、イベント列Ｅ１（２５４０）のプロパティＡとＢとの間には、関係が存在する。この例の場合には、Ｂ＝Ａ／２という関係が成り立っている。このことは、Ｑ１の分散キーは、Ａのみではなく、Ｂも分散キーであることを示している。したがって、
Ｑ１と分散グループ２５３０とは、共通の分散キーＢを持つこととなる。したがって、分散グループ２５５０にＱ１、Ｑ２、及びＱ３を所属させることができる。
【０２０２】
なお、この場合には、イベントＥ１のプロパティＡとＢとの動的な関係を用いたため、その関係の確率は１００％とはならない場合が多い。しかしながら、この関係の確率が許容レベル以上であれば、上記のように分散グループ２５５０を作って、このノードを複数の並列分散されたノードに配備しても、ノード間の通信量は、許容レベル内となることが推定できる。
【０２０３】
図２６については、図１６の説明において詳細を説明した。
【０２０４】
図２７は、分散グループに所属させる動作の他の例を示す図である。
【０２０５】
ステップ２７０２は、ステップ２７２０との間で処理を実行する。そして、図２７にっしめすフローは、再帰的に実行される点に留意すべきである。このフローでは、未処理のクエリを「残クエリ一覧（Ｒ）」に記憶しておく。そして、処理が終了したクエリは、残クエリ一覧（Ｒ）から消去する。残クエリ一覧（Ｒ）が空となるまで、再帰的な処理が繰り返される。
【０２０６】
ステップ２７０４で、共通分散キー特定部１１５０は、グループＧとグループに接続されたクエリＱの両方に共通に利用できる分散キーセットＳを計算する。なお、グループＧが作られていない場合には、例えばデータストリームの最初に存在するクエリをグループＧに所属するとして処理を行ってもよい。
【０２０７】
ステップ２７０６で、共通分散キー特定部１１５０は、その結果（Ｓ）が少なくとも１つの分散キーが存在するかが判断される（すなわち、Ｓが空でないことを判断する）。この判断が「はい」であればステップ２７０８に移動する。この判断が「いいえ」であれば、ステップ２７２０に進んで、ループを繰り返す。
【０２０８】
ステップ２７０８で、共通分散キー特定部１１５０は、結果Ｓが、グループＧの分散キーセットと同じかが判断される。この判断が「はい」であればステップ２７１０に進む。この判断が「いいえ」であればステップ２７１６に進む。
【０２０９】
ステップ２７１０で、共通分散キー特定部１１５０は、クエリＱをグループＧに追加する。この場合には、グループＧとクエリＱが同じ分散キーを持つため、クエリＱをグループＧに所属させることができる。しかも、グループＧの分散キーを変更しなくてもよい。
【０２１０】
ステップ２７１２で、クエリＱを経由してグループＧに繋がる残クエリ一覧（Ｒ）を取得する。
【０２１１】
ステップ２７１４で、共通分散キー特定部１１５０は、残クエリ一覧（Ｒ）のうち、グループＧと共通に利用できる分散キーセットを持ったクエリをグループＧに追加する。そして、ステップ２７０２を再帰的に実行する。
【０２１２】
ステップ２７１６で、共通分散キー特定部１１５０は、計算結果の分散キーセットＳを使ったグループＧ２を作成する。なお、クエリＱに繋がる、分散キーセットＳを持ったグループが既に作成済みの場合には、グループＧ２を新たに作成せず、既存のグループにクエリを追加すればよい。
【０２１３】
ステップ２７１８で、共通分散キー特定部１１５０は、クエリＱとグループＧの全クエリをグループＧ２に追加する。そして、グループＧ２の分散キーセットはＳである。
【０２１４】
以上の処理を行うことによって、共通分散キー特定部１１５０は、全てのクエリを、１つ以上の分散グループに所属させることができる。
【０２１５】
そして、クエリ配備部は、１つ以上の分散グループが作成された後、複数のノードに作成された分散グループに所属するクエリを配備することができる。
【０２１６】
図２８は、本発明の実施形態のハードウェア（コンピュータ）の構成例を示している。ハードウェアは、ＣＰＵ２８１０、メモリ２８１５、入力装置２８２０、出力装置２８２５、外部記憶装置２８３０、可搬記録媒体駆動装置２８３５、ネットワーク接続装置２８４５が含まれる。そして、それぞれの機器は、バス２８５０によって接続されている。また、可搬記録媒体駆動装置２８３５は、可搬記録媒体２８４０を読み書きすることができる。そして、ネットワーク接続装置２８４５には、ネットワーク２８６０が接続されている。
【０２１７】
なお、本実施形態の全部又は一部はプログラムによってインプリメントされ得る。このプログラムは、可搬記録媒体２８４０に格納することができる。可搬記録媒体２８４０とは、非一時的（non-transitory）な記憶媒体を言う。例示として、可搬記録媒体２８４０としては、磁気記録媒体、光ディスク、光磁気記録媒体、不揮発性メモリなどがある。磁気記録媒体には、ＨＤＤ、フレキシブルディスク（ＦＤ）、磁気テープ（ＭＴ）などがある。光ディスクには、ＤＶＤ（Digital  Versatile  Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact  Disc-Read  Only  Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。また、光磁気記録媒体には、ＭＯ（Magneto-Optical  disk）などがある。可搬型記録媒体に格納されたプログラムが読み込まれ、ＣＰＵによって実行されることにより、本発明の実施形態の全部又は一部が実施され得る。
【符号の説明】
【０２１８】
１１００  データストリーム処理の並列化システム
１１１０  プロパティ関係抽出部
１１２０  動的プロパティ関係抽出部
１１２２  入力イベント保存部
１１２４  関係確率算出部
１１２６  関係特定部
１１３０  静的プロパティ関係抽出部
１１３４  関数特定部
１１５０  共通分散キー特定部
１１５２  分散キー抽出部
１１５４  共通分散キー生成部
１１５５  第３の関数生成部
１１５６  関数精度算出部
１１６０  テーブル記憶部
１１７０  クエリ配備部
【図１】
0006028857.tif 000002
【図２】
0006028857.tif 000003
【図３】
0006028857.tif 000004
【図４】
0006028857.tif 000005
【図５】
0006028857.tif 000006
【図６】
0006028857.tif 000007
【図７】
0006028857.tif 000008
【図８】
0006028857.tif 000009
【図９】
0006028857.tif 000010
【図１０】
0006028857.tif 000011
【図１１】
0006028857.tif 000012
【図１２】
0006028857.tif 000013
【図１３】
0006028857.tif 000014
【図１４】
0006028857.tif 000015
【図１５】
0006028857.tif 000016
【図１６】
0006028857.tif 000017
【図１７】
0006028857.tif 000018
【図１８】
0006028857.tif 000019
【図１９】
0006028857.tif 000020
【図２０】
0006028857.tif 000021
【図２１】
0006028857.tif 000022
【図２２】
0006028857.tif 000023
【図２３】
0006028857.tif 000024
【図２４】
0006028857.tif 000025
【図２５】
0006028857.tif 000026
【図２６】
0006028857.tif 000027
【図２７】
0006028857.tif 000028
【図２８】
0006028857.tif 000029