(58)【調査した分野】(Int.Cl.,DB名)
プロセッサと、ストリーム処理を実行するストリームプログラム、バッチ処理を実行するバッチプログラム、および前記ストリームプログラムを制御するストリーム処理制御プログラムを記憶するメモリと、を有するデータ処理装置であって、
前記プロセッサは、
前記ストリーム処理制御プログラムにより、時系列なストリームデータ列のうちあるストリームデータからの時系列な第1のストリームデータ群について、当該第1のストリームデータ群の各ストリームデータを要素としてまとめた第1のベクトルデータを生成する第1の生成手順と、
前記ストリーム処理制御プログラムにより、前記時系列なストリームデータ列のうち前記第1のストリームデータ群の中途のストリームデータを先頭とし、かつ、前記第1のストリームデータ群と同数のデータ数である時系列な第2のストリームデータ群について、当該第2のストリームデータ群の各ストリームデータを要素としてまとめた第2のベクトルデータを生成する第2の生成手順と、
前記ストリーム処理制御プログラムにより、前記第1の生成手順および前記第2の生成手順によって生成された第1のベクトルデータおよび第2のベクトルデータを前記バッチプログラムに入力してバッチ処理を実行させる制御手順と、
を実行することを特徴とするデータ処理装置。
プロセッサと、バッチ処理を実行するバッチプログラム、ストリーム処理を実行するストリームプログラム、および前記バッチプログラムを制御するバッチ処理制御プログラムを記憶するメモリと、を有するデータ処理装置であって、
前記プロセッサは、
前記バッチ処理制御プログラムにより、時刻ごとの値である要素列を含むベクトルデータから、前記要素列内の第1の要素群の各要素を分割して時系列にした第1のストリームデータ群を生成する第1の生成手順と、
前記バッチ処理制御プログラムにより、前記要素列のうち前記第1の要素群の中途の要素を先頭とし、かつ、前記第1の要素群と同数の要素数である時系列な第2の要素群について、当該第2の要素群の各要素を分割して時系列にした第2のストリームデータ群を生成する第2の生成手順と、
前記バッチ処理制御プログラムにより、前記第1の生成手順および前記第2の生成手順によって生成された第1のストリームデータ群および第2のストリームデータ群を前記ストリームプログラムに入力してストリーム処理を実行させる制御手順と、
前記バッチ処理制御プログラムにより、前記第1のストリームデータ群が前記ストリームプログラムに入力されて前記制御手順によってストリーム処理が実行された実行結果である第3のストリームデータ群のストリームデータを取得し、前記第2のストリームデータ群が前記ストリームプログラムに入力されて前記制御手順によってストリーム処理が実行された実行結果である第4のストリームデータ群を取得し、当該第4のストリームデータ群から前記第3のストリームデータ群のストリームデータと重複するストリームデータを除外した除外後のストリームデータ群を第2のベクトルデータに変換する変換手順と、
を実行することを特徴とするデータ処理装置。
プロセッサと、ストリーム処理を実行するストリームプログラム、バッチ処理を実行するバッチプログラム、および前記ストリームプログラムを制御するストリーム処理制御プログラムを記憶するメモリと、を有するデータ処理装置が実行するデータ処理方法であって、
前記プロセッサは、
前記ストリーム処理制御プログラムにより、時系列なストリームデータ列のうちあるストリームデータからの時系列な第1のストリームデータ群について、当該第1のストリームデータ群の各ストリームデータを要素としてまとめた第1のベクトルデータを生成する第1の生成手順と、
前記ストリーム処理制御プログラムにより、前記時系列なストリームデータ列のうち前記第1のストリームデータ群の中途のストリームデータを先頭とし、かつ、前記第1のストリームデータ群と同数のデータ数である時系列な第2のストリームデータ群について、当該第2のストリームデータ群の各ストリームデータを要素としてまとめた第2のベクトルデータを生成する第2の生成手順と、
前記ストリーム処理制御プログラムにより、前記第1の生成手順および前記第2の生成手順によって生成された第1のベクトルデータおよび第2のベクトルデータを前記バッチプログラムに入力してバッチ処理を実行させる制御手順と、
を実行することを特徴とするデータ処理方法。
【発明を実施するための形態】
【0017】
本発明は、バッチ処理およびストリーム処理について、一方の処理基盤と当該一方の処理基盤上で他方の処理のプログラムを実行する場合、時系列データに重なりを持たせて他方の処理を実行する。これにより、一方の処理基盤上で実行する他方の処理のプログラムのコードやアルゴリズムを変更することなく、一方の処理基盤上で他方の処理のプログラムを実行可能にする。
【0018】
したがって、既存のプログラムを処理が異なる処理基盤上で流用することができ、容易かつ効率的にプログラムを実行することができる。以下、ストリーム処理基盤上でバッチプログラムを実行する例(実施例1)と、バッチ処理基盤上でストリームプログラムを実行する例(実施例2)と、に分けて説明する。
【0019】
なお、本明細書において「プログラム」や「処理基盤」を主語として説明を行う場合があるが、プログラムや「処理基盤」は、プロセッサによって実行されることで定められた処理をメモリ及び通信ポート(通信制御デバイス)を用いながら行うため、プロセッサを主語とした説明としてもよい。また、プログラムを主語として開示された処理は計算機が行う処理としてもよい。また、プログラムの一部または全ては専用ハードウェアによって実現されてもよい。
【0020】
(実施例1)
図1および
図2は、ストリーム処理基盤上でバッチプログラムを実行する例を示す説明図である。
図1は、データの重なりを持たせない場合の実行例である。バッチプログラムは、ウィンドウ幅となるデータ数が4個、スライドさせるデータ数であるスライド数が2個となるプログラム構成とする。なお、時刻の単位は、一例として「秒」とする。ストリーム処理基盤は、ウィンドウ幅4個のストリームデータを2個ずつスライドさせながら、所定の計算を実行する。
【0021】
時刻1:03において、ストリーム処理基盤は、ストリームTOベクトル変換100により、時刻1:00〜1:03のストリームデータ列101を、データブロックであるベクトルデータ102に変換する。これにより、ストリーム処理基盤は、ベクトルデータ102をバッチプログラムBPに与え、バッチプログラムBPはベクトルデータ102を用いて計算を実行する。なお、スライド数が2個であるため、つぎに対象となるストリームデータ列は、時刻1:05のストリームデータ列103である。
【0022】
時刻1:05のストリームデータ列103は、時刻1:02および1:03のストリームデータを含むため、ストリームデータ列101と重なる。ストリーム処理基盤は、データの重なりを持たせないので、ストリームTOベクトル変換100により、ストリームデータ列103をベクトルデータ104に変換することができない。したがって、ストリーム処理基盤は、ベクトルデータ104をバッチプログラムBPに与えることができず、バッチプログラムBPはベクトルデータ104を用いた計算を実行することができない。なお、スライド数が2個であるため、つぎに対象となるストリームデータ列は、時刻1:07のストリームデータ列105である。
【0023】
時刻1:07のストリームデータ列105は、ストリームデータ列101内のストリームデータと重ならない。ストリーム処理基盤は、変換後のベクトルデータにおいてデータの重なりを持たせないので、ストリームデータ列105が与えられると、ストリームTOベクトル変換100により、ベクトルデータ106に変換する。これにより、ストリーム処理基盤は、ベクトルデータ106をバッチプログラムBPに与え、バッチプログラムBPはベクトルデータ106を用いて計算を実行する。
【0024】
図2は、データの重なりを持たせる場合の実行例である。バッチプログラムのプログラム構成は、
図1と同様である。また、
図2では、プラットフォーム要件であるレスポンスを16秒とする。レスポンスとは、ストリームデータが入力されてから処理が完了するまでの時間である。
【0025】
ストリーム処理基盤は、プログラム構成とプラットフォーム要件とに基づいて、入力データサイズと重なり幅を決定する。入力データサイズとは、変換されるベクトルデータに含まれるストリームデータの個数である。ここでは、8個とする。また、重なり幅を
図1と同様2個とする。
【0026】
まず、時刻1:03において、ストリーム処理基盤は、ストリームTOベクトル変換100により、時刻0:56〜1:03のストリームデータ列201を、データブロックであるベクトルデータ202に変換する。これにより、ストリーム処理基盤は、ベクトルデータ202をバッチプログラムBPに与え、バッチプログラムBPはベクトルデータ202を用いて計算を実行する。なお、スライド数が2個であるため、つぎに対象となるストリームデータ列は、時刻1:05のストリームデータ列203である。
【0027】
時刻1:05のストリームデータ列203は、時刻0:58〜1:03のストリームデータを含むため、ストリームデータ列201との重なり幅は6個となる。設定された重なり幅である2個を超えたため、時刻1:05では、ストリーム処理基盤は、ストリームTOベクトル変換100により、ストリームデータ列203をベクトルデータに変換しない。なお、スライド数が2個であるため、つぎに対象となるストリームデータ列は、時刻1:07のストリームデータ列205である。
【0028】
時刻1:07においても、時刻1:05と同様、時刻1:07のストリームデータ列205は、時刻1:00〜1:03のストリームデータを含むため、ストリームデータ列201との重なり幅は4個となる。設定された重なり幅である2個を超えたため、時刻1:07でも、ストリーム処理基盤は、ストリームTOベクトル変換100により、ストリームデータ列205をベクトルデータに変換しない。なお、スライド数が2個であるため、つぎに対象となるストリームデータ列は、時刻1:09のストリームデータ列207である。
【0029】
時刻1:09のストリームデータ列207は、時刻1:02〜1:03のストリームデータを含むため、ストリームデータ列201との重なり幅は2個となる。設定された重なり幅である2個と一致するため、時刻1:09では、ストリーム処理基盤は、ストリームTOベクトル変換100により、ストリームデータ列207をベクトルデータ208に変換する。これにより、ストリーム処理基盤は、ベクトルデータ20
8をバッチプログラムBPに与え、バッチプログラムBPはベクトルデータ208を用いて計算を実行する。
【0030】
このように、
図2の例では、ベクトルデータ202,208間でデータの重なりを持たせることができるため、
図1のベクトルデータ104のような計算実行不可という状態を回避することができ、バッチプログラムのセマンティックスを保持することができる。また、設定された重なり幅分のデータだけが重複するように、ベクトルデータのデータサイズが決定される。
図2の例では、時刻1:05、1:07において、ベクトルデータは生成されない。このベクトルデータを生成しなくても、ベクトルデータ202、208で網羅できるからである。このように、重なり幅を超えるベクトルデータの生成を抑制することができるため、処理負荷の軽減を図ることができる。
【0031】
<システム構成例>
図3は、ストリーム処理システム300の一例を示すシステム構成図である。ストリーム処理システム300は、クライアント301と、データソース302と、ストリーム処理サーバ303と、が、ネットワークを介して通信可能に接続された構成である。ネットワーク304は、イーサネット(登録商標)、光ファイバなどで接続されるローカルエリアネットワーク(LAN)、またはLANよりも低速なインターネットを含んだワイドエリアネットワーク(WAN)でも差し支えない。また、クライアント301、データソース302、およびストリーム処理サーバ303は、パーソナルコンピュータ(PC)、ブレード型の計算機システムなどの任意のコンピュータシステムでよい。
【0032】
クライアント301は、ストリーム処理サーバ303に対し登録処理を実行する計算機である。登録処理の詳細については後述する。
【0033】
データソース302は、ストリーム処理サーバ303に、処理対象となる一連の時系列データを供給する供給源であり、たとえば、上述した工場のプラントやサーバが挙げられる。工場のプラントの場合、たとえば、機械に取り付けられた温度や電圧などのセンサの値が時系列データとなる。また、サーバの場合、たとえば、サーバのログから得られるCPUやハードディスクの使用量、またはネットワーク304のパケット量が時系列データとなる。
【0034】
ストリーム処理サーバ303は、CPU311、メモリ312、I/Oインターフェース313およびストレージ314が、バス315で結合された計算機である。ストリーム処理サーバ303は、I/Oインターフェース313を介してネットワーク304にアクセスする。また、ストリーム処理サーバ303は、処理結果、処理の中間結果、システム動作に必要な設定データを、不揮発性のストレージ314に格納することができる。ストレージ314は、I/Oインターフェース313を介して直接接続されるが、ストリーム処理サーバ303外において、I/Oインターフェース313によりネットワーク304を介して接続されることとしてもよい。
【0035】
メモリ312には、ストリーム処理基盤321がマッピングされる。ストリーム処理基盤321は、1以上のストリームプログラムであるストリームプログラム群331の起動、停止モジュールやスケジューリングモジュールなど一般的なストリーム処理のモジュールがマッピングされたミドルウェアである。このほかに、ストリーム処理基盤321には、バッチプログラム入出力静的決定部332、バッチプログラム入出力動的決定部333、1以上のバッチプログラムであるバッチプログラム群334を含むバッチプログラム実行部335がマッピングされる。
【0036】
<ストリームプログラム>
図4は、
図3に示したストリームプログラム群331の中のあるストリームプログラムの一例を示す説明図である。ストリームプログラム400は、ストリームデータを入出力とするプログラムである。
図4では、CQL(Continuous Query Language)言語で定義されたストリームプログラム400を示す。ストリームプログラム400は入力ストリーム定義、出力ストリーム定義、およびクエリ定義群を含む。
【0037】
入力ストリーム定義として、「時刻」および「計測値」をカラムとするセンサストリーム401が定義される。また、出力ストリーム定義として、「時刻」および「計測値」をカラムとする異常センサストリーム402が定義される。
【0038】
クエリ定義群は、クエリ定義1とクエリ定義2とを含む。クエリ定義1として、ノイズ除去クエリ403が定義され、クエリ定義2として、異常センサクエリ404が定義される。ノイズ除去クエリ403は、センサストリーム401からストリームデータを入力し、直近4個の計測値の平均値を算出するクエリである。
【0039】
異常センサクエリ404は、ノイズ除去クエリ403で算出された平均値がαより大きい場合に、センサストリーム401のストリームデータを、異常センサストリーム402に出力するクエリである。なお、
図4は、ストリームプログラム400の一例であり、CQL言語の他に、C言語やJava言語やその他の任意のプログラミング言語でストリームプログラム400を定義してもよい。
【0040】
図5は、ストリームデータの一例を示す説明図である。ストリームデータ500〜513は時刻を持ち、ストリーム格納キューQに時刻順に格納される。
図5では、凡例に示すようにカラムとして時刻、計測値を持つストリームデータ500〜513を示す。ストリーム格納キューQには、先頭に時刻「1:00」、計測値「10.0」のストリームデータ50が格納され、続いて時刻「1:01」、計測値「15.0」のストリームデータ501、時刻「1:02」、計測値「14.0」のストリームデータ502が格納される。そしてストリーム格納キューQの最後尾に時刻「1:13」、計測値「12.0」のストリームデータ513が格納される。
【0041】
<バッチプログラム>
図6は、
図3に示したバッチプログラム群334の中のあるバッチプログラムの一例を示す説明図である。バッチプログラム600は、ベクトルデータを入出力とするプログラムである。
図5では、バッチプログラム600は、ベクトルデータの定義とバッチ処理関数とを含む。
【0042】
ベクトルデータ定義として、「時刻」および「計測値」をカラムとするセンサ配列601が定義される。また、バッチ処理関数定義として、前処理関数602が定義される。前処理関数602は、センサ配列601を入力とし、関数SMOOTHINGにより直近3個の計測値に対して重み付き平均を求め、計測値の平滑化を行う関数である。
【0043】
そして、前処理関数602は、平滑化した値に対して、関数DERIVATIONにより現在値と一つ前の値から微分値を算出する。なお、関数DERIVATIONは、ベクトルデータの要素に対してサンプリングを行い、要素数を50%削減する関数である。例えば、時刻1:01、1:02、1:03、1:04、1:05、1:06、1:07、1:08の8個の要素を関数DERIVATIONに入力した場合、関数DERIVATIONは、8個の要素のうち50%を削減する。その結果、時刻1:01、1:03、1:05、1:07の4個の要素が出力される。前処理関数602は、関数DERIVATIONで算出した微分値をセンサ配列601に出力し、処理を終了する。
【0044】
なお、
図6は、バッチプログラム600の一例であり、R言語や、C言語、Java言語やその他の任意のプログラミング言語でバッチプログラム600を定義してもよい。
【0045】
図7は、ベクトルデータの一例を示す説明図である。ベクトルデータVDは複数の要素を持つ集合体である。
図7に示すベクトルデータVDは配列として実現され、配列の各要素は時刻と計測値の値を持つ。配列の要素として、インデックス0に時刻「0:58」、計測値「11.0」の要素700を持ち、インデックス1に時刻「0:59」、計測値「14.0」の要素701、インデックス2に時刻「1:00」、計測値「10.0」の要素702、最後にインデックス7に時刻「1:05」、計測値「12.0」の要素707を持つ。なおベクトルデータVDの実現方法は、配列の他にリストやその他のデータ構造でもよい。
【0046】
<バッチプログラム入出力静的決定部332>
図8は、
図3に示したバッチプログラム入出力静的決定部332の入出力関係を示す説明図である。バッチプログラム入出力静的決定部332は、ストリーム処理基盤321上でCPU311により実行されるプログラムであり、バッチプログラム600の静的な入出力設定を決定する。バッチプログラム入出力静的決定部332は、第1の静的決定部804を有する。
【0047】
第1の静的決定部804は、クライアント301から、プログラム構成801、プラットフォーム要件802、およびバッチ実行仕様803といった登録情報を受け付ける。そして、第1の静的決定部804は、バッチプログラム600の静的な入力データサイズおよび重なり幅を決定する。決定された入力データサイズおよび重なり幅は、バッチプログラム入出力設定として出力される。入力データサイズおよび重なり幅については、後述する。
【0048】
<プログラム構成801>
図9は、
図8に示したプログラム構成801の一例を示す説明図である。プログラム構成801とは、プログラムの動作を構成するパラメータが設定される情報である。パラメータとしては、たとえば、ウィンドウ幅901とスライド数902があり、クライアント301を操作することでユーザにより指定される。
【0049】
ウィンドウ幅901は、ストリームプログラム400やバッチプログラム600の処理に必要とする時系列データを含むウィンドウの幅を示す。ウィンドウの幅とは、すなわち、ウィンドウ内に含まれる時系列データの個数である。スライド数902は、処理毎にウィンドウをスライドさせるサイズである。たとえば、
図4に示したストリームプログラム400では、ノイズ除去クエリ403が直近4個の計測値の平均値を1つずつずらして算出し続けるため、ウィンドウ幅901は4個、スライド数902は1個となる。
【0050】
また、
図5に示したバッチプログラム600では、関数SMOOTHINGにより直近3個の計測値の重み付き平均を求め、また関数DERIVATIONにより現在値と一つ前の値から微分値を算出する。したがって、関数SMOOTHINGと関数DERIVATIONを含む前処理関数602では、合計してウィンドウ幅901は4個となる。また、関数DERIVATIONでは、ベクトルデータVDの要素をサンプリングし50%削減するため、スライド数902は2個となる。
【0051】
<プラットフォーム要件802>
図10は、
図8に示したプラットフォーム要件802の一例を示す説明図である。プラットフォーム要件802は、ストリーム処理基盤321に課される条件である。パラメータとしては、たとえば、レスポンス時間1001があり、クライアント301を操作することでユーザにより指定される。レスポンス時間1001は、データがストリーム処理サーバ303に入力してから、そのデータの処理が完了するまでの、ユーザが許容できる時間である。
図10では、レスポンス時間1001は「16秒」と指定されているため、データの入力からそのデータの処理完了までの時間が16秒まで許容される。
【0052】
<バッチ実行仕様803>
図11は、
図8に示したバッチ実行仕様803の一例を示す説明図である。バッチ実行仕様803とは、バッチ処理の実行方法を規定する情報である。パラメータとして、たとえば、入力レート1101および処理スループット1102があり、クライアント301を操作することでユーザにより指定される。入力レート1101は、バッチプログラム600が入力とするストリームデータが到着する間隔を示す。
図11では入力レート1101は1個/秒であるため、毎秒1個、ストリームデータが到着することを示す。また、処理スループット1102は、バッチプログラム600が単位時間当たりに処理する、ベクトルデータVDの要素数を示す。
図11では、処理スループット1102は1個/秒であるため、バッチプログラム600が毎秒1個の要素を処理できることを示す。
【0053】
<バッチプログラム入出力設定動的決定部>
図12は、
図3に示したバッチプログラム入出力動的決定部333の入出力関係を示す説明図である。バッチプログラム入出力動的決定部333は、ストリーム処理基盤321上でCPU311により実行されるプログラムであり、バッチプログラム600の動的な入出力設定を決定する。バッチプログラム入出力動的決定部333は、バッチ実行モニタリング部1201と、第1の動的決定部1203とを有する。
【0054】
バッチ実行モニタリング部1201は、実行中のバッチプログラム600を監視し、バッチ実行モニタリング値1202を生成する。バッチ実行モニタリング値1202とは、実行中のバッチプログラム600における観測値である。バッチ実行モニタリング値1202については、後述する。
【0055】
第1の動的決定部1203は、クライアント301から、
図9に示したプログラム構成801、
図10に示したプラットフォーム要件802およびバッチ実行モニタリング値1202を受け付ける。そして、第1の動的決定部1203は、バッチプログラム600の動的な入力データサイズおよび重なり幅を決定する。決定された入力データサイズおよび重なり幅は、バッチプログラム入出力設定805として出力される。入力データサイズおよび重なり幅については、後述する。
【0056】
<バッチ実行モニタリング値1202>
図13は、バッチ実行モニタリング値1202の一例を示す説明図である。バッチ実行モニタリング値1202は、パラメータとして、処理対象データ数1301および処理スループット1302を有し、バッチ実行モニタリング部1201により出力される。処理対象データ数1301は、ストリーム格納キューQに格納される、バッチプログラム600が入力とするストリームデータの数を示す。
図13では処理対象データ数1301が「6」であるため、ストリーム格納キューQに6個のストリームデータがあることを示す。また処理スループット1302はバッチプログラム600が単位時間当たりに処理する、ベクトルデータVDの値のサイズを示す。
【0057】
<バッチプログラム入出力設定805>
図14は、
図8および
図12に示したバッチプログラム入出力設定805の一例を示す説明図である。バッチプログラム入出力設定805とは、バッチプログラム600に入出力されるデータを規定する情報である。パラメータとして、たとえば、入力データサイズ1401および重なり幅1402があり、クライアント301を操作することでユーザにより指定される。入力データサイズ1401は、バッチプログラム600が入力するベクトルデータVDの要素数を示す。
【0058】
たとえば、
図7に示したベクトルデータVDの場合は、インデックス0から7の要素700〜707が存在するため、ベクトルデータVDの要素数は8個となる。また、重なり幅1402は、現在のバッチプログラム600が入力するベクトルデータVDと、一つ前のバッチプログラム600が入力するベクトルデータVDで重複する要素数を示す。たとえば、
図7に示したベクトルデータVDをバッチプログラム600が入力する場合に、一つ前のバッチプログラム600が入力するベクトルデータVDにも、インデックス0の要素701およびインデックス1の要素702が含まれている場合には、重なり幅1402は2個となる。
【0059】
<バッチプログラム実行部335>
図15は、
図3に示したバッチプログラム実行部335の入出力の関係を示す説明図である。バッチプログラム実行部335は、入力データ・ストリームTOベクトル変換部1501および出力データ・ベクトルTOストリーム変換部1502を有する。入力データ・ストリームTOベクトル変換部1501は、バッチプログラム入出力設定805を入力する。バッチプログラム入出力設定805は、第1の静的決定部804や、第1の動的決定部1203が生成しても、ユーザにより手動で作成してもよい。
【0060】
そして、入力データ・ストリームTOベクトル変換部1501は、ストリーム格納キューQおよび重なりデータ格納領域1500から複数のストリームデータ列SD1、SD2を入力し、バッチプログラム入出力設定805に従ってストリームデータ列SD1、SD2からベクトルデータVD1に変換する。重なりデータ格納領域1500とは、最新の重なり幅1402となるストリームデータ列SD2が格納される領域である。詳細については後述する。ストリーム格納キューQのストリームデータ列SD1は、ストリームプログラム400が生成しても、その他のプログラムが生成してもよい。
【0061】
バッチプログラム600は、入力データ・ストリームTOベクトル変換部1501が出力したベクトルデータVD1を入力し、その処理結果としてベクトルデータVD2を出力する。そして、出力データ・ベクトルTOストリーム変換部1502が、バッチプログラム600が出力したベクトルデータVD2を入力し、ストリームデータ列SD3に変換する。出力データ・ベクトルTOストリーム変換部1502が出力したストリームデータ列SD3は、ストリーム格納キューQに格納される。続いて、ストリーム格納キューQのストリームデータ列SD3は、ストリームプログラム400が入力してもよく、その他のプログラムが入力してもよい。
【0062】
図16は、重なりデータ格納領域1500の一例を示す説明図である。重なりデータ格納領域1500には、次のバッチプログラムが入力するベクトルデータと、前のバッチプログラム600が入力するベクトルデータとの間で、重複して用いるストリームデータが格納される。
図16では重なりデータ格納領域1500に、時刻「0:58」、計測値「11:0」のストリームデータ1601、時刻「0:59」、計測値「14.0」のストリームデータ1601が格納される。入力データ・ストリームTOベクトル変換部1501が、重なりデータ格納領域1500で保持しているストリームデータを入力し、ベクトルデータを生成する。
【0063】
<バッチプログラム入出力静的決定部332による処理手順>
図17は、バッチプログラム入出力静的決定部332による処理手順例を示すフローチャートである。第1の静的決定部804は、まず、ユーザが指定したプログラム構成801、プラットフォーム要件802、およびバッチ実行仕様803を読込む(S1701)。つぎに、第1の静的決定部804は、重なり幅1402を「ウィンドウ幅−スライド数」としバッチプログラム入出力設定805にセットする(S1702)。
【0064】
ここで、バッチプログラム600の入力となるストリームデータを格納するストリーム格納キューQの先頭データがバッチプログラム600で実行される迄の時間を待ち時間とし、バッチプログラム600が実行されている時間を実行時間とする。第1の静的決定部804は、待ち時間+実行時間がレスポンス時間1001以下であれば、要求したレスポンス時間1001を満たすことができる。
【0065】
待ち時間は「ストリーム格納キューQのデータ数(以下、キューデータ数)/入力レート」であり、実行時間は「キューデータ数/処理スループット」である。したがって、「キューデータ数/入力レート+キューデータ数/処理スループット」がレスポンス時間以下となる必要がある。ストリーム格納キューQにおける処理可能なデータ数(以下、処理可能データ数)は、「キューデータ数/入力レート+キューデータ数/処理スループット≦レスポンス時間」を満たす、最大のキューデータ数となる。
【0066】
このため、処理可能データ数は、[レスポンス時間×処理スループット×入力レート/(処理スループット+入力レート)]となる(ステップS1703)。なお、[]はガウス記号である。
【0067】
処理可能データ数がウィンドウ幅901以上の場合には(S1704:Yes)、第1の静的決定部804は、入力データサイズ1401を処理可能データ数として、バッチプログラム入出力設定805にセットする(ステップS1705)。これにより、レスポンス時間1001の要件を満たしつつ入力データサイズ1401を最大化することができる。一方、処理可能データ数がウィンドウ幅901より小さい場合には(ステップS1704:No)、第1の静的決定部804は、ウィンドウ幅901より要素数が少ないベクトルデータVDをバッチプログラム600は処理可能でないため、入力データサイズ1401をウィンドウ幅901とし、算出した入力データサイズ1401、重なり幅1402をバッチプログラム入出力設定805にセットする(S1706)。
【0068】
たとえば、
図9に示すようにウィンドウ幅901が4個、スライド数902が2個、また
図10に示すようにレスポンス時間1001が16秒、また
図11に示すように入力レート1101が1個/秒、処理スループット1102が1個/秒の場合には、処理可能データ数が16[秒]×1[個/秒]×1[個/秒]/(1[個/秒]+1[個/秒])より8個となる。したがって、ウィンドウ幅901が4個であるため、ウィンドウ幅901よりも処理可能データ数が大きくなり、入力データサイズ1401は処理可能データ数である8個となる。また、重なり幅1402は「ウィンドウ幅901−スライド数902」より、4[個]−2[個]=2個となる。このようにして、
図14に示したバッチプログラム入出力設定805が生成される。
【0069】
<バッチ実行モニタリング部1201による処理手順>
図18は、バッチ実行モニタリング部1201による処理手順例を示すフローチャートである。バッチ実行モニタリング部1201は、バッチプログラム600の入力となるストリームデータを格納するストリーム格納キューQの現在のデータ数を取得し、バッチ実行モニタリング値1202を処理対象データ数1301にセットする(S1801)。つぎに、バッチ実行モニタリング部1201は、ストリーム処理基盤321のログから処理スループット1102を取り出し、バッチ実行モニタリング値1202の処理スループット1102にセットする(S1802)。そして、バッチ実行モニタリング部1201は、ストリーム処理基盤321が終了していなければ(ステップS1803:No)、ステップS1801に戻り、終了していれば(ステップS1803:Yes)、処理を終了する。
【0070】
<第1の動的決定部1203による処理手順>
図19は、第1の動的決定部1203による処理手順例を示すフローチャートである。第1の動的決定部1203は、まずプログラム構成801およびプラットフォーム要件802を読み込む(S1901)。つぎに、第1の動的決定部1203は、重なり幅1402を「ウィンドウ幅901−スライド数」とし、バッチプログラム入出力設定805にセットする(S1902)。
【0071】
そして、第1の動的決定部1203は、処理対象のストリームデータがストリーム格納キューQに入力されるのを待ち受ける(ステップS1903:No)。処理対象のストリームデータがストリーム格納キューQに存在する場合(ステップS1903:Yes)、第1の動的決定部1203は、バッチ実行モニタリング値1202を読込む(S1904)。そして、第1の動的決定部1203は、レスポンス時間1001、処理スループット1102、現在時刻、ストリーム格納キューQのデータの最古時刻から、レスポンス時間1001の要件を満たす最大のストリームデータ数(以下、「処理可能データ数」)を「処理スループット×(レスポンス時間−(現在時刻−処理対象データの最古時刻))」とする(S1905)。
【0072】
このあと、処理可能データ数がウィンドウ幅901以下の場合(ステップS1906:Yes)、第1の動的決定部1203は、バッチプログラム600はウィンドウ幅901より要素数が少ないベクトルデータVDを処理可能でないため、入力データサイズ1401をウィンドウ幅901とし、バッチプログラム入出力設定805にセットする(S1907)。そして、ステップS1911に移行する。
【0073】
一方、処理可能データ数がウィンドウ幅901より大きい場合(ステップS1906:No)、第1の動的決定部1203は、処理可能データ数が処理対象データ数1301+重なり幅1402以下であるか否かを判断する(ステップS1908)。処理可能データ数が処理対象データ数+重なり幅以下である場合(ステップS1908:Yes)、第1の動的決定部1203は、入力データサイズ1401を処理可能データ数とし、バッチプログラム入出力設定805にセットする(S1909)。そして、ステップS1911に移行する。
【0074】
一方、処理可能データ数が処理対象データ数+重なり幅以下でない場合(ステップS1908:No)、第1の動的決定部1203は、入力データサイズ1401を、「処理可能データ数+重なり幅1402」とし、バッチプログラム入出力設定805にセットする(S1910)。そして、ステップS1911に移行する。
【0075】
ステップS1911では、第1の動的決定部1203は、ストリーム処理基盤321が終了したか否かを判断し(ステップS1911)、終了していない場合(ステップS1911:No)、ステップS1903に戻る。一方、終了した場合(ステップS1911:Yes)、第1の動的決定部1203による処理を終了する。
【0076】
<入力データ・ストリームTOベクトル変換部1501による処理手順>
図20は、入力データ・ストリームTOベクトル変換部1501による処理手順例を示すフローチャートである。入力データ・ストリームTOベクトル変換部1501は、バッチプログラム入出力設定を読込む(S2001)。つぎに、入力データ・ストリームTOベクトル変換部1501は、ストリーム格納キューQに、入力データサイズ1401から重なり幅1402を引いた数以上のストリームデータが存在するか否かを判断する(ステップS2002)。
【0077】
入力データサイズ1401から重なり幅1402を引いた数以上のストリームデータが存在しない場合(ステップS
2002:No)、ステップS2001に戻り、ストリームデータが溜まるまで待ち受ける。入力データサイズ1401から重なり幅1402を引いた数以上のストリームデータが存在する場合(ステップS2002:Yes)、入力データ・ストリームTOベクトル変換部1501は、入力データサイズ1401から重なり幅1402を引いた数のストリームデータをストリーム格納キューQから取得する(S2003)。
【0078】
そして、入力データ・ストリームTOベクトル変換部1501は、重なりデータ格納領域1500からストリームデータを取得する(S2004)。入力データ・ストリームTOベクトル変換部1501は、ストリーム格納キューQおよび重なりデータ格納領域1500から取得したストリームデータをベクトルデータVDに変換し(S2005)、そのベクトルデータVDを入力としてバッチプログラム600を起動する(S2006)。その後、入力データ・ストリームTOベクトル変換部1501は、ストリーム格納キューQおよび重なりデータ格納領域1500から取得したストリームデータのうち、より時刻が新しい重なり幅1402の数のストリームデータを重なりデータ格納領域1500に格納する(S2007)。
【0079】
このあと、入力データ・ストリームTOベクトル変換部1501は、ストリーム処理基盤321が終了したか否かを判断し(ステップS2008)、終了していない場合(ステップS2008:No)、ステップS2002に戻る。一方、終了した場合(ステップS2008:Yes)、入力データ・ストリームTOベクトル変換部1501による処理を終了する。
【0080】
<ストリームデータからベクトルデータVDへの変換例>
図21は、ストリームデータからベクトルデータVDへの変換例を示す説明図である。
図21では、
図20のステップ番号を参照して説明する。ステップS2001において、入力データ・ストリームTOベクトル変換部1501は、入力データサイズ1401が8個で重なり幅1402が2個であるバッチプログラム入出力設定805を読込む。
【0081】
ステップS2002において、入力データ・ストリームTOベクトル変換部1501は、ストリーム格納キューQに、入力データサイズ1401から重なり幅1402を引いた数以上のストリームデータが存在するか否かを判断する。入力データサイズ1401(8個)から重なり幅1402(2個)を引いた数は、8−2=6である。ストリーム格納キューQには、時刻1:00〜1:13までの14個のストリームデータ500〜513が格納されているため、入力データサイズ1401(8個)から重なり幅1402(2個)を引いた数(6)以上のストリームデータが格納されている。
【0082】
したがって、ステップS2003において、入力データ・ストリームTOベクトル変換部1501は、時刻1:00〜1:05までの5個のストリームデータ501〜505を、ストリーム格納キューQから取得する。
【0083】
また、ステップS2004において、入力データ・ストリームTOベクトル変換部1501は、重なりデータ格納領域1500から時刻0:58および0:59のストリームデータ1601,1602を取得する。そして、ステップS2005において、入力データ・ストリームTOベクトル変換部1501は、時刻0:58および0:59のストリームデータ1601,1602と、時刻1:00〜1:05までの6個のストリームデータ501〜505とを、インデックス0〜7の要素700〜707を持つベクトルデータVD1に変換する。
【0084】
また、ステップS2007において、入力データ・ストリームTOベクトル変換部1501は、取得した時刻0:59〜1:05までの8個のストリームデータのうち、より時刻が新しい重なり幅1402:2個分のストリームデータを選択する。この場合、時刻1:04および1:05の2個のストリームデータが選択される。
【0085】
そして、入力データ・ストリームTOベクトル変換部1501は、時刻1:04および1:05の2個のストリームデータを、重なりデータ格納領域1500に上書き保存する。これにより、重なりデータ格納領域1500には、時刻0:58および0:59のストリームデータに替わって、時刻1:04および1:05のストリームデータが格納される。したがって、ステップS2003であらたにストリームデータが取得されると、ステップS2004で、重なりデータ格納領域1500から時刻1:04および1:05のストリームデータが取得されることになる。
【0086】
<
出力データ・ベクトルTOストリーム変換部1502による処理手順>
図22は、出力データ・ベクトルTOストリーム変換部1502による処理手順例を示すフローチャートである。出力データ・ベクトルTOストリーム変換部1502は、バッチプログラム600が出力するベクトルデータVDを取得する(S2201)。つぎに、出力データ・ベクトルTOストリーム変換部1502は、ベクトルデータVDから要素を順次取得し、取得した要素に時刻を付加してストリームデータを生成する(ステップS2202)。
【0087】
そして、出力データ・ベクトルTOストリーム変換部1502は、生成したストリームデータを時刻順にストリーム格納キューQに格納する(S2203)。このあと、出力データ・ベクトルTOストリーム変換部1502は、ストリーム処理基盤321が終了したか否かを判断し(ステップS2204)、終了していない場合(ステップS2204:No)、ステップS2201に戻る。一方、終了した場合(ステップS2204:Yes)、出力データ・ベクトルTOストリーム変換部1502による処理を終了する。
【0088】
<ベクトルデータVDからストリームデータへの変換例>
図23は、ベクトルデータVDからストリームデータへの変換例を示す説明図である。
図23では、
図22のステップ番号を参照して説明する。ステップS2201において、出力データ・ベクトルTOストリーム変換部1502は、インデックス0〜2の要素を持つベクトルデータVD2を取得する。
【0089】
そして、ステップS2202およびS2203において、出力データ・ベクトルTOストリーム変換部1502は、要素に対応する時刻1:01、1:03,1:05のストリームデータ2311,2313,2315を生成し、ストリーム格納キューQに格納する。これにより、後段のストリームプログラム400は、ストリーム格納キューQに格納されたストリームデータ2311,2313,2315を取得して、ストリーム処理を実行することができる。
【0090】
このように、実施例1によれば、ベクトルデータ間で重なりを持たせることができるため、計算実行不可という状態を回避することができ、バッチプログラムのセマンティックスを保持することができる。したがって、バッチプログラムのコードやアルゴリズムを変更することなく、ストリーム処理基盤321上でバッチプログラム600を実行することができる。また、重なり幅1402分のデータだけが重複するように、ベクトルデータVDのデータサイズが決定される。このように、重なり幅1402を超えるベクトルデータVDの生成を抑制することができるため、処理負荷の軽減を図ることができる。
【0091】
また、ストリーム処理基盤321上でバッチプログラム600の実行後、実行結果であるストリームデータ群を纏めてベクトルデータに変換するため、ストリーム処理基盤321上で実行される後段のストリームデータに入力データとして与えることができ、ストリーム処理基盤321上でのストリーム処理の効率化を図ることができる。
【0092】
(実施例2)
つぎに、実施例2について説明する。実施例2は、バッチ処理基盤上でストリームプログラム400を実行する例である。なお、実施例1と同一構成には同一符号を付し、その説明を省略する。
【0093】
図24および
図25は、バッチ処理基盤上でストリームプログラムSPを実行する例を示す説明図である。
図24は、データの重なりを持たせない場合実行例である。
図24では、ストリームプログラムSPは、ウィンドウ幅が60個、スライド数が1個となるプログラム構成とする。なお、時刻の単位は、一例として「分」とする。また、バッチ処理基盤は、一例として4時間ごとにバッチ処理を実行するものとする。
【0094】
バッチ処理基盤は、ファイルF内の時刻ごとの値を時刻単位のストリームデータに変換するバッチ処理基盤のベクトルTOストリーム変換2400を実行する。変換されたストリームデータ列2401は、ストリームプログラムSPに入力される。ストリームプログラムSPは、入力されてくるストリームデータ列2401を1個ずつスライドさせながら用いて所定の処理を実行する。
【0095】
データに重なりを持たせないため、時刻4:59での変換後、8:59にバッチ処理をする場合、バッチ処理基盤は、前回である時刻4:59でのデータとは重ならないように、ベクトルTOストリーム変換2400を実行する。すなわち、時刻
8:59では、バッチ処理基盤は、時刻5:00〜8:59までの時刻の値をベクトルTOストリーム変換することにより、ストリームデータ列2402を生成する。
【0096】
ここで、時刻5:00のストリームデータは、時刻8:59でのベクトルTOストリーム変換における先頭データである。したがって、時刻5:00のストリームデータがストリームプログラムSPに入力された場合、ストリームプログラムSPは、時刻4:01〜4:59の59個のストリームデータがないため、時刻5:00のストリームデータについての所定の処理を実行できない。したがって、ストリームプログラムSPが、時刻5:00のストリームデータを処理する場合、直前の59個のストリームデータを与えるか、または、時刻4:59でのストリームデータの計算状態を保持しておく必要がある。
【0097】
図25は、データの重なりを持たせた場合の実行例である。ストリームプログラムSPのプログラム構成は、
図24と同一である。また、ストリームプログラムSPのプラットフォーム要件は、480分とする。
【0098】
バッチ処理基盤は、プログラム構成とプラットフォーム要件とに基づいて、重なり幅または計算状態保持の有無を決定する。バッチ処理基盤は、重なり幅と計算状態保持のいずれを適用するかは、計算処理量を比較した上で選択することになる。重なり幅が適用される場合、バッチ処理基盤は、ベクトルTOストリーム変換2400により、重なり幅分のデータを含めてストリームデータに変換する。
【0099】
時刻8:59の場合、
図24では、ベクトルTOストリーム変換2400は、時刻5:00〜8:59のストリームデータ列2402を生成したが、
図25では、ベクトルTOストリーム変換2400は、時刻5:00の直前の重なり幅59個分のストリームデータを含む時刻4:01〜8:00のストリームデータ列2501を生成する。なお、生成されなかった時刻8:01〜8:59のストリームデータについては、つぎのバッチ処理のタイミングで生成される。
【0100】
また、計算状態保持が適用される場合、時刻4:59でのストリームプログラムSPの計算状態が保持される。また、ベクトルTOストリーム変換2400は、時刻8:59において、
図24と同様、時刻5:00〜8:59のストリームデータ2502を生成し、ストリームプログラムSPに出力する。ストリームプログラムSPは、時刻4:59でのストリームプログラムSPの計算状態と、時刻5:00〜8:59のストリームデータ列2502と、を用いて、所定の処理を実行する。
【0101】
このように、前回のバッチ処理時におけるストリーム処理の実行結果を用いることにより、実質的にストリームデータ間で重なりを持たせることができる。したがって、
図24の例のような計算実行不可という状態を回避することができ、ストリームプログラム400のセマンティックスを保持することができる。
【0102】
<システム構成例>
図26は、バッチ処理システムの一例を示すシステム構成図である。バッチ処理システム2600は、クライアント301と、データソース302と、バッチ処理サーバ2603と、が、ネットワーク304を介して通信可能に接続された構成である。ネットワーク304は、イーサネット(登録商標)、LAN、またはWANでも差し支えない。また、クライアント301、データソース302、およびストリーム処理サーバ303は、PC、ブレード型の計算機システムなどの任意のコンピュータシステムでよい。
【0103】
クライアント301は、バッチ処理サーバ2603に対し登録処理を実行する計算機である。登録処理の詳細については後述する。
【0104】
データソース302は、バッチ処理サーバ2603に、処理対象となる一連の時系列データを供給する供給源であり、たとえば、上述した工場のプラントやサーバが挙げられる。
【0105】
バッチ処理サーバ2603は、I/Oインターフェース2613、CPU2611、メモリ2612およびストレージ2614が、バス2615で結合された計算機である。バッチ処理サーバ2603は、I/Oインターフェース2613を介してネットワーク304にアクセスする。また、バッチ処理サーバ2603は、処理結果、処理の中間結果、システム動作に必要な設定データを、不揮発性のストレージ2614に格納することができる。ストレージ2614は、I/Oインターフェース2613を介して直接接続されるが、バッチ処理サーバ2603外において、I/Oインターフェース2613によりネットワーク304を介して接続されることとしてもよい。
【0106】
メモリ2612には、バッチ処理基盤2621がマッピングされる。バッチ処理基盤2621は、1以上のバッチプログラムであるバッチプログラム群334の起動、停止モジュールやスケジューリングモジュールなど一般的なストリーム処理のモジュールがマッピングされたミドルウェアである。このほかに、バッチ処理基盤2621には、ストリームプログラム入出力設定静的決定部2632、ストリームプログラム入出力設定動的決定部2633、1以上のストリームプログラムであるストリームプログラム群331を含むストリームプログラム実行部2635がマッピングされる。
【0107】
<ストリームプログラム入出力設定静的決定部2632>
図27は、
図26に示したストリームプログラム入出力設定静的決定部2632の入出力関係を示す説明図である。ストリームプログラム入出力設定静的決定部2632は、バッチ処理基盤2621上でCPU2611により実行されるプログラムであり、ストリームプログラム400の静的な入出力設定を決定する。ストリームプログラム入出力設定静的決定部2632は、第2の静的決定部2702を有する。
【0108】
第2の静的決定部2702は、クライアント301から、プログラム構成801、プラットフォーム要件802、およびストリーム実行仕様2701といった登録情報を受け付ける。そして、第2の静的決定部2702は、ストリームプログラム400の静的な入力データサイズ、重なり幅および計算状態保持の有無を決定する。計算状態保持とは、バッチ処理基盤2621上で実行されるストリームプログラム400の実行結果である計算状態を保持することである。決定された入力データサイズおよび重なり幅は、ストリームプログラム入出力設定2703として出力される。
【0109】
<
ストリーム実行仕様2701>
図28は、ストリーム実行仕様2701の一例を示す説明図である。ストリーム実行仕様2701とは、ストリーム処理の実行方法を規定する情報である。パラメータとして、たとえば、入力レート2801、処理スループット2802、計算状態保持・読出し時間2803があり、クライアント301を操作することでユーザにより指定される。入力レート2801は、ストリームプログラム400が入力とするベクトルデータVDの要素が到着する間隔を示す。
【0110】
図28では、入力レート2801は1個/分であるため、毎分1個、ベクトルデータVDの要素が到着することを示す。また、処理スループット2802は、ストリームプログラム400が単位時間当たりに処理する、ストリームデータの数を示す。
図28では処理スループット2802は1個/分であるため、ストリームプログラム400が毎分1個の値を処理できることを示す。計算状態保持・読出し時間2803は、計算状態の保持と読み出しに要する時間を示す。
図28では、計算状態保持・読出し時間2803は5分であるため、計算状態の保持と読み出しに5分かかることを示す。
【0111】
<ストリームプログラム入出力設定動的決定部2633>
図29は、
図26に示したストリームプログラム入出力設定動的決定部2633の入出力関係を示す説明図である。ストリームプログラム入出力設定動的決定部2633は、バッチ処理基盤2621上でCPU2611により実行されるプログラムであり、ストリームプログラム400の動的な入出力設定を決定する。ストリームプログラム入出力設定動的決定部2633は、ストリーム実行モニタリング部2901と、第2の動的決定部2903とを有する。
【0112】
ストリーム実行モニタリング部2901は、実行中のストリームプログラム400を監視し、ストリーム実行モニタリング値2902を生成する。ストリーム実行モニタリング値2902とは、実行中のバッチプログラム600における観測値である。ストリーム実行モニタリング値2902については、後述する。
【0113】
第2の動的決定部2903は、クライアント301から、
図9に示したプログラム構成801、
図10に示したプラットフォーム要件802およびストリーム実行モニタリング値2902を受け付ける。そして、第2の動的決定部2903は、ストリームプログラム400の動的な入力データサイズ、重なり幅および計算状態の有無を決定する。決定された入力データサイズ1401および重なり幅1402は、ストリームプログラム入出力設定2703として出力される。入力データサイズおよび重なり幅については、後述する。
【0114】
<ストリーム実行モニタリング値2902>
図30は、ストリーム実行モニタリング値2902の一例を示す説明図である。ストリーム実行モニタリング値2902は、パラメータとして、処理対象データ数3001、処理スループット3002、および計算状態保持・読出し時間3003を有し、ストリーム実行モニタリング部2901により出力される。処理対象データ数3001は、ストリームプログラム400が入力とするベクトルデータVDの要素数を示す。当該要素数は、たとえば、ファイルに格納されている。
【0115】
図30では、処理対象データ数3001が240個であるため、ファイルにベクトルデータVDの要素数が240個であることを示す。また、処理スループット3002は、ストリームプログラム400が単位時間当たりに処理するストリームデータの数を示す。計算状態保持・読出し時間3003は、計算状態の保持と読み出しに要する時間を示す。
【0116】
<ストリームプログラム入出力設定2703>
図31は、
図27および
図29に示したストリームプログラム入出力設定2703の一例を示す説明図である。ストリームプログラム入出力設定2703とは、ストリームプログラム400に入出力されるデータを規定する情報である。パラメータとして、たとえば、入力データサイズ3101、重なり幅3102、計算状態保持有無3103があり、クライアント301を操作することでユーザにより指定される。入力データサイズ3101は、ストリームプログラム400が入力するストリームデータのサイズを示す。
【0117】
たとえば、
図31に示した入力データサイズ3101は240個であるため、ストリームプログラム400は、240個のストリームデータを入力する。また、重なり幅3102は、ストリームプログラム400が入力するストリームデータと、一つ前の実行でストリームプログラム400が入力したストリームデータとの間で、重複するストリームデータの数を示す。
図31では、重なり幅3102は3個であるため、一つ前の実行でストリームプログラム400が入力したストリームデータと3個のストリームデータが重複することを示す。また、計算状態保持有無3103は、ストリームプログラム400の計算状態を保持するか否かを示す。
図31では、計算状態保持有無3103は「なし」であるため、計算状態は保持されない。
【0118】
<ストリームプログラム実行部2635>
図32は、
図26に示したストリームプログラム実行部2635の入出力の関係を示す説明図である。ストリームプログラム実行部2635は、入力データ・ベクトルTOストリーム変換部3201と、出力データ・ストリームTOベクトル変換部3202と、計算状態読出し部3203と、計算状態保持部3204と、を有する。
【0119】
入力データ・ベクトルTOストリーム変換部3201、計算状態読出し部3203、および計算状態保持部3204は、ストリームプログラム入出力設定2703を入力する。ストリームプログラム入出力設定2703は、第2の静的決定部2702や、第2の動的決定部2903が生成してもよく、ユーザにより手動で作成してもよい。
【0120】
計算状態読出し部3203は、ストリームプログラム400の実行開始時に、計算状態格納領域3210に格納されている計算状態3211を読出し、ストリームプログラム入出力設定2703に従って、ストリームプログラム400に入力する。計算状態保持部3204は、ストリームプログラム400の実行終了時に、ストリームプログラム入出力設定2703に従って計算状態3211をストリームプログラム400に入力する。
【0121】
入力データ・ベクトルTOストリーム変換部3201は、バッチプログラムBP1の出力であるファイルF1内のベクトルデータVD3を入力とし、ストリームプログラム入出力設定2703に従ってベクトルデータVD3からストリームデータに変換する。入力データ・ベクトルTOストリーム変換部3201が入力するベクトルデータVD3は、ファイル、およびデータベースやその他の記憶領域に格納してもよい。また、ファイルF1やその他の記憶領域に、バッチプログラム600がベクトルデータVD3を格納してもよく、その他のプログラムが格納してもよい。
【0122】
ストリームプログラム400は、入力データ・ベクトルTOストリーム変換部3201が出力したストリームデータを入力し、その処理結果としてストリームデータを出力する。そして、出力データ・ストリームTOベクトル変換部3202が、ストリームプログラム400が出力したストリームデータSD4を入力し、ベクトルデータVD4に変換する。出力データ・ストリームTOベクトル変換部3202が出力したベクトルデータVDは、ファイルF2やデータベースまたはその他の記憶領域に格納される。ファイルF2やその他の記憶領域に格納されたベクトルデータVD4はバッチプログラム600が入力してもよく、その他のプログラムが入力してもよい。
【0123】
<重なりデータ時刻>
図33は、
図32に示した重なりデータ時刻の一例を示す説明図である。重なりデータ時刻OTは、ストリームプログラム400が入力するストリームデータの中で、一つ前の実行でストリームプログラム400が入力するストリームデータと重複するストリームデータの時刻を示す。
図33では、重なりデータ時刻OTは「0:57〜0:59」であるため、現在と一つ前のストリームプログラム400のいずれの実行においても、時刻「0:57」〜「0:59」のストリームデータを入力として持つ。重なりデータ時刻OTは、入力データ・ベクトルTOストリーム変換部3201により設定され、出力データ・ストリームTOベクトル変換部3202に使用される。
【0124】
<オペレータツリー>
図34は、オペレータツリーの一例を示す説明図である。オペレータツリー3400は、CQLで記述したストリームプログラム400をコンパイルすることに生成される。ストリーム処理基盤321は、オペレータツリー3400を構成する各オペレータ3401〜3404を、オペレータツリー3400で指定された順に実行する。
図34に示すオペレータツリー3400は、
図4に示すノイズ除去クエリ403および異常センサクエリ404のコンパイルの結果、生成されたオペレータツリー3400である。オペレータツリー3400は、たとえば、ROWS3401、GROUP BY3402、ISTREAM3403、ISTREAM3404により構成され、ROWS3401、GROUP BY3402、ISTREAM3403、ISTREAM3404の順に実行される。
【0125】
<計算状態格納領域3210>
図35は、
図32に示した計算状態格納領域3210の一例を示す説明図である。計算状態格納領域3210には、計算状態3211が格納される。計算状態3211は、各オペレータ3401〜3404の計算に用いる状態を示す。たとえば、ROWS3401の計算状態は、最近4個のストリームデータを保持するウィンドウであるため、4個のストリームデータを格納する。また、オペレータGROUP BY3402の計算状態3211は、最近4個の計測値の平均値を格納する。
【0126】
<第2の静的決定部2702による処理手順>
図36は、第2の静的決定部2702による処理手順例を示すフローチャートである。第2の静的決定部2702は、まず、プログラム構成801、プラットフォーム要件802、およびストリーム実行仕様2701を読込む(ステップS3601)。
【0127】
つぎに、第2の静的決定部2702は、「(ウィンドウ幅−スライド数)/処理スループット」が計算状態保持・読出し時間2803よりも大きいか否かを判断する(ステップS3602)。大きい場合(ステップS3602:Yes)、第2の静的決定部2702は、ストリームプログラム入出力設定2703において計算状態保持有無3103を「あり」にセットし(ステップS3603)、ストリームプログラム入出力設定2703において重なり幅3102を0にセットする(ステップS3604)。そして、ステップS3607に移行する。
【0128】
一方、「(ウィンドウ幅−スライド数)/処理スループット」が計算状態保持・読出し時間2803以下の場合(ステップS3602:No)、第2の静的決定部2702は、ストリームプログラム入出力設定において計算状態保持有無3103を「なし」にセットし(ステップS3605)、また、ストリームプログラム入出力設定2703において重なり幅3102を「ウィンドウ幅−スライド数」にセットする(ステップS3606)。そして、ステップS3607に移行する。
【0129】
ここで、処理対象のベクトルデータVDにおいてストリームプログラム400で実行する迄の時間を待ち時間、ストリームプログラム400の実行時間を実行時間とする。待ち時間+実行時間がレスポンス時間1001以下であれば、要求したレスポンス時間1001で処理することが可能となる。待ち時間は、「処理対象のベクトルデータVDのサイズ(以下、ベクトルサイズ)/入力レート」であり、また実行時間は「ベクトルサイズ/処理スループット」である。
【0130】
このため、「ベクトルサイズ/入力レート+ベクトルサイズ/処理スループット」がレスポンス時間1001以下となる必要がある。したがって、ベクトルデータVDの処理可能なデータサイズ(以下、「処理可能データ数」)は、「ベクトルサイズ/入力レート+ベクトルサイズ/処理スループット≦レスポンス時間」を満たす、最大のベクトルサイズとなる。これにより、ベクトルサイズは、[レスポンス時間×処理スループット×入力レート/(処理スループット+入力レート)]となる([]はガウス記号)。
【0131】
したがって、第2の静的決定部2702は、入力データサイズ3101を、[レスポンス時間×処理スループット×入力レート/(処理スループット+入力レート)]として、ストリームプログラム入出力設定2703にセットする(ステップS3607)。これにより、第2の静的決定部2702による処理を終了する。
【0132】
<ストリーム実行モニタリング部2901による処理手順>
図37は、ストリーム実行モニタリング部2901による処理手順例を示すフローチャートである。ストリーム実行モニタリング部2901は、ストリームプログラム400の入力となるストリームデータを格納するファイルを参照し、ストリーム実行モニタリング値2902を処理対象データ数3001にセットする(ステップS3701)。
【0133】
つぎに、ストリーム実行モニタリング部2901は、バッチ処理基盤2621のログから処理スループットを取り出し、ストリーム実行モニタリング値2902の処理スループット3002にセットする(ステップS3702)。そして、バッチ実行モニタリング部1201は、バッチ処理基盤2621が終了していなければ(ステップS3703:No)、ステップS3701に戻り、終了していれば(ステップS3703:Yes)、処理を終了する。
【0134】
<第2の動的決定部2903による処理手順>
図38は、第2の動的決定部2903による処理手順例を示すフローチャートである。第2の動的決定部2903は、まず、プログラム構成801およびプラットフォーム要件802を読み込む(ステップS3801)。つぎに、第2の動的決定部2903は、処理対象のベクトルデータVDの要素がファイルに存在するか否かを判断する(ステップS3802)。処理対象のベクトルデータVDがファイルに存在する場合(ステップS3802:Yes)、第2の動的決定部2903は、ストリーム実行モニタリング値2902を読込む(ステップS3803)。
【0135】
つぎに、第2の動的決定部2903は、「(ウィンドウ幅−スライド数)/処理スループット」が計算状態保持・読出し時間3003よりも大きいか否かを判断する(ステップS3804)。大きい場合(ステップS3804:Yes)、第2の動的決定部2903は、ストリームプログラム入出力設定2703において計算状態保持有無3103を「あり」にセットし(ステップS3805)、ストリームプログラム入出力設定2703において重なり幅3102を0にセットする(ステップS3806)。そして、ステップS3809に移行する。
【0136】
一方、「(ウィンドウ幅−スライド数)/処理スループット」が計算状態保持・読出し時間3003以下の場合(ステップS3804:No)、第2の動的決定部2903は、ストリームプログラム入出力設定2703において計算状態保持有無3103を「なし」にセットし(ステップS3807)、また、ストリームプログラム入出力設定2703において重なり幅3102を「ウィンドウ幅−スライド数」にセットする(ステップS3808)。そして、ステップS3809に移行する。
【0137】
ここで、処理対象のベクトルデータVDにおいてストリームプログラム400で実行する迄の時間を待ち時間、ストリームプログラム400の実行時間を実行時間とする。待ち時間+実行時間がレスポンス時間1001以下であれば、要求したレスポンス時間1001で処理することが可能となる。待ち時間は、「処理対象のベクトルデータVDのサイズ(以下、ベクトルサイズ)/入力レート」であり、また実行時間は「ベクトルサイズ/処理スループット」である。
【0138】
このため、「ベクトルサイズ/入力レート+ベクトルサイズ/処理スループット」がレスポンス時間1001以下となる必要がある。したがって、ベクトルデータVDの処理可能なデータサイズ(以下、「処理可能データ数」)は、「ベクトルサイズ/入力レート+ベクトルサイズ/処理スループット≦レスポンス時間」を満たす、最大のベクトルサイズとなる。これにより、ベクトルサイズは、[レスポンス時間×処理スループット×入力レート/(処理スループット+入力レート)]となる([]はガウス記号)。
【0139】
したがって、第2の動的決定部2903は、入力データサイズ3101を、[レスポンス時間×処理スループット×入力レート/(処理スループット+入力レート)]として、ストリームプログラム入出力設定2703にセットする(ステップS3809)。
【0140】
このあと、第2の動的決定部2903は、バッチ処理基盤2621が終了したか否かを判断し(ステップS3810)、終了していない場合(ステップS3810:No)、ステップS3802に戻る。一方、終了した場合(ステップS3810:Yes)、第2の動的決定部2903による処理を終了する。
【0141】
<
入力データ・ベクトルTOストリーム変換部3201による処理手順>
図39は、
図32に示した入力データ・ベクトルTOストリーム変換部3201による処理手順例を示すフローチャートである。入力データ・ベクトルTOストリーム変換部3201は、まず、ファイルの読出しインデックスを、「最後入力データのインデックス+1−重なり幅」に設定する(ステップS3901)。最後入力データとは、最後にファイルから読み出されたベクトルデータVDの要素である。
【0142】
つぎに、入力データ・ベクトルTOストリーム変換部3201は、ファイルの読出しインデックスの要素の時刻から最後入力データのインデックスから1引いた要素の時刻までを、重なりデータ時刻OTに設定する(ステップS3902)。
【0143】
そして、入力データ・ベクトルTOストリーム変換部3201は、読出しインデックスのベクトルデータVDの要素をファイルから取得し(ステップS3903)、その取得した要素に時刻を付加してストリームデータを生成する(ステップS3904)。そして、入力データ・ベクトルTOストリーム変換部3201は、ストリームデータをストリーム格納キューQに格納する(ステップS3905)。
【0144】
そして、入力データ・ベクトルTOストリーム変換部3201は、取得した要素の数が入力データサイズより小さいか否かを判断する(ステップS3906)。小さい場合(ステップS3906:Yes)、入力データ・ベクトルTOストリーム変換部3201は、読出しインデックスを1つ加算し(ステップS3907)、ステップ3903に戻り、ステップS3903〜S3905を実行する。
【0145】
そして、取得したデータ数が入力データサイズ以上になった場合(ステップS3906:No)、入力データ・ベクトルTOストリーム変換部3201は、ファイル内の末尾のインデックスの要素を、最後入力データに設定し(ステップS3908)、入力データ・ベクトルTOストリーム変換部3201による処理を終了する。
【0146】
<ベクトルデータVDからストリームデータへの変換例>
図40は、ベクトルデータVDからストリームデータへの変換例を示す説明図である。
図40では、
図39のステップ番号を参照して説明する。なお、この時点での最後入力データを、インデックス1002の要素(10.0)とする。
【0147】
ステップS3901において、入力データ・ベクトルTOストリーム変換部3201は、ファイルの読出しインデックスを、最後入力データのインデックス1002+1−重なり幅3=1000に設定する。
【0148】
また、ステップS3902において、入力データ・ベクトルTOストリーム変換部3201は、ファイルの読出しインデックス1000の要素の時刻0:57〜最後入力データのインデックス1002の要素の時刻0:59を、重なり時刻に設定する。
【0149】
また、ステップS3903において、入力データ・ベクトルTOストリーム変換部3201は、読出しインデックス1002の要素(10.0)をファイルから取得し、ステップS3904において、要素の時刻0:59を付加したストリームデータを生成し、ストリーム格納キューQに格納する。
【0150】
そして、ステップS3906において、入力データ・ベクトルTOストリーム変換部3201は、取得要素数(この段階ではインデックス1000の要素1個)が入力データサイズ240個より小さいか否かを判断する。この場合は、小さいため、入力データ・ベクトルTOストリーム変換部3201は、読出しインデックスを1000から1001にする。このループを繰り返すことで、ベクトルデータVDの要素であるインデックス1001〜1239のデータを順次取得し、ストリーム格納キューQ501に、時刻0:57〜4:59のストリームデータ
4011〜4015を格納することができる。
【0151】
<出力データ・ストリームTOベクトル変換部3202による処理手順>
図41は、
図32に示した出力データ・ストリームTOベクトル変換部3202による処理手順例を示すフローチャートである。出力データ・ストリームTOベクトル変換部3202は、ストリーム格納キューQから順次ストリームデータを取得する(S4101)。つぎに、出力データ・ストリームTOベクトル変換部3202は、取得したストリームデータに時刻が、重なりデータ時刻OTと一致するか否かを判断する(ステップS4102)。
【0152】
一致する場合(ステップS4102:Yes)、ステップS4104に移行し、不一致である場合(ステップS4102:No)、出力データ・ストリームTOベクトル変換部3202は、取得したストリームデータをファイルに格納して(ステップS4103)、ステップS4104に移行する。
【0153】
ステップS4104では、出力データ・ストリームTOベクトル変換部3202は、バッチ処理基盤2621が終了したか否かを判断し(ステップS4104)、終了していない場合(ステップS4104:No)、ステップS4101に戻る。一方、終了した場合(ステップS4104:Yes)、出力データ・ストリームTOベクトル変換部3202による処理を終了する。
【0154】
<ストリームデータからベクトルデータVDへの変換例>
図42は、ストリームデータからベクトルデータVDへの変換例を示す説明図である。
図42では、
図41のステップ番号を参照して説明する。ステップS4101において、出力データ・ストリームTOベクトル変換部3202は、ストリーム格納キューQから順次ストリームデータ4201〜4204を取得する。
【0155】
ステップS4102において、出力データ・ストリームTOベクトル変換部3202は、取得したストリームデータごとに、重なりデータ時刻OTと一致するか否かを判定する。この場合、時刻0:58のストリームデータ4201が一致し、時刻1:02以降のストリームデータ4202は不一致となる。このため、ステップS4103において、出力データ・ストリームTOベクトル変換部3202は、不一致である時刻1:02以降のストリームデータ4202〜4204をファイルF2に格納する。これにより、前回のストリームデータと時刻が重複するストリームデータについては、ベクトル変換されないため、出力されない。これにより、後段のバッチプログラム600は、ファイル参照して、バッチ処理を実行することができる。
【0156】
<計算状態読出し部3203による処理手順>
図43は、
図32に示した計算状態読出し部3203による処理手順を示すフローチャートである。まず、計算状態読出し部3203は、オペレータツリー3400を構成するオペレータを順次参照し(ステップS4301)、参照したオペレータの計算状態3211を、計算状態格納領域3210から取り出し、ストリームプログラム400に書き込む(ステップS4302)。そして、計算状態読出し部3203は、オペレータツリー3400の全オペレータを参照したか否かを判断する(ステップS4303)。全オペレータを参照していない場合(ステップS4303:No)、ステップS4301に戻る。一方、全オペレータを参照した場合(ステップS4303:Yes)、計算状態読出し部3203による処理を終了する。
【0157】
<計算状態保持部3204による処理手順>
図44は、
図32に示した計算状態保持部3204による処理手順を示すフローチャートである。まず、計算状態保持部3204は、オペレータツリー3400を構成するオペレータを順次参照し(ステップS4401)、参照したオペレータの計算状態3211を、ストリームプログラム400から読出し、計算状態格納領域3210に保持する(ステップS4402)。そして、計算状態保持部3204は、オペレータツリー3400の全オペレータを参照したか否かを判断する(ステップS4403)。全オペレータを参照していない場合(ステップS4403:No)、ステップS4401に戻る。一方、全オペレータを参照した場合(ステップS4403:Yes)、計算状態保持部3204による処理を終了する。
【0158】
このように、実施例2によれば、前回のバッチ処理時におけるストリーム処理の実行結果を用いることにより、実質的にストリームデータ間で重なりを持たせることができる。したがって、計算実行不可という状態を回避することができ、ストリームプログラムのセマンティックスを保持することができる。
【0159】
以上説明したように、本実施の形態によれば、ストリーム処理基盤上で、入力データに重なりを持たせる必要があるバッチプログラムを実行可能とすることができる。また、バッチプログラムの入力データサイズを増やし纏めて実行することで処理スループットの向上を図ることができる。また、バッチ処理基盤上で、入力データに重なりを持たせる必要があるストリームプログラムを実行可能にすることができる。
【0160】
すなわち、バッチ処理およびストリーム処理について、一方の処理基盤と当該一方の処理基盤上で他方の処理のプログラムを実行する場合、時系列データに重なりを持たせて他方の処理を実行することができる。これにより、一方の処理基盤上で実行する他方の処理のプログラムのコードやアルゴリズムを変更することなく、一方の処理基盤上で他方の処理のプログラムを実行することができる。したがって、既存のプログラムを処理が異なる処理基盤上で流用することができ、容易かつ効率的にプログラムを実行することができる。
【0161】
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。