以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の分散処理システムを示す図である。第1の実施の形態の分散処理システムは、ノード1a,1b,1c,1dおよび通信装置3a,3bを有する。
ノード1a,1b,1c,1dは、データ処理を行う情報処理装置である。ノード1a,1b,1c,1dは、例えば、CPU(Central Processing Unit)などのプロセッサとRAM(Random Access Memory)やHDD(Hard Disk Drive)などの記憶装置とを備えるコンピュータであり、PC(Personal Computer)やワークステーションやブレードサーバと呼ばれるものでもよい。通信装置3a,3bは、レイヤ2スイッチなどのデータを転送するネットワーク中継装置である。通信装置3aと通信装置3bとの間は、直接接続されていてもよいし、上位の通信装置を介して接続されていてもよい。
ノード1a,1bは、通信装置3aに接続されており、ノードの集合であるグループ#1に含まれる。ノード1c,1dは、通信装置3bに接続されており、ノードの集合であるグループ#2に含まれる。各グループは、3個以上のノードを含んでいてもよい。分散処理システムは、更に他のグループを有してもよい。グループは、複数のノードを仮想的に1つのノードと見なしたものと考えることもでき、仮想ノードと呼んでもよい。ここで、任意の2つのグループ間には、対応するノードが存在する。グループ#1のノード1aとグループ#2のノード1cが一対一の対応関係にあり、グループ#1のノード1bとグループ#2のノード1dが一対一の対応関係にある。
ノード1a,1b,1c,1dには、データ集合に含まれるデータ要素が配置される。データ要素は、データ処理開始のコマンドが入力される前に配置してもよいし、コマンドが入力された後に分散処理システムが配置してもよい。データ要素は、好ましくは、データ処理に用いる複数のノードにできる限り均等に分散され、また、同じデータ要素が異なるノードに重複して配置されない(複製されていない)ようにする。配置されるデータ要素は、1種類のデータ要素(1つのデータ集合に含まれるもの)でもよいし、2種類以上のデータ要素(2以上のデータ集合に含まれるもの)であってもよい。
ノード1a,1b,1c,1dにデータ要素が配置されてから、ノード1a,1b,1c,1dが並列データ処理を開始するまでに、各ノードが自ノードで使用するデータ要素を取得するため、ノード間でデータ要素が複製される。第1の実施の形態の分散処理システムは、第1段階目としてグループ間でデータ要素を複製し、第2段階目としてグループを跨がらずに各グループ内でデータ要素を複製する。
第1段階目でグループ#1がグループ#2からデータ要素を受信するとき、ノード1aは、通信装置3a,3bを介して自ノードに対応するノード1cと通信し、ノード1cに配置されたデータ要素を受信する。また、ノード1bは、通信装置3a,3bを介して自ノードに対応するノード1dと通信し、ノード1dに配置されたデータ要素を受信する。同様に、グループ#2がグループ#1からデータ要素を受信してもよい。その場合、通信装置3a,3bを介して、ノード1cがノード1aに配置されたデータ要素を受信し、ノード1dがノード1bに配置されたデータ要素を受信する。
第2段階目でグループ#1内でデータ要素を複製するとき、ノード1a,1bは、グループ#1内の少なくとも1つの他のノードから、当該他のノードに配置されたデータ要素と、当該他のノードがグループ#2を含む他グループから受信したデータ要素とを受信する。各ノードの通信相手は、グループ#1内の複数のノードに対して付与された論理的な接続関係に応じて決まる。例えば、ノード1aは、ノード1bから、ノード1bに配置されたデータ要素と、第1段階目でノード1bがノード1dから受信したデータ要素とを受信する。また、ノード1bは、ノード1aから、ノード1aに配置されたデータ要素と、第1段階目でノード1aがノード1cから受信したデータ要素とを受信する。同様に、グループ#2内において、ノード1c,1dの間でデータ要素を複製してもよい。
ノード1a,1b,1c,1dは、以上の第1段階目および第2段階目の複製を通じて収集したデータ要素を用いて、データ処理を行う。各ノードは、自ノードに配置されたデータ要素と、第1段階目で他グループの対応するノードから受信したデータ要素と、第2段階目で同一グループ内の他のノードから受信したデータ要素とをもっている。例えば、各ノードは、データ集合に関して2つの部分集合を取得した場合、一方の部分集合に含まれる1つのデータ要素と他方の部分集合に含まれる1つのデータ要素との組み合わせ全てに対して、データ処理を行うことが考えられる。また、例えば、各ノードは、データ集合に関して1つの部分集合を取得した場合、その部分集合に含まれる2つのデータ要素の組み合わせ全てに対して、データ処理を行うことが考えられる。
第1の実施の形態の分散処理システムによれば、ノード1a,1b,1c,1dと通信装置3a,3bとの接続関係を考慮してグループを形成することで、データ処理に用いるデータ要素をノード間で効率的に複製し送信することができる。
例えば、他の方法として、ノード1cのデータ要素をノード1d,ノード1a,ノード1bに巡回リレーし、ノード1dのデータ要素をノード1a,ノード1b,ノード1cに巡回リレーするものが考えられる。しかし、この方法では、同一の通信装置下で行われるノード1a,1b間およびノード1c,1d間の通信と、異なる通信装置に跨がって行われるノード1b,1c間およびノード1d,1a間の通信とで、遅延時間が異なることになる。これに対し、第1段階目で異なる通信装置に跨がる通信を纏めて行い、第2段階目で同一の通信装置下の通信を纏めて行うことで、通信の並列化が容易となる。
なお、第1の実施の形態では、1階層のグループを形成する例を説明したが、グループを入れ子にして2階層以上のグループを形成するようにしてもよい。また、運用上などの理由から、通信装置3a,3bを同一の通信装置とし、当該同一の通信装置にグループ#1のノード1a,1bとグループ#2のノード1c,1dを接続することもある。
もちろん、第1の実施の形態で述べたノードのグループ化の考え方は、第3の実施の形態以降で説明する虱潰しジョインや三角ジョインだけでなく、他の並列データ処理にも応用可能である。例えば、上記のノードのグループ化の考え方を、本出願の発明者の一人が発明した並列ソート方式(特許第2509929号)に応用することもできる。また、上記のノードのグループ化の考え方を、データベースの分野のハッシュジョイン、ハッシュ関数を用いたデータグループ化、データの重複除去、2つのデータ集合の共通集合や和集合を求める集合演算、ソートを用いたマージジョインなどにも応用できる。
すなわち、上記のノードのグループ化の考え方は、一般に、いわゆる分割統治法によって解くことができる計算問題であって、データ数が小さく元の問題と同種の複数の部分問題に分割可能であり、これらの部分問題を解くことによって全体を解くことができ、データをノード間で送信し合うことになるような計算問題に対して、適用可能である。
[第2の実施の形態]
図2は、第2の実施の形態の分散処理システムを示す図である。第2の実施の形態の分散処理システムは、ノード2a〜2iを有する。ノード2a〜2iは、データ処理を行う情報処理装置であり、例えば、CPUなどのプロセッサとRAMやHDDなどの記憶装置とを備えるコンピュータである。ノード2a〜2iは、1つの通信装置(例えば、レイヤ2スイッチ)に接続されてもよいし、複数の通信装置に分散して接続されてもよい。
ノード2a〜2iには、第1の軸(例えば、X軸)の値と第2の軸(例えば、Y軸)の値とを含む座標が付与され、論理的に格子状の接続関係が付与される。ノード2a〜2iのうち、ノード2a,2e,2iが対角線上にある。ここで、対角線上のある位置#1を基点としたときに、第1の軸の値が位置#1と同じ位置#2,#3と、第2の軸の値が位置#1と同じ位置#4,#5とに、それぞれK個(Kは1以上の整数)のノードが存在する。ノード2aを基点とした場合、位置#2にノード2bがあり、位置#3にノード2cがあり、位置#4にノード2dがあり、位置#5にノード2gがある。
ノード2a〜2iには、データ集合に含まれる1以上のデータ要素が配置される。データ要素は、データ処理開始のコマンドが入力される前に配置してもよいし、コマンドが入力された後に分散処理システムが配置してもよい。データ要素は、好ましくは、データ処理に用いる複数のノードにできる限り均等に分散され、また、同じデータ要素が異なるノードに重複して配置されない(複製されていない)ようにする。配置されるデータ要素は、好ましくは、1種類のデータ要素(1つのデータ集合に含まれるもの)である。
ノード2a〜2iにデータ要素が配置されてから、ノード2a〜2iが並列データ処理を開始するまでに、各ノードが自ノードで使用するデータ要素を取得するため、ノード間でデータ要素が複製される。第2の実施の形態の分散処理システムは、対角線上の各ノード(位置#1)を基点として、以下の第1〜第3の送信処理を実行する。
第1の送信処理では、位置#1のノードに配置された各データ要素を、位置#2,#4のノードに送信する。ノード2aを基点とした場合、ノード2aに配置された各データ要素が、ノード2b,2dに複製される。更に、第1の送信処理では、位置#1のノードに配置された各データ要素を、位置#3のノードおよび位置#5のノードの一方に選択的に送信する。ノード2aを基点とした場合、ノード2aに配置された各データ要素が、ノード2cまたはノード2gに複製される。すなわち、ノード2aに配置された各データ要素が、ノード2b,2d,2cに複製されるか、または、ノード2b,2c,2gに複製される。ノード2aに複数のデータ要素が配置されている場合、ノード2cに複製されるデータ要素の数とノード2gに複製されるデータ要素の数は、できる限り等しいことが好ましい。例えば、複製されるデータ要素数の差を高々1個にする。
第2の送信処理では、位置#2のノードに配置されたデータ要素を、位置#1,#4,#5のノードに送信する。ノード2aを基点とした場合、ノード2bに配置されたデータ要素が、ノード2a,2d,2gに複製される。第3の送信処理では、位置#3のノードに配置されたデータ要素を、位置#1,#2,#4のノードに送信する。ノード2aを基点とした場合、ノード2cに配置されたデータ要素が、ノード2a,2b,2dに複製される。
なお、位置#2にK個のノードが存在する場合、位置#2の各ノードから位置#2の他のK−1個のノードにもデータが送信され得る。位置#3についても同様である。
これにより、第1の軸の値が同じ位置#1,#2,#3のノードに配置されたデータ要素が、対角線上の位置#1のノードに集められたことになる。また、位置#2,#4のノードは、位置#1に集められたデータ要素の全てをもち、位置#3,#5のノードは、位置#1に集められたデータ要素を二分割した一方のみをそれぞれもつことになる。
各ノードは、自ノードに配置されたデータ要素と、上記の第1〜第3の送信処理を通じて受信したデータ要素とを用いて、データ処理を行う。例えば、対角線上の各ノードは、自ノードを基点として収集した複数のデータ要素の間の組み合わせに対してデータ処理を行うことができる。また、例えば、対角線上でない各ノードは、対角線上の1つのノードを基点として収集したデータ要素と対角線上の他のノードを基点として収集したデータ要素との間の組み合わせに対してデータ処理を行うことができる。
第2の実施の形態の分散処理システムによれば、データ処理に用いるデータ要素をノード2a〜2iに配置した状態から、データ要素をノード間で効率的に送信できる。特に、第2の実施の形態の分散処理システムは、1つのデータ集合に含まれる2つのデータ要素の組み合わせ全てに対して行うデータ処理を並列化するときに有効である。その場合、データ処理をノード2a〜2iにできる限り均等に割り振ることができ、また、各ノードに対し当該ノードが使用するデータ要素を過不足なく複製することができる。
[第3の実施の形態]
図3は、第3の実施の形態の情報処理システムを示す図である。この情報処理システムは、ノード11〜16、クライアント31およびネットワーク41を有する。
ノード11〜16は、ネットワーク41に接続されたコンピュータであり、PCやワークステーションやブレードサーバと呼ばれるものでもよい。ノード11〜16は、並列にデータ処理を実行することができる。ネットワーク41は、データ要素やコマンドを転送する1またはそれ以上の通信装置(例えば、レイヤ2スイッチ)を備える。クライアント31は、ユーザが操作する端末装置としてのコンピュータである。クライアント31は、ネットワーク41を介して、何れかのノードにデータ処理開始のコマンドを送信する。
図4は、ノードのハードウェア例を示すブロック図である。ノード11は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、ディスクドライブ106および通信部107を有する。ノード12〜16およびクライアント31も、ノード11と同様のハードウェアを用いて実現できる。なお、ノード11〜16は、ブレードサーバのように、画像信号処理部104や入力信号処理部105を備えていなくてもよく、必要に応じて後から追加できるようにしてもよい。
CPU101は、ノード11を制御するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部を読み出し、RAM102に展開してプログラムを実行する。なお、ノード11は、複数のプロセッサを備えてもよい。
RAM102は、CPU101が実行するプログラムやデータを一時的に記憶する揮発性メモリである。なお、ノード11は、RAM以外の種類のメモリを備えてもよい。
HDD103は、OS(Operating System)プログラムやアプリケーションプログラムなどの各種のプログラムおよびデータを記憶する不揮発性の記憶装置である。HDD103は、CPU101の命令に従って、内蔵の磁気ディスクに対してデータの読み書きを行う。なお、ノード11は、HDD以外の不揮発性の記憶装置(例えば、SSDなど)を備えてもよく、複数の記憶装置を備えていてもよい。
画像信号処理部104は、CPU101の命令に従って、ノード11に接続されたディスプレイ42に画像を出力する。ディスプレイ42としては、例えば、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイを用いることができる。
入力信号処理部105は、ノード11に接続された入力デバイス43から入力信号を取得し、CPU101に出力する。入力デバイス43としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
ディスクドライブ106は、記録媒体44に記録されたプログラムやデータを読み取る駆動装置である。記録媒体44として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。ディスクドライブ106は、例えば、CPU101の命令に従って、記録媒体44から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信部107は、ネットワーク41を介して、ノード12〜16やクライアント31と通信する通信インタフェースである。通信部107は、有線通信インタフェースであってもよいし、無線通信インタフェースであってもよい。
次に、第3の実施の形態の情報処理システムが実行する「虱潰しジョイン」について説明する。なお、「虱潰しジョイン」は、単にジョインの一種として扱われることがある。
虱潰しジョインでは、数式(1)に示すように、2つのデータ集合A,Bが与えられる。データ集合Aは、m個(mは正の整数)のデータ要素a1,a2,…,amを含み、データ集合Bは、n個(nは正の整数)のデータ要素b1,b2,…,bnを含む。各データ要素は、好ましくは、一意な識別子を含んでおり、識別子と値の組となっている。虱潰しジョインの結果は、数式(2)に示すように、データ集合Aのデータ要素aとデータ集合Bのデータ要素bとの順序対(順序を考慮した組)全てに対して、map関数を適用することで得られるデータ集合である。map関数は、引数として与えられるデータ要素a,bによっては、結果のデータ要素を出力しないこともあるし、2以上の結果のデータ要素を出力することもある。
図5は、虱潰しジョインを示す図である。図5に示すように、虱潰しジョインは、データ集合Aとデータ集合Bの直積に対してmap関数を適用する演算と言うこともできる。例えば、データ集合Aから1つのデータ要素a1を選択し、データ集合Bから1つのデータ要素b1を選択し、データ要素a1,b1をmap関数の引数として与える。前述のように、map(a1,b1)は結果を出力するとは限らない。例えば、データ要素a1,b1が所定の条件を満たさないとき、map関数は結果を出力しない可能性がある。このようなmap関数の演算を、m個×n個の全ての順序対に対して実行する。
虱潰しジョインを実行するプログラムは、ネステッドループと呼ばれるアルゴリズムを用いて実装できる。例えば、外側のループでデータ集合Aのデータ要素aを1つ選択し、内側のループでデータ集合Bのデータ要素bを1つ選択する。この場合、データ集合Aのあるデータ要素aiに対して、n個のデータ要素b1,b2,…,bnが順に組み合わせられて、内側ループの中で演算が実行される。ただし、図5に示す複数のmap関数の演算は、互いに独立に実行可能であるため、複数のノードを用いて並列化できる。
図6は、虱潰しジョインの実行結果の例を示す図である。図6の数値例では、データ集合Aは4個のデータ要素a1〜a4を含み、データ集合Bは4個のデータ要素b1〜b4を含む。この数値例では、データ集合A,Bの各データ要素は、人の氏名と年齢を表す。
虱潰しジョインを行うと、4個×4個=16個の順序対それぞれにmap関数が適用される。ただし、この数値例におけるmap関数には、結果を出力する条件として、データ要素aの年齢がデータ要素bの年齢より大きく、かつ、データ要素a,b間の年齢差が5以下であるという条件が定義されている。そのため、図6に示すように、map関数は、4つの順序対(a1,b1),(a2,b2),(a2,b3),(a3,b4)に対して結果のデータ要素を出力する一方、他の順序対に対してはデータ要素を出力しない。
ここで、データ集合としては、例えば、関係データベースのテーブル、キーバリューストアの(キー,バリュー)組の集合、ファイル、行列などが挙げられる。データ要素としては、例えば、テーブルに含まれるタプル、キーバリューストアの1つの組、ファイル中の1つのレコード、行列に含まれるベクトルやスカラ値などが挙げられる。
行列をベクトルの集合として扱って、上記の虱潰しジョインを適用する例を説明する。数式(3)に示すように、2つ行列A,Bの行列積を計算するとき、行列Aを行ベクトルの集合と見なし、行列Bを列ベクトルの集合と見なすことができる。すると、数式(4)に示すように、行列積ABは、行列Aの行ベクトルと行列Bの列ベクトルとの間の全ての組み合わせに対して、内積を計算した結果と言うことができる。よって、行列積ABは、2つのベクトル集合に対する虱潰しジョインとして計算することが可能である。
図7は、第3の実施の形態のノード関係を示す図である。第3の実施の形態の虱潰しジョインでは、データ処理に用いる複数のノードを、論理的に矩形状に並べられたものとして扱う。ノード集合の縦方向にはh個のノードが並び(行数)、横方向にはw個のノードが並ぶ(列数)。i行目・j列目のノードはnijと表すことができる。行数hと列数wは、以下に述べるように、データ処理の開始の際に情報処理システムが決定する。なお、行数hを縦の分割数、列数wを横の分割数と呼んでもよい。
並列データ処理を開始する際、データ集合A,Bは、論理的に矩形状に並べられた複数のノードに分散して配置される。各ノードに配置したデータ要素を格納する記憶装置は、RAM102のようなメモリでもよいし、HDD103のようなディスク装置でもよい。ここで、データ集合A,Bはそれぞれ、できる限りノード間でデータ量が偏らないように複数のノードに分散される(均等性)。また、データ集合A,Bはそれぞれ、同じデータ要素が複数のノードに重複して配置されないように分散される(排反性)。
上記の均等性と排反性が完全に満たされるとすると、数式(5)に示すように、ノードnijには部分集合Aij,Bijが配置される。部分集合Aijに含まれるデータ要素数は、データ集合Aの要素数を全ノード数N=h×wで割ったものになり、部分集合Bijに含まれるデータ要素数は、データ集合Bの要素数を全ノード数Nで割ったものになる。
ここで、行部分集合Aiを、行番号が同じノードni1,ni2,…,niwに配置された部分集合Ai1,Ai2,…,Aiwの集合和と定義する。また、列部分集合Bjを、列番号が同じノードn1j,n2j,…,nhjに配置された部分集合B1j,B2j,…,Bhjの集合和と定義する。数式(6)に示すように、データ集合Aは、h個の行部分集合Aiの集合和であり、データ集合Bは、w個の列部分集合Bjの集合和である。
行部分集合Aiと列部分集合Bjとを用いて表すと、虱潰しジョインは、数式(7)に示すように、h×w個の虱潰しジョインに分割できる。すなわち、ノードnijに行部分集合Aiと列部分集合Bjを用いた虱潰しジョインを実行させれば、h×w個のノードを並列に動作させて、データ集合A,Bに対する虱潰しジョインを実現できる。その場合、ノードnijは、データ集合A,Bのデータ要素が均等性および排他性を満たして配置された状態から、行番号が同じ他のノードに配置されたデータ集合Aの部分集合と、列番号が同じ他のノードに配置されたデータ集合Bの部分集合を受信することになる。
以上のように、各ノードが自ノードに格納したデータ要素を用いてローカルで虱潰しジョインを実行する前に、ノード間でデータ要素を複製することが発生する。そこで、情報処理システムは、虱潰しジョインに使用可能なノード数Nが与えられたとき、ノード間のデータ送信量が最小になるように、行数hと列数wを決定することにする。
行方向にデータ集合Aの部分集合がリレーされ、列方向にデータ集合Bの部分集合がリレーされるとすると、各ノードのデータ送信量c(=データ受信量)は、数式(8)のように計算される。ただし、数学的モデルおよびアルゴリズムを簡単にするため、各ノードは、自ノードが送信したデータ要素を自身でも受信すると仮定する。N個のノードのデータ送信量c(=データ受信量)を合計した総データ送信量C(=総データ受信量)は、数式(9)のように計算される。すなわち、使用可能なノード数Nとデータ集合A,Bのデータ要素数が与えられたとき、総データ送信量Cは、行数hの関数となる。
図8は、ノード行数とデータ送信量との関係を示すグラフである。図8のグラフは、ノード数を10000、データ集合Aのデータ要素数を10000、データ集合Bのデータ要素数を10000として計算したものである。この例では、h=100のとき総データ送信量Cが最小となる。総データ送信量Cが最小の行数hは、数式(9)を微分することで、数式(10)のように算出される。ただし、実際の行数hはノード数Nの約数にすることになるため、最終的な行数hは以下のように決定する。数式(10)により算出された値が1以下の場合はh=1とし、算出された値がN以上の場合はh=Nとし、それ以外の場合はNの約数のうち算出された値に近いものをhとする。算出された値に近い約数が2つある(算出された値より大きい約数と小さい約数がある)場合は、総データ送信量Cが小さくなる方をhとする。
全ノード数Nは、例えば、使用可能なノード数、処理するデータの量、システムが要求される応答時間などに基づいて予め決定される。ただし、全ノード数Nは、上記のhがNの約数の中から選ばれることを考慮して、約数を多く含む数(例えば、2のべき乗)であることが望ましく、素数など約数が少ない数を避けることが望ましい。予め決められたNがこの性質を満たさない場合、N以下で約数が多い数字にNを変更するようにしてもよい。例えば、N以下の範囲で2のべき乗である最大の整数を、新たなNとする。
次に、ノード間でデータ要素をリレーする方法について説明する。以下の説明では、行方向のリレーの例を挙げるが、列方向のリレーについても同様に実現できる。
図9は、ノード間でのデータのリレー方法の例を示す図である。
(A)方法Aでは、ノードn11に配置された部分集合A11をノードn12,…,n1wに複製する場合、ノードn11は、部分集合A11をノードn12に送信する。ノードn12は、ノードn11から受信した部分集合A11を複製してノードn13に送信する。以下、右方向にノードn1wまで部分集合A11が転送される。他のノードに配置された部分集合も、右方向にリレーできる。リレー方式によりデータ要素を複製することで、送信元のノードが複製先のノードと個別にコネクションを確立しなくてよく、隣接するノード間でのみコネクションを確立すればよい。このため、通信の負荷を低減できる。ただし、方法Aでは、左方向のノードにデータ要素を複製するときはリレー方式を用いることができない。
(B)方法Bでは、右端のノードn1wから左端のノードn11へのコネクションが確立され、巡回したパスが形成される。任意のノードnijは、自ノードに配置された部分集合Aijを右隣のノードに送信することで、行番号が同じ他のノードに部分集合Aijを複製することができる。ただし、データ要素が無限に巡回しないように、例えば、リレーされるデータ要素には、送信元のノードの識別情報(アドレスや座標など)が付加される。
(C)方法Cでは、左端のノードn11から右端のノードn1wに至る右方向のコネクションと、右端のノードn1wから左端のノードn11に至る左方向のコネクションとが、ノード間に確立される。例えば、左端のノードn11は、部分集合A11を右隣のノードに送信する。右端のノードn1wは、部分集合A1wを左隣のノードに送信する。それ以外のノードnijは、部分集合Aijを右隣のノードと左隣のノードの両方に送信する。方法Cにおいても、方法Bと同様に巡回したパスを形成してもよい。
なお、第3の実施の形態の虱潰しジョインでは、リレー方法として方法Bまたは方法Cを用いることが好ましい。また、あるデータ要素をもつノードと当該データ要素を受け取る複数のノードとが、同一のブロードキャストドメインに属する場合、ブロードキャストによりデータ要素を複製してもよい。ただし、ブロードキャストを採用する場合でも、データ総受信量を考慮すると、最適な行数hは数式(10)と同様に算出できる。また、第1のノードから第2のノードへデータ要素が送信されたとき、その後に第2のノードから第1のノードに送信すべきデータ要素がある場合には、受信に対する応答メッセージ(ACK(Acknowledgment)やNACK(Negative Acknowledgment))を独立に送信せず、後で送信されるデータ要素と合わせて送信してもよい。
図10は、第3の実施の形態のソフトウェア例を示すブロック図である。
ノード11は、受信部111、システム制御部112、ノード制御部114、実行部115およびデータ記憶部116を有する。ノード12〜16も、ノード11と同様のブロック構成によって実現できる。例えば、ノード12は、受信部121、ノード制御部124、実行部125およびデータ記憶部126を有する(図10では、ノード12のシステム制御部の記載を省略している)。クライアント31は、要求部311を有する。データ記憶部116,126は、RAMやHDDに確保された記憶領域として実現でき、他のブロックは、プログラムのモジュールとして実現できる。
要求部311は、ユーザ操作に応じて、データ処理開始のコマンドを送信する。コマンドは、ノード11〜16の何れに対して送信してもよい。以下の説明では、要求部311がノード11にデータ処理開始のコマンドを送信した場合を考える。
受信部111は、クライアント31や他のノードからコマンドを受信する。受信部111に対応するプロセスは、ノード11で常時起動している。受信部111は、クライアント31からコマンドを受信すると、システム制御部112を呼び出す。また、受信部111は、システム制御部112からコマンドを受信すると、ノード制御部114を呼び出す。ただし、ノード11ではなく他のノードでシステム制御部が起動した場合、受信部111は、他のノードのシステム制御部からコマンドを受信し、ノード制御部114を呼び出す。なお、ノード11は、各ノードの受信部に対応するプロセスのアドレス(例えば、IP(Internet Protocol)アドレス)を知っている。
システム制御部112は、虱潰しジョインのトランザクション全体を統括する。システム制御部112に対応するプロセスは、受信部111から呼び出されることで起動する。クライアント31から要求されたデータ処理毎(トランザクション毎)に、データ処理に用いる複数のノードのうち1つのノードのみで、システム制御部が起動する。システム制御部112は、自身が起動すると、虱潰しジョインに用いるノードの受信部(例えば、受信部111,121)に、参加要求のコマンドを送信する。これにより、ノード11ではノード制御部114が呼び出され、ノード12ではノード制御部124が呼び出される。
また、システム制御部112は、ノード間の論理的な接続関係を決定し、データ要素をリレーする始点となるノードのノード制御部(例えば、ノード制御部114など)に、リレー指示のコマンドを送信する。リレー指示のコマンドには、リレーに用いるノードに関する情報が含まれる。また、システム制御部112は、データ要素の複製が完了した後に、虱潰しジョインに用いる全てのノードのノード制御部(例えば、ノード制御部114,124など)に、ジョイン指示のコマンドを送信する。また、虱潰しジョインが完了すると、システム制御部112は、クライアント31に完了を報告する。
ノード制御部114は、虱潰しジョインで行われる情報処理のうちノード11で行われる情報処理を統括する。ノード制御部114に対応するプロセスは、受信部111から呼び出されることで起動する。ノード制御部114は、システム制御部112から、リレー指示のコマンドを受信したときおよびジョイン指示のコマンドを受信したとき、実行部115を呼び出す。ただし、ノード11ではなく他のノードでシステム制御部が起動した場合、ノード制御部114は、他のノードのシステム制御部からリレー指示およびジョイン指示のコマンドを受信し、実行部115を呼び出す。また、ノード制御部114は、他のノードの実行部から受信指示のコマンドを受信したとき、実行部115を呼び出す。
実行部115は、ノード制御部114から要求された情報処理を実行する。実行部115に対応するプロセスは、ノード制御部114から呼び出されることで起動する。ノード11では、実行部115に対応するプロセスを複数起動することができる。これにより、データ集合Aのリレーとデータ集合Bのリレーを並列に実行するなど、複数の情報処理を並列に実行することができる。これは、ノード11が複数のプロセッサを備える場合や、複数コアを含むプロセッサを備える場合に、特に有効である。
実行部115は、リレー指示のコマンドに応じて呼び出されたとき、隣接するノードのノード制御部(例えば、ノード制御部124)に、受信指示のコマンドを送信する。これにより、隣接するノードでは、データ要素を受信するために実行部(例えば、実行部125)が呼び出される。そして、実行部115は、ノード11に配置されたデータ要素をデータ記憶部116から読み出し、隣接するノードの実行部へ送信する。
また、実行部115は、受信指示のコマンドに応じて呼び出されたとき、他のノードの実行部からデータ要素を受信し、データ記憶部116に書き込む。そして、ノード11がリレーの終点ではない場合、実行部115は、リレー指示のコマンドに応じて呼び出されたときと同様にして、受信したデータ要素を転送する。また、実行部115は、ジョイン指示のコマンドに応じて呼び出されたとき、データ記憶部116に記憶されたデータ要素の範囲内でローカルに虱潰しジョインを行い、結果をデータ記憶部116に書き込む。
データ記憶部116は、データ集合A,Bの一部のデータ要素を記憶する。データ記憶部116には、まずノード11に配置される部分集合A11,B11に属するデータ要素が記憶される。そして、データ要素のリレーを通じて、データ記憶部116には、行部分集合A1および列部分集合B1に属するデータ要素が記憶される。ノード12のデータ記憶部126も、同様に、データ集合A,Bの一部のデータ要素を記憶する。
なお、第1のモジュールが第2のモジュールにコマンドを送信し、第2のモジュールでコマンドに応じた情報処理が完了すると、第2のモジュールは第1のモジュールに完了通知を送信する。例えば、実行部115でローカルな虱潰しジョインが完了すると、実行部115はノード制御部114に完了通知を送信し、ノード制御部114はシステム制御部112に完了通知を送信する。システム制御部112は、虱潰しジョインに用いる全てのノードから完了通知を受信したとき、クライアント31に完了を報告する。
ここで、システム制御部112、ノード制御部114および実行部115は、例えば、コマンド解析部と最適化部とコード実行部の3階層の内部構造として実装できる。コマンド解析部は、受信したコマンドの文字列を解析し、解析結果を解析木として出力する。最適化部は、コマンド解析部が出力した解析木に基づいて、コマンドで要求されている情報処理を実現するのに最適な中間コードを生成(または選択)する。コード実行部は、最適化部が生成した中間コードを実行する。
図11は、第3の実施の形態のジョインの手順例を示すフローチャートである。なお、前述のように、システム全体のノード数に基づいて、データ処理に使用するノードの数Nを、ステップS11の処理の前にシステム制御部112が決定してもよい。
(ステップS11)システム制御部112は、クライアント31から入力されたデータ集合A,Bを、それぞれN個の部分集合Aij,Bijに分割し、虱潰しジョインに用いるノード11〜16に配置する。ただし、データ集合A,Bの配置は、ノード11がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従い、ノード11〜16が行っておいてもよい。また、データ集合A,Bとして前のデータ処理の結果を利用する場合であって、当該データ処理の結果が既にノード11〜16に配置されている場合には、データ集合A,Bの配置が完了しているものと取り扱ってもよい。
(ステップS12)システム制御部112は、虱潰しジョインに用いるノードの数Nと入力されたデータ集合A,Bそれぞれのデータ要素数とに基づいて、前述の数式(10)のような計算方法を用いて、行数hおよび列数wを決定する。
(ステップS13)システム制御部112は、ノード11〜16に、各ノードに配置された部分集合Aijを行方向に複製し、部分集合Bijを列方向に複製するよう指示する。各ノードの実行部は、部分集合Aijを行方向にリレーし、部分集合Bijを列方向にリレーする。リレー方法として、例えば、図9に示した方法Bまたは方法Cを用いる。この複製により、ノードnijは、行部分集合Aiと列部分集合Bjとを取得する。
(ステップS14)システム制御部112は、虱潰しジョインに用いるノード11〜16全てに、ローカルな虱潰しジョインの実行を指示する。各ノードの実行部は、ステップS13を通じて収集した行部分集合Aiと列部分集合Bjとの間でローカルに(他のノードと通信せずに)虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。ローカルな虱潰しジョインは、例えば、ネステッドループとして実現できる。
(ステップS15)システム制御部112は、虱潰しジョインに用いるノード11〜16全てでステップS14のデータ処理が完了したことを確認すると、クライアント31に虱潰しジョインの完了を報告する。このとき、システム制御部112は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。後者の場合、当該結果を次のデータ処理の入力として用いる場合に、データ配置処理を省略できることがある。
図12は、第3の実施の形態のデータ配置例を示す図(その1)である。この例では、6個のノードn11,n12,n13,n21,n22,n23(ノード11〜16)を、虱潰しジョインに用いる。また、データ集合Aに6個のデータ要素a1〜a6が含まれ、データ集合Bに12個のデータ要素b1〜b12が含まれる。各ノードnijには、均等に、1個のデータ要素を含む部分集合Aijと2個のデータ要素を含む部分集合Bijが配置される。例えば、ノードn11には、部分集合A11={a1}と部分集合B11={b1,b2}が配置される。ノード数N=6,データ集合Aのデータ要素数=6,データ集合Bのデータ要素数=12であるため、前述の数式(10)に従い、行数h=2と算出される。
行数hおよび列数wが決定されると、行番号が同じノード間で(行方向に)部分集合Aijが複製され、列番号が同じノード間で(列方向に)部分集合Bijが複製される。例えば、ノードn11に配置された部分集合A11が、ノードn11からノードn12に複製され、ノードn12からノードn13に複製される。また、ノードn11に配置された部分集合B11が、ノードn11からノードn21に複製される。
図13は、第3の実施の形態のデータ配置例を示す図(その2)である。上記のデータ要素の複製によって、ノードnijは、行部分集合Aiと列部分集合Bjを取得する。例えば、ノードn11,n12,n13は、行部分集合A1={a1,a2,a3}を取得し、ノードn11,n21は、列部分集合B1={b1,b2,b3,b4}を取得する。
図14は、第3の実施の形態のデータ配置例を示す図(その3)である。ノードnijは、上記のように取得した行部分集合Aiと列部分集合Bjの間で、ローカルに虱潰しジョインを行う。例えば、ノードn11は、行部分集合A1={a1,a2,a3}からデータ要素aを1つ選択し、列部分集合B1={b1,b2,b3,b4}からデータ要素bを1つ選択することで、3個×4個=12通りの順序対に対してmap関数を適用する。図14に示すように、ノードn11,n12,n13,n21,n22,n23は、それぞれ均等に12通りの順序対を処理している。また、データ集合A,Bの間の6個×12個=72通りの順序対が網羅されており、かつ、ノード間で重複して処理される順序対がない。
第3の実施の形態の情報処理システムによれば、データ集合A,Bの間の虱潰しジョインを、複数のノードを用いて効率的に実行できる。特に、データ集合A,Bそれぞれを、虱潰しジョインに用いる複数のノードに、均等(または、ほぼ均等)かつ重複なく分散した状態から、虱潰しジョインを実行できる。また、各ノードのデータ処理量が均等(または、ほぼ均等)になり、かつ、ノード間で重複するデータ処理が発生しない。このため、第3の実施の形態の虱潰しジョインは、通信のオーバヘッドを除いて、スケーラブルである(ノード数をN倍にすると処理時間が1/Nになる)と言える。
[第4の実施の形態]
次に、第4の実施の形態を説明する。第3の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第4の実施の形態では、複数の通信装置が階層的に接続されている大規模な情報処理システムを用いて、虱潰しジョインを実行する。
図15は、第4の実施の形態の情報処理システムを示す図である。第4の実施の形態の情報処理システムは、仮想ノード20,20a,20b,20c,20d,20e、クライアント31およびネットワーク41を有する。
仮想ノード20,20a,20b,20c,20d,20eは、少なくとも1つのスイッチ(例えば、レイヤ2スイッチ)と当該スイッチに接続された複数のノードとを含む。例えば、仮想ノード20は、ノード21〜24およびスイッチ25を有する。仮想ノード20aは、ノード21a〜24aおよびスイッチ25aを有する。各仮想ノードは、虱潰しジョインにおいて、仮想的に1つのノードとして取り扱われることがある。
各仮想ノードは、同数のノードを含む。各仮想ノードのノード数は、通信装置との接続関係などを考慮して、予め定められている。ただし、各仮想ノード内でデータ処理に使用するノードの数は、第3の実施の形態で述べたように、予め定められたノード数以下の範囲で約数が最も多くなる数字に設定してもよい。仮想ノード間には、1対1のノードの対応関係が与えられている。例えば、ノード21とノード21aとが対応し、ノード22とノード22aとが対応し、ノード23とノード23aとが対応し、ノード24とノード24aとが対応する。なお、図15には、1階層の仮想化の例を示したが、仮想ノードが別の仮想ノードを含むように、多階層の仮想化を行うことも可能である。
図16は、第4の実施の形態のノード関係を示す図である。第4の実施の形態の虱潰しジョインでは、複数の仮想ノードを、論理的に矩形状に並べられたものとして扱う。縦方向にはH個の仮想ノードが並び、横方向にはW個の仮想ノードが並ぶ。行数Hおよび列数Wは、前述の方法と同様に、仮想ノード数とデータ集合A,Bそれぞれのデータ要素数とから決定できる。また、各仮想ノード内では、複数のノードを、論理的に矩形状に並べられたものとして扱う。縦方向にh個のノードが並び、横方向にw個のノードが並ぶ。行数hおよび列数wは、全ての仮想ノードに共通に決定され、仮想ノード1つ当たりのノード数とデータ集合A,Bそれぞれのデータ要素数とから決定できる。
i行目・j列目の仮想ノードはijnと表すことができる。仮想ノードijn内におけるi行目・j列目のノードはijnijと表すことができる。虱潰しジョインを開始する際、データ集合A,Bは、データ処理に用いる全ての仮想ノード11n,…,HWnに含まれる全てのノードn11,…,nhwに、均等(または、ほぼ均等)かつ重複なく分散される。
ノード間でのデータ要素の複製は、後述するように、まず異なる2以上のスイッチを介して仮想ノード間で行われ、その後、各仮想ノード内で閉じて行われる。仮想ノード間でのデータ要素の複製と、各仮想ノード内でのデータ要素の複製とは、再帰的関係にある。すなわち、行番号が同じ仮想ノード間でデータ集合Aの部分集合を複製し、列番号が同じ仮想ノード間でデータ集合Bの部分集合を複製する。その後、各仮想ノード内において、行番号が同じノード間でデータ集合Aの部分集合を複製し、列番号が同じノード間でデータ集合Bの部分集合を複製する。仮想ノード間の通信は、「対応するノード」同士の通信として実現する。例えば、仮想ノード11nから仮想ノード12nにデータ要素を複製する場合、ノード11n11からノード12n11にデータ要素を送信し、ノード11n12からノード12n12にデータ要素を送信する。対応しないノード間では、通信は行われない。
図17は、第4の実施の形態のソフトウェア例を示すブロック図である。
ノード21は、受信部211、システム制御部212、仮想ノード制御部213、ノード制御部214、実行部215およびデータ記憶部216を有する。ノード22〜24やノード21a〜24aを含む他のノードも、ノード21と同様のブロック構成によって実現できる。例えば、ノード22は、受信部221、ノード制御部224、実行部225およびデータ記憶部226を有する(図17では、ノード22のシステム制御部や仮想ノード制御部の記載を省略している)。ノード21aは、受信部211aおよび仮想ノード制御部213aを有する(図17では、ノード21aのシステム制御部やノード制御部、実行部、データ記憶部の記載を省略している)。ノード22aは、受信部221aを有する(図17では、ノード22aのシステム制御部や仮想ノード制御部、ノード制御部、実行部、データ記憶部の記載を省略している)。第3の実施の形態と同様、データ記憶部216,226は、RAMやHDDに確保された記憶領域として実現でき、他のブロックは、プログラムのモジュールとして実現できる。
以下の説明では、ノード21が、クライアント31から要求されたデータ処理を統括する場合を考える。また、ノード21が、ノード21の属する仮想ノード20を統括し、ノード21aが、ノード21aの属する仮想ノード20aを統括する場合を考える。
受信部211は、クライアント31や他のノードからコマンドを受信する。受信部211に対応するプロセスは、ノード21で常時起動している。受信部211は、クライアント31からコマンドを受信すると、システム制御部212を呼び出す。また、受信部211は、システム制御部212からコマンドを受信すると、仮想ノード制御部213を呼び出し、仮想ノード制御部213からコマンドを受信すると、ノード制御部214を呼び出す。ただし、ノード21ではなく他のノードでシステム制御部が起動した場合、受信部211は、他のノードのシステム制御部からコマンドを受信したとき、仮想ノード制御部213を呼び出す。また、他のノードで仮想ノード制御部が起動した場合、受信部211は、他のノードの仮想ノード制御部からコマンドを受信しノード制御部214を呼び出す。
システム制御部212は、虱潰しジョインに用いる複数の仮想ノード全体を統括する。クライアント31から要求されたデータ処理毎(トランザクション毎)に、データ処理に用いる複数のノードのうち1つのノードのみで、システム制御部が起動する。システム制御部212は、自身が起動すると、各仮想ノードの所定のノード(代表ノード)に、当該仮想ノードの制御を担当するノード(代理ノード)を問い合わせる。代理ノードは、ノード間で負荷が分散されるように、虱潰しジョインのトランザクション毎に選択される。そして、システム制御部212は、各仮想ノードの代理ノードの受信部に、代理指示のコマンドを送信する。これにより、例えば、ノード21では仮想ノード制御部213が呼び出され、ノード21aでは仮想ノード制御部213aが呼び出される。
また、システム制御部212は、代理指示のコマンドを送信した後、各仮想ノードの仮想ノード制御部(例えば、仮想ノード制御部213,213aなど)に、参加要求のコマンドを送信する。また、システム制御部212は、仮想ノード間およびノード間の論理的な接続関係を決定し、各仮想ノードの仮想ノード制御部に、リレー指示のコマンドを送信する。また、システム制御部212は、データ要素の複製が完了した後、各仮想ノードの仮想ノード制御部に、ジョイン指示のコマンドを送信する。また、虱潰しジョインが完了すると、システム制御部212は、クライアント31に完了を報告する。
仮想ノード制御部213は、仮想ノード20に属する複数のノード21〜24を統括する。仮想ノード制御部213に対応するプロセスは、受信部211から呼び出されることで起動する。クライアント31から要求されたデータ処理毎(トランザクション毎)かつ仮想ノード毎に、当該仮想ノードに属する複数のノードのうち1つのノードのみで、仮想ノード制御部が起動する。仮想ノード制御部213は、自身が起動すると、システム制御部212から参加要求のコマンドを受信したとき、仮想ノード20内のデータ処理に用いるノードの受信部(例えば、受信部211,221など)に、参加要求のコマンドを送信する。これにより、ノード21ではノード制御部214が呼び出され、ノード22ではノード制御部224が呼び出される。
また、仮想ノード制御部213は、システム制御部212からリレー指示のコマンドを受信すると、データ要素をリレーする始点となるノードのノード制御部(例えば、ノード制御部214など)に、リレー指示のコマンドを送信する。また、仮想ノード制御部213は、システム制御部212からジョイン指示のコマンドを受信すると、仮想ノード20内のデータ処理に用いる全てのノードのノード制御部(例えば、ノード制御部214,224など)に、ジョイン指示のコマンドを送信する。
ノード制御部214は、虱潰しジョインで行われる情報処理のうちノード21で行われる情報処理を統括する。ノード制御部214に対応するプロセスは、受信部211から呼び出されることで起動する。ノード制御部214は、仮想ノード制御部213からリレー指示のコマンドを受信したときおよびジョイン指示のコマンドを受信したとき、実行部215を呼び出す。ただし、ノード21ではなく他のノードで仮想ノード制御部が起動した場合、ノード制御部214は、他のノードの仮想ノード制御部からリレー指示およびジョイン指示のコマンドを受信し、実行部215を呼び出す。また、ノード制御部214は、他のノードの実行部から受信指示のコマンドを受信したとき、実行部215を呼び出す。
実行部215は、ノード制御部214から要求された情報処理を実行する。実行部215に対応するプロセスは、ノード制御部214から呼び出されることで起動する。ノード21では、実行部215に対応するプロセスを複数起動できる。実行部215は、リレー指示のコマンドに応じて呼び出されたとき、他のノードのノード制御部(例えば、ノード制御部224)に受信指示のコマンドを送信し、データ記憶部216からデータ要素を読み出して他のノードの実行部(例えば、実行部225)へ送信する。
また、実行部215は、受信指示のコマンドに応じて呼び出されたとき、他のノードの実行部からデータ要素を受信し、データ記憶部216に書き込む。ノード21がリレーの終点でない場合、実行部215は、受信したデータ要素を転送する。また、実行部215は、ジョイン指示のコマンドに応じて呼び出されたとき、収集されたデータ要素の範囲内でローカルに虱潰しジョインを行い、結果をデータ記憶部216に書き込む。
データ記憶部216は、データ集合A,Bの一部のデータ要素を記憶する。データ記憶部216には、まずノード21に配置される部分集合に属するデータ要素が記憶される。そして、仮想ノード間および仮想ノード20内でのデータ要素のリレーを通じて、データ記憶部216には、行部分集合および列部分集合に属するデータ要素が収集される。ノード22のデータ記憶部226も、データ集合A,Bの一部のデータ要素を記憶する。
図18は、第4の実施の形態のジョインの手順例を示すフローチャートである。なお、前述のように、システム全体のノード数や各仮想ノードのノード数に基づいて、データ処理に使用するノード数や各仮想ノード内で使用するノード数を、ステップS21の前にシステム制御部212が決定してもよい。
(ステップS21)システム制御部212は、クライアント31から入力されたデータ集合A,Bをそれぞれ、虱潰しジョインに用いる仮想ノードの数分の部分集合に分割し仮想ノードに分配する。各仮想ノードの仮想ノード制御部は、分配された部分集合を、当該仮想ノード内の虱潰しジョインに用いるノード数分の部分集合に更に分割しノードに分配する。これにより、データ集合A,Bが複数のノードに分散される。ただし、データ集合A,Bの配置は、ノード21がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合A,Bとして前のデータ処理の結果を利用する場合には、データ集合A,Bの配置が完了していることもある。
(ステップS22)システム制御部212は、虱潰しジョインに用いる仮想ノードの数とデータ集合A,Bそれぞれのデータ要素数に基づいて、前述の数式(10)のような計算方法を用いて、仮想ノードの行数Hおよび列数Wを決定する。
(ステップS23)システム制御部212は、各仮想ノードの代理ノードに、仮想ノード間でデータ要素を複製するよう指示する。各代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに、他の仮想ノードとの間でデータ要素を複製するよう指示する。各ノードの実行部は、データ集合Aの部分集合を、行番号が同じ他の仮想ノードにある自ノードに対応するノードと通信することで、行方向にリレーする。また、各ノードの実行部は、データ集合Bの部分集合を、列番号が同じ他の仮想ノードにある自ノードに対応するノードと通信することで、列方向にリレーする。
なお、仮想ノードが入れ子になっており多階層に仮想化されている場合は、ステップS22,S23の処理が再帰的に実行される。その場合、再帰処理に関しては、システム制御部212が行った上記処理を仮想ノード制御部が引き継ぐことで実現できる。ステップ21の処理についても同様である。
(ステップS24)システム制御部212は、仮想ノード1つ当たりのノード数とその時点の仮想ノード1つ当たりのデータ集合A,Bのデータ要素数に基づいて、前述の数式(10)のような計算方法を用いて、ノードの行数hおよび列数wを決定する。
(ステップS25)システム制御部212は、各仮想ノードの代理ノードに、仮想ノード内でデータ要素を複製するよう指示する。各代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに、現在まで収集したデータ要素を仮想ノード内で複製するよう指示する。各ノードの実行部は、自ノードに配置されたデータ集合Aの部分集合とステップS23で他の仮想ノードから受信したデータ集合Aの部分集合を、行方向に送信する。また、各ノードの実行部は、自ノードに配置されたデータ集合Bの部分集合とステップS23で他の仮想ノードから受信したデータ集合Bの部分集合を、列方向に送信する。
(ステップS26)システム制御部212は、各仮想ノードの代理ノードに、ローカルな虱潰しジョインの実行を指示する。各代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに、ローカルな虱潰しジョインの実行を指示する。各ノードの実行部は、ステップS23,S25を通じて収集した行部分集合と列部分集合との間でローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS27)システム制御部212は、虱潰しジョインに用いる全てのノードでステップS26のデータ処理が完了したことを確認すると、クライアント31に虱潰しジョインの完了を報告する。このとき、システム制御部212は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図19は、第4の実施の形態のデータ配置例を示す図(その1)である。この例では、6個の仮想ノード11n,12n,13n,21n,22n,23n(仮想ノード20,20a,20b,20c,20d,20e)を、虱潰しジョインに用いる。データ集合Aには、24個のデータ要素a1〜a24が含まれ、データ集合Bには48個のデータ要素b1〜b48が含まれる。仮想ノード数=6,データ集合Aのデータ要素数=24,データ集合Bのデータ要素数=48であるため、前述の数式(10)に従い、仮想ノードの行数H=2と算出される。各仮想ノードを仮想的に1つのノードと見ると、仮想ノードijnには、部分集合Aijと部分集合Bijが配置されていると言える。例えば、仮想ノード11nには、部分集合A11と部分集合B11が配置されている。
図20は、第4の実施の形態のデータ配置例を示す図(その2)である。この例では、仮想ノード11n,12n,13n,21n,22n,23nは、それぞれ4つのノードn11,n12,n21,n22を含む。各ノードには、均等に、データ集合Aに属する1個のデータ要素とデータ集合Bに属する2個のデータ要素が、部分集合として配置されることになる。例えば、ノード11n11には、データ要素a1とデータ要素b1,b2が配置される。
データ要素が配置されて仮想ノードの行数Hおよび列数Wが決定されると、行番号が同じ仮想ノード間で(行方向に)データ集合Aの部分集合が複製され、列番号が同じ仮想ノード間で(列方向に)データ集合Bの部分集合が複製される。このとき、仮想ノード間のデータ要素の複製は、対応するノード同士のみが行う。例えば、ノード11n11に配置されたデータ要素a1が、ノード11n11からノード12n11に複製され、ノード12n11からノード13n11に複製される。また、ノード11n11に配置されたデータ要素b1,b2が、ノード11n11からノード21n11に複製される。この時点では、対応関係にないノード間ではデータ要素は複製されない。例えば、ノード11n11に配置されたデータ要素a1は、この時点ではノード12n12やノード13n12には複製されない。
図21は、第4の実施の形態のデータ配置例を示す図(その3)である。この例では、ノード間の複製が完了した時点で、各ノードには、データ集合Aに属する3個のデータ要素とデータ集合Bに属する4個のデータ要素が収集されている。例えば、ノード11n11には、データ要素a1,a3,a5とデータ要素b1,b2,b5,b6が収集される。仮想ノード1個あたり、ノード数=4,データ集合Aのデータ要素数=12,データ集合Bのデータ要素数=16であるため、前述の数式(10)に従い、行数h=2と算出される。
仮想ノード内の行数hと列数wが決定されると、各仮想ノード内でデータ要素が複製される。すなわち、行番号が同じノード間で(行方向に)、他の仮想ノードから受信したデータ要素も含めて、データ集合Aの部分集合が複製される。また、列番号が同じノード間で(列方向に)、他の仮想ノードから受信したデータ要素も含めて、データ集合Bの部分集合が複製される。例えば、ノード11n11に収集されたデータ要素a1,a3,a5が、ノード11n11からノード11n12に複製される。また、ノード11n11に収集されたデータ要素b1,b2,b5,b6が、ノード11n11からノード11n21に複製される。仮想ノード内での複製処理では、複数の仮想ノードに跨がる通信は行わなくてよい。
図22は、第4の実施の形態のデータ配置例を示す図(その4)である。上記のデータ要素の複製を通じて、各ノードは、データ集合Aに関する行部分集合と、データ集合Bに関する列部分集合を取得する。例えば、ノード11n11,11n12,12n11,12n12,13n11,13n12は、行部分集合としてデータ要素a1〜a6を取得する。また、ノード11n11,11n21,21n11,21n21は、列部分集合としてデータ要素b1〜b8を取得する。これは、24個のノードを複数の仮想ノードに分類しない場合と同じ結果となっている。
各ノードは、自ノードが取得した行部分集合と列部分集合の間で、ローカルに虱潰しジョインを行う。例えば、ノード11n11は、6個のデータ要素a1〜a6から1つ選択し、8個のデータ要素b1〜b8から1つ選択することで、6個×8個=48通りの順序対に対してmap関数を適用する。図22に示すように、各ノードは、均等に48通りの順序対を処理している。また、データ集合A,Bの間の24個×48個=1152通りの順序対が網羅されており、かつ、ノード間で重複して処理される順序対がない。
第4の実施の形態の情報処理システムによれば、第3の実施の形態と同様の効果が得られる。更に、第4の実施の形態では、通信遅延の比較的大きい仮想ノード間の通信を纏めて行い、その後、通信遅延の比較的小さい仮想ノード内の通信のみを行うため、ノード間の物理的な通信距離を考慮しない場合と比べて、意図しない待ち時間を抑制し得る。そのため、通信の並列化が容易となり、データ要素の複製を一層効率化できる。
[第5の実施の形態]
次に、第5の実施の形態を説明する。第3および第4の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第5の実施の形態では、虱潰しジョインに代えて、以下に説明する「三角ジョイン」を実行する。第5の実施の形態の情報処理システムは、図3,4,10に示した第3の実施の形態と同様のシステム構成で実現できる。なお、三角ジョインは、単にジョインの一種として扱われることがある。
三角ジョインでは、m個(mは2以上の整数)のデータ要素a1,a2,…,amを含む1つのデータ集合Aが与えられる。三角ジョインの結果は、数式(11)に示すように、データ集合Aに含まれる2つのデータ要素ai,ajの順序を考慮しない組み合わせ全てに対して、map関数を適用することで得られるデータ集合である。map関数は、虱潰しジョインと同様、引数として与えられるデータ要素ai,ajによっては、結果のデータ要素を出力しないこともあるし、2以上の結果のデータ要素を出力することもある。なお、数式(11)の定義では、同じデータ要素同士の組み合わせ(ai=ajの場合)にもmap関数が適用されるが、このような組み合わせを除外することも可能である。
図23は、三角ジョインを示す図である。三角ジョインは、順序を考慮しない2つのデータ要素の組み合わせ毎にmap関数を適用するものであるため、map(ai,aj)を計算すればmap(aj,ai)は計算しなくてよい。よって、縦軸と横軸にそれぞれデータ集合Aのデータ要素を並べてマトリクスを形成すると、図23に示すように、map関数の演算を行うべき領域が直角三角形として表現される。すなわち、map関数の演算は、m(m+1)/2個またはm(m−1)/2個の組み合わせに対して実行される。三角ジョインの代用としてデータ集合Aとデータ集合Aの間で虱潰しジョインを行う場合と比べて、データ処理量を約半分に低減することが可能となる。
ローカルで(1つのノードに閉じて)実行される三角ジョインは、例えば、以下のような手順として実装できる。ブロック(1またはそれ以上のデータ要素を含む読み出しの単位)をRAM上にα個格納できるとき、ノードは、先頭からα−1個のブロックをRAMに読み込む。例えば、ノードは、データ要素a1,a2をRAMに読み込む。次に、ノードは、RAM上のα−1個のブロック内で三角ジョインを実行する。例えば、ノードは、組み合わせ(a1,a1),(a1,a2),(a2,a2)にmap関数を適用する。
次に、ノードは、RAM上にあるブロックに続く1個のブロックをRAMに読み込み、先に読み込んだα−1個のブロックと1個のブロックとの間で、虱潰しジョインを実行する。例えば、ノードは、データ要素a3をRAMに読み込み、組み合わせ(a1,a3),(a2,a3)にmap関数を適用する。その後、ノードは、先頭のα−1ブロックをRAM上に保持したまま、最後のブロックに至るまで1ブロックずつ処理する。先頭のα−1ブロックと最後の1ブロックとの間の虱潰しジョインが終わると、ノードは、RAM上にある先頭のα−1個のブロックをクリアし、それに続く新たなα−1のブロックをRAMに読み込む。例えば、ノードは、データ要素a3,a4をRAMに読み込む。その後、新たなα−1個のブロックを基準に、三角ジョインおよび虱潰しジョインを行う。以下、同様に、α−1個のブロックとして全てのブロックが読み込まれるまで、当該処理を繰り返す。なお、総ブロック数によっては、繰り返しの最後で、残りのブロックとしてα−1個以下のブロックを読み込むことになる場合がある。
ただし、図23に示す複数のmap関数の演算は、虱潰しジョインと同様、互いに独立に実行可能であるため、複数のノードを用いて並列化できる。
図24は、三角ジョインの実行結果の例を示す図である。図24の数値例では、データ集合Aは4個のデータ要素a1〜a4を含む。各データ要素は、X軸の値とY軸の値とを含んでおり、平面上の点を表している。map関数は、2個のデータ要素から、2点間の距離を計算する。三角ジョインを行うと、4×(4+1)/2=10個の組み合わせに対し、map関数が適用される。ただし、同じデータ要素同士の組み合わせを除外する場合には、4×(4−1)/2=6個の組み合わせに対し、map関数が適用される。
図25は、第5の実施の形態のノード関係を示す図である。第5の実施の形態の三角ジョインでは、データ処理に用いる複数のノードを、論理的に直角二等辺三角形状に並べられたものとして扱う。ノード集合の縦方向および横方向には、それぞれ最大でh個のノードが並ぶ。i行目にはh−i+1個のノードが横方向に並び、j列目にはj個のノードが縦方向に並ぶ。i行目・j列目のノードはnijと表すことができる。行数hは、データ処理に使用するノードの数Nに基づいて、情報処理システムが決定する。例えば、h2<=Nを満たす最大の整数をhとし、三角ジョインにh2個のノードを使用する。
データ集合Aは、直角二等辺三角形状に並べられた複数のノードのうち、ノードn11を含む対角線上にあるh個のノードn11,n22,…,nhhに分散される。データ要素は、虱潰しジョインの場合と同様に、均等(または、ほぼ均等)かつノード間で重複がないよう配置される。対角線上のノード以外のノードには、データ要素は配置されない。例えば、数式(12)に示すように、ノードniiに部分集合Aiが配置される。部分集合Aiのデータ要素数は、データ集合Aのデータ要素数を行数hで割ったものになる。
図26は、第5の実施の形態のジョインの手順例を示すフローチャートである。
(ステップS31)システム制御部112は、三角ジョインに用いるノードの数に基づいて行数hを決定し、ノード間の論理的な接続関係を決定する。
(ステップS32)システム制御部112は、クライアント31から入力されたデータ集合Aを、h個の部分集合A1,A2,…,Ahに分割し、三角ジョインに用いるノードのうちノードn11を含む対角線上のh個のノードに配置する。ただし、データ集合Aの配置は、ノード11がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合Aとして前のデータ処理の結果を利用する場合、データ集合Aの配置が完了していることもある。
(ステップS33)システム制御部112は、対角線上のノードniiに、各ノードに配置された部分集合Aiを右方向および上方向に複製するよう指示する。各ノードの実行部は、対角線上のノードniiを始点として、部分集合Aiを右方向および上方向にリレーする。下方向および左方向にはリレーは行われない。リレー方法として、例えば、図9に示した方法Aを用いる。この複製により、対角線上にないノードnijは、ノードniiに配置された部分集合Ai(Ax)とノードnjjに配置された部分集合Aj(Ay)を取得する。一方、対角線上のノードniiは、他のノードからデータ要素を受信しない。
(ステップS34)システム制御部112は、三角ジョインに用いるノードのうち対角線上のノードに、ローカルな三角ジョインの実行を指示する。対角線上のノードniiの実行部は、部分集合Aiの中でローカルに三角ジョインを行い、結果を当該ノードのデータ記憶部に書き込む。また、システム制御部112は、対角線上にないノードに、ローカルな虱潰しジョインの実行を指示する。対角線上にないノードnijは、右方向のリレーで取得した部分集合Axと上方向のリレーで取得した部分集合Ayとの間で、ローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS35)システム制御部112は、三角ジョインに用いるノード全てでステップS34のデータ処理が完了したことを確認すると、クライアント31に三角ジョインの完了を報告する。このとき、システム制御部112は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図27は、第5の実施の形態のデータ配置例を示す図(その1)である。この例では、6個のノードn11,n12,n13,n22,n23,n33を三角ジョインに用いる。また、データ集合Aに9個のデータ要素a1〜a9が含まれている。対角線上のノードniiには、3個のデータ要素を含む部分集合Aiが配置される。例えば、ノードn11には、部分集合A1={a1,a2,a3}が配置される。そして、対角線上のノードniiを始点として、部分集合Aiが右方向のノードおよび上方向のノードに複製される。例えば、ノードn11に配置された部分集合A1が、ノードn11からノードn12に複製され、ノードn12からノードn13に複製される。また、ノードn22に配置された部分集合A2が、ノードn22からノードn12に複製されると共に、ノードn22からノードn23に複製される。
図28は、第5の実施の形態のデータ配置例を示す図(その2)である。上記のデータ要素の複製を行うと、対角線上のノードniiは、当初配置された部分集合Aiのみを保持する。一方、対角線上にないノードnijは、部分集合Aiを左隣のノードから受信し、部分集合Ajを下方向のノードから受信する。例えば、ノードn13は、部分集合A1={a1,a2,a3}と部分集合A3={a7,a8,a9}を取得する。
対角線上のノードniiは、部分集合Aiの中で、ローカルに三角ジョインを行う。例えば、ノードn11は、A1={a1,a2,a3}から抽出される6通りの組み合わせに対してmap関数を適用する。また、対角線上にないノードnijは、部分集合Aiと部分集合Ajの間で、ローカルに虱潰しジョインを行う。例えば、ノードn13は、部分集合A1={a1,a2,a3}からデータ要素を1つ選択し、部分集合A3={a7,a8,a9}からデータ要素を1つ選択することで、3個×3個=9通りの順序対に対してmap関数を適用する。図28に示すように、データ集合Aから抽出される45通りの組み合わせが網羅されており、かつ、ノード間で重複して処理される組み合わせがない。
第5の実施の形態の情報処理システムによれば、データ集合Aの三角ジョインを、ノード間で重複するデータ処理が発生しないように、効率的に実行できる。
[第6の実施の形態]
次に、第6の実施の形態を説明する。第3〜第5の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第6の実施の形態では、三角ジョインを、第5の実施の形態とは異なる方法で実行する。第6の実施の形態の情報処理システムは、図3,4,10に示した第3の実施の形態と同様のシステム構成で実現できる。
図29は、第6の実施の形態のノード関係を示す図である。第6の実施の形態の三角ジョインでは、データ処理に用いる複数のノードを、論理的に正方形状に並べられたものとして扱う。ノード集合の縦方向および横方向には、それぞれh個のノードが並ぶ。行数hは、データ処理に使用するノードの数に基づいて、情報処理システムが決定する。例えば、h2<=Nを満たす最大の整数をhとし、三角ジョインにh2個のノードを使用する。データ集合Aは、第5の実施の形態の三角ジョインと同様、ノードn11を含む対角線上にあるh個のノードn11,n22,…,nhhに分散して配置される。
図30は、第6の実施の形態のジョインの手順例を示すフローチャートである。
(ステップS41)システム制御部112は、三角ジョインに用いるノードの数に基づいて行数hを決定し、ノード間の論理的な接続関係を決定する。
(ステップS42)システム制御部112は、クライアント31から入力されたデータ集合Aを、h個の部分集合A1,A2,…,Ahに分割し、三角ジョインに用いるノードのうちノードn11を含む対角線上のh個のノードに配置する。ただし、データ集合Aの配置は、ノード11がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合Aとして前のデータ処理の結果を利用する場合、データ集合Aの配置が完了していることもある。
(ステップS43)システム制御部112は、対角線上のノードniiに、各ノードに配置された部分集合Aiを行方向および列方向に複製するよう指示する。対角線上のノードniiの実行部は、部分集合Aiに含まれる全てのデータ要素を、右方向のノードと下方向のノードに送信する。また、対角線上のノードniiの実行部は、データ要素数ができる限り同じになるよう部分集合Aiを二分割し、一方のデータ要素を左方向のノードに送信し、他方のデータ要素を上方向のノードに送信する。リレー方法として、例えば、図9に示した方法Cを用いる。この複製により、対角線上にないノードnijは、ノードniiに配置された部分集合Ai(Ax)とノードnjjに配置された部分集合Ajの半分(Ay)を取得するか、または、部分集合Aiの半分(Ax)と部分集合Aj(Ay)を取得する。一方、対角線上のノードniiは、他のノードからデータ要素を受信しない。
(ステップS44)システム制御部112は、三角ジョインに用いるノードのうち対角線上のノードに、ローカルな三角ジョインの実行を指示する。対角線上のノードniiの実行部は、部分集合Aiの中でローカルに三角ジョインを行い、結果を当該ノードのデータ記憶部に書き込む。また、システム制御部112は、対角線上にないノードに、ローカルな虱潰しジョインの実行を指示する。対角線上にないノードnijは、行方向のリレーで取得した部分集合Axと列方向のリレーで取得した部分集合Ayとの間で、ローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS45)システム制御部112は、三角ジョインに用いるノード全てでステップS44のデータ処理が完了したことを確認すると、クライアント31に三角ジョインの完了を報告する。このとき、システム制御部112は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図31は、第6の実施の形態のデータ配置例を示す図(その1)である。この例では、9個のノードn11,n12,…,n33を三角ジョインに用いる。また、データ集合Aに9個のデータ要素a1〜a9が含まれている。第5の実施の形態で示した例と同様に、対角線上のノードniiには、3個のデータ要素を含む部分集合Aiが配置される。
そして、対角線上のノードniiを始点として、部分集合Aiが右方向のノードおよび下方向のノードに複製される。また、部分集合Aiを二分割した一方が左方向のノードに複製され、他方が上方向のノードに複製される。例えば、ノードn22に配置されたデータ要素a4,a5,a6の全部が、ノードn22からノードn23に複製されると共に、ノードn22からノードn32に複製される。また、データ要素a4,a5,a6の半分(正確には約半分)であるデータ要素a4が、ノードn22からノードn21に複製され、残りの半分であるデータ要素a5,a6が、ノードn22からノードn12に複製される。
図32は、第6の実施の形態のデータ配置例を示す図(その2)である。上記のデータ要素の複製を行うと、対角線上のノードniiは、当初配置された部分集合Aiのみを保持する。一方、対角線上にないノードnijは、行方向に隣接するノードから部分集合Ax(AiまたはAiの半分)を受信し、列方向に隣接するノードから部分集合Ay(AjまたはAjの半分)を受信する。例えば、ノードn13は、部分集合A1内の全てのデータ要素a1,a2,a3と部分集合A3内の一部のデータ要素a8,a9を取得する。
対角線上のノードniiは、第5の実施の形態と同様、部分集合Aiの中で、ローカルに三角ジョインを行う。一方、対角線上にないノードは、取得した部分集合Axと部分集合Ayの間で、ローカルに虱潰しジョインを行う。例えば、ノードn13は、データ要素a1,a2,a3から1つ選択し、データ要素a8,a9から1つ選択することで、3個×2個=6通りの順序対に対してmap関数を適用する。図32に示すように、第6の実施の形態の方法は、第5の実施の形態の対角線上にないノードで行われるデータ処理を二分割して、分割した一方のデータ処理を対角線より下にあるノードに振り替えたものと言うことができる。また、データ集合Aから抽出される45通りの組み合わせが網羅されており、かつ、ノード間で重複して処理される組み合わせがない。
第6の実施の形態の情報処理システムによれば、データ集合Aの三角ジョインを、複数のノードを用いて効率的に実行できる。特に、第6の実施の形態では、データ処理の負荷を、できる限り均等に複数のノードに配分することが可能となる。
[第7の実施の形態]
次に、第7の実施の形態を説明する。第3〜第6の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第7の実施の形態では、三角ジョインを、第5および第6の実施の形態とは異なる方法で実行する。第7の実施の形態の情報処理システムは、図3,4,10に示した第3の実施の形態と同様のシステム構成で実現できる。
図33は、第7の実施の形態のノード関係を示す図である。第7の実施の形態の三角ジョインでは、データ処理に用いる複数のノードを、論理的に正方形状に並べられたものとして扱う。ノード集合の縦方向および横方向には、それぞれ2k+1個(kは1以上の整数)、すなわち、3個以上の奇数個のノードが並ぶ。行数h=2k+1は、データ処理に使用できるノードの数に基づいて、情報処理システムが決定する。例えば、h2<=Nを満たす最大の奇数をhとし、三角ジョインにh2個のノードを使用する。また、第7の実施の形態の三角ジョインでは、これら複数のノードを、論理的にトーラス状に接続されたものとして扱う。よって、ノードnihの右側にノードni1が隣接し、ノードnhjの下側にノードn1jが隣接しているものとして扱う。データ集合Aは、ノードn11を含む対角線上にあるh個のノードn11,n22,…,nhhに分散して配置される。
図34は、第7の実施の形態のジョインの手順例を示すフローチャートである。
(ステップS51)システム制御部112は、三角ジョインに使用できるノードの数に基づいて行数h=2k+1を決定し、ノード間の論理的な接続関係を決定する。
(ステップS52)システム制御部112は、クライアント31から入力されたデータ集合Aを、h個の部分集合A1,A2,…,Ahに分割し、三角ジョインに用いるノードのうちノードn11を含む対角線上のh個のノードに配置する。ただし、データ集合Aの配置は、ノード11がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合Aとして前のデータ処理の結果を利用する場合、データ集合Aの配置が完了していることもある。
(ステップS53)システム制御部112は、対角線上のノードniiに、各ノードに配置された部分集合Aiを行方向および列方向に複製するよう指示する。対角線上のノードniiの実行部は、部分集合Aiを右側および下側の隣接するノードに送信する。
行方向のリレーで、ノードniiの右側にある1個目からk個目までの各ノードの実行部は、部分集合Aiを左隣のノードから受信する(Ax)。一方、k+1個目から2k個目までの各ノードの実行部は、部分集合Aiを二分割した一方を左隣のノードから受信する(Ax)。列方向のリレーで、ノードniiの下側にある1個目からk個目までの各ノードの実行部は、部分集合Aiを上の隣接ノードから受信する(Ay)。一方、k+1個目から2k個目までの各ノードの実行部は、部分集合Aiを二分割した他方を上の隣接ノードから受信する(Ay)。リレー方法として、例えば、図9に示した方法Bを用いる。
この複製により、対角線上にないノードnijは、ノードniiに配置された部分集合Ai(Ax)とノードnjjに配置された部分集合Ajの半分(Ay)を取得するか、または、部分集合Aiの半分(Ax)と部分集合Aj(Ay)を取得する。一方、対角線上のノードniiは、他のノードからデータ要素を受信しない。
(ステップS54)システム制御部112は、三角ジョインに用いるノードのうち対角線上のノードに、ローカルな三角ジョインの実行を指示する。対角線上のノードniiの実行部は、部分集合Aiの中でローカルに三角ジョインを行い、結果を当該ノードのデータ記憶部に書き込む。また、システム制御部112は、対角線上にないノードに、ローカルな虱潰しジョインの実行を指示する。対角線上にないノードnijは、行方向のリレーで取得した部分集合Axと列方向のリレーで取得した部分集合Ayとの間で、ローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS55)システム制御部112は、三角ジョインに用いるノード全てでステップS54のデータ処理が完了したことを確認すると、クライアント31に三角ジョインの完了を報告する。このとき、システム制御部112は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図35は、第7の実施の形態のデータ配置例を示す図(その1)である。この例では、k=1として、3×3=9個のノードn11,n12,…,n33を三角ジョインに用いる。また、データ集合Aに9個のデータ要素a1〜a9が含まれている。対角線上のノードには、それぞれ3個のデータ要素を含む部分集合が配置される。
対角線上のノードn11に配置されたデータ要素a1,a2,a3がノードn12に複製され、その半分(例えば、データ要素a3)がノードn13に複製される。また、データ要素a1,a2,a3がノードn21に複製され、その半分(例えば、データ要素a1,a2)がノードn31に複製される。同様に、対角線上のノードn22に配置されたデータ要素a4,a5,a6がノードn23に複製され、その半分(例えば、データ要素a4)がノードn21に複製される。また、データ要素a4,a5,a6がノードn32に複製され、その半分(例えば、データ要素a5,a6)がノードn12に複製される。対角線上のノードn33に配置されたデータ要素a7,a8,a9がノードn31に複製され、その半分(例えば、データ要素a7)がノードn32に複製される。また、データ要素a7,a8,a9がノードn13に複製され、その半分(例えば、データ要素a8,a9)がノードn23に複製される。
図36は、第7の実施の形態のデータ配置例を示す図(その2)である。上記のデータ要素の複製を行うと、対角線上のノードniiは、当初配置された部分集合Aiのみを保持する。一方、対角線上にないノードnijは、左隣のノードから部分集合Ax(AiまたはAiの半分)を受信し、上の隣接ノードから部分集合Ay(AjまたはAjの半分)を受信する。第5および第6の実施の形態と同様に、対角線上のノードniiは、部分集合Aiの中でローカルに三角ジョインを行う。対角線上にないノードは、取得した部分集合Axと部分集合Ayの間でローカルに虱潰しジョインを行う。
第7の実施の形態の情報処理システムによれば、第6の実施の形態と同様の効果が得られる。更に、第7の実施の形態では、対角線上のノードのデータ送信量が均等(または、ほぼ均等)になる。例えば、図35のノードn11,n22,n33のデータ送信量は、全て同じである。このため、ノード間でのデータ要素の複製が一層効率的となる。
[第8の実施の形態]
次に、第8の実施の形態を説明する。第3〜第7の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第8の実施の形態では、三角ジョインを、第5〜第7の実施の形態とは異なる方法で実行する。第8の実施の形態の情報処理システムは、図3,4,10に示した第3の実施の形態と同様のシステム構成で実現できる。
第8の実施の形態の三角ジョインでは、データ処理に用いるノードの集合を、図33に示した第7の実施の形態と同様の論理的な構成として扱う。ただし、第8の実施の形態では、データ集合Aが、データ処理に用いる複数のノードに、均等(または、ほぼ均等)かつノード間で重複がないように、分散して配置される。例えば、数式(13)に示すように、ノードnijに部分集合Aijが配置される。部分集合Aijのデータ要素数は、データ集合Aのデータ要素数をノード数N=h2=(2k+1)2で割ったものになる。
図37は、第8の実施の形態のジョインの手順例を示すフローチャートである。
(ステップS61)システム制御部112は、三角ジョインに使用できるノードの数に基づいて行数h=2k+1を決定し、ノード間の論理的な接続関係を決定する。
(ステップS62)システム制御部112は、クライアント31から入力されたデータ集合AをN=(2k+1)2個の部分集合に分割し、複数のノードに配置する。ただし、データ集合Aの配置は、ノード11がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合Aとして前のデータ処理の結果を利用する場合、データ集合Aの配置が完了していることもある。
(ステップS63)システム制御部112は、対角線上の各ノードを基準とした「近ノードリレー」と「遠ノードリレー」を実行するよう、各ノードに指示する。各ノードの実行部は、2種類のパスでデータ集合Aの部分集合をリレーする。なお、ここでは、対角線上のノードniiを基準として、右側の1個目からk個目までのノードni(i+1)〜ni(i+k)を近ノードと呼び、右側のk+1個目から2k個目までのノードni(i+k+1)〜ni(i+2k)を遠ノードと呼ぶ。前述の通り、論理的に正方形状に並べられた複数のノードは、トーラス状に接続されているものとして取り扱う。
近ノードリレーは、データ要素を、ノードn(i+2k)iからノードniiを通ってノードni(i+k)に至る直角パス(パス#1)に沿ってリレーするものである。遠ノードリレーは、データ要素を、ノードn(i+k)iからノードniiを通ってノードni(i+2k)に至る直角パス(パス#2)に沿ってリレーするものである。対角線上のノードniiに配置された部分集合Aiiは、データ要素数の差が高々1つになるように、均等(または、ほぼ均等)に二分割される。そして、分割した一方が近ノードリレーによりパス#1を通過するノードに複製され、分割した他方が遠ノードリレーによりパス#2を通過するノードに複製される。近ノードに配置された部分集合Ai(i+1)〜Ai(i+k)は、近ノードリレーによりパス#1を通過するノードに複製される。遠ノードに配置された部分集合Ai(i+k+1)〜Ai(i+2k)は、遠ノードリレーによりパス#2を通過するノードに複製される。
上記の対角ノード・近ノード・遠ノードの部分集合のリレーは、それぞれ、対角線上のノードの数h=2k+1に相当する回数行われる。この複製により、各ノードには、第7の実施の形態の複製方法を用いた場合と同じ数のデータ要素が収集されることになる。すなわち、第8の実施の形態の複製方法では、三角ジョインに用いるノードに均等にデータ集合Aを分散した状態から、行毎にデータ要素が対角線上のノードに集められ、第7の実施の形態と同様の複製結果になるようにデータ要素が複製されると言うこともできる。
(ステップS64)システム制御部112は、三角ジョインに用いるノードのうち対角線上のノードに、ローカルな三角ジョインの実行を指示する。対角線上のノードniiの実行部は、ノードniiを基点としたリレーによって収集した部分集合の中で、ローカルに三角ジョインを行い、結果を当該ノードのデータ記憶部に書き込む。また、システム制御部112は、対角線上にないノードに、ローカルな虱潰しジョインの実行を指示する。対角線上にないノードnijは、ノードniiを基点としたリレーによって収集した部分集合Axと、ノードnjjを基点としたリレーで取得した部分集合Ayとの間で、ローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS65)システム制御部112は、三角ジョインに用いるノード全てでステップS64のデータ処理が完了したことを確認すると、クライアント31に三角ジョインの完了を報告する。このとき、システム制御部112は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図38は、第8の実施の形態のデータ配置例を示す図(その1)である。この例では、k=1として、3×3=9個のノードn11,n12,…,n33を三角ジョインに用いる。また、データ集合Aに9個のデータ要素a1〜a9が含まれている。各ノードnijには、1個のデータ要素を含む部分集合Aijが配置される。
ノードn11に配置された部分集合A11は、近ノードリレーによりノードn12,n21,n31に複製される。この例では、部分集合A11のデータ要素数が1であるため、遠ノードリレーは行われない。ノードn12に配置された部分集合A12は、近ノードリレーによりノードn11,n21,n31に複製される。ノードn13に配置された部分集合A13は、遠ノードリレーによりノードn11,n12,n21に複製される。
ノードn22に配置された部分集合A22は、近ノードリレーによりノードn23,n32,n12に複製される。この例では、部分集合A22のデータ要素数が1であるため、遠ノードリレーは行われない。ノードn23に配置された部分集合A23は、近ノードリレーによりノードn22,n32,n12に複製される。ノードn21に配置された部分集合A21は、遠ノードリレーによりノードn22,n23,n32に複製される。
ノードn33に配置された部分集合A33は、近ノードリレーによりノードn31,n13,n23に複製される。この例では、部分集合A33のデータ要素数が1であるため、遠ノードリレーは行われない。ノードn31に配置された部分集合A31は、近ノードリレーによりノードn33,n13,n23に複製される。ノードn32に配置された部分集合A32は、遠ノードリレーによりノードn33,n31,n13に複製される。
図39は、第8の実施の形態のデータ配置例を示す図(その2)である。上記のデータ要素の複製を行うと、対角線上のノードniiは、i行目のノードni1〜nihに配置されたデータ要素の集合をもつ。一方、対角線上にないノードnijは、ノードniiを基点としたリレーによって収集された部分集合Axと、ノードnjjを基点としたリレーによって収集された部分集合Ayをもつ。第5〜第7の実施の形態と同様に、対角線上のノードniiは、取得した1つの部分集合の中でローカルに三角ジョインを行う。対角線上にないノードは、取得した2つの部分集合の間でローカルに虱潰しジョインを行う。
第8の実施の形態の情報処理システムによれば、第7の実施の形態と同様の効果が得られる。更に、第8の実施の形態では、対角線上のノードだけでなく対角線上にないノードにも、できる限り均等にデータ要素が配置される。このため、データ要素を複製する初期段階において対角線上のノード以外のノードが待ち状態になることを抑制でき、複数のノードを一層効率的に用いて、データ要素を複製できるようになる。
[第9の実施の形態]
次に、第9の実施の形態を説明する。第3〜第8の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第9の実施の形態では、複数の通信装置が階層的に接続されている大規模な情報処理システムを用いて、三角ジョインを実行する。第9の実施の形態の情報処理システムは、図4に示したハードウェア構成および図15,17に示した第4の実施の形態と同様のシステム構成によって実現できる。
図40は、第9の実施の形態のノード関係を示す図である。第9の実施の形態の三角ジョインでは、複数の仮想ノードを、論理的に直角三角形状に並べられたものとして扱う。縦方向および横方向には、それぞれ最大でH個の仮想ノードが並ぶ。i行目にはH−i+1個の仮想ノードが横方向に並び、j列目にはj個の仮想ノードが縦方向に並ぶ。行数Hは、データ処理に使用する仮想ノードの数に基づいて、情報処理システムが決定する。例えば、H2<=仮想ノード数を満たす最大の整数をHとし、三角ジョインにH2個の仮想ノードを使用する。なお、システムが有する仮想ノード総数や各仮想ノードのノード総数は、データ処理に使用できるノード数、通信装置との接続関係、処理すべきデータの量、システムに要求される応答時間などを考慮して、予め決定されている。
また、対角線上の各仮想ノード内では、データ処理に用いる複数のノードを、論理的に直角三角形状に並べられたものとして扱う。縦方向および横方向には、それぞれ最大でh個のノードが並ぶ。仮想ノード内のi行目にはh−i+1個のノードが横方向に並び、j列目にはj個のノードが縦方向に並ぶ。一方、対角線上にない各仮想ノード内では、複数のノードを、論理的に正方形状に並べられたものとして扱う。縦方向および横方向には、それぞれh個のノードが並ぶ。行数hは、全ての仮想ノードに共通に決定される。例えば、各仮想ノードのノード数をMとすると、h2<=Mを満たす最大の整数をhとし、仮想ノード毎にh2個のノードを使用する。
三角ジョインを開始する際、データ集合Aは、データ処理に用いる全ての仮想ノード11n,…,HHnの全てのノードn11,…,nhhに、均等(または、ほぼ均等)かつ重複なく分散される。ノード間でのデータ要素の複製は、第4の実施の形態と同様、まず異なる2以上のスイッチを介して仮想ノード間で行われ、その後、各仮想ノード内で閉じて行われる。仮想ノード間の通信は、「対応するノード」同士の通信として実現する。なお、図40には、1階層の仮想化の例を示したが、仮想ノードが別の仮想ノードを含むように多階層の仮想化を行うことも可能である。
図41は、第9の実施の形態のジョインの手順例を示すフローチャートである。
(ステップS71)システム制御部212は、三角ジョインに用いる仮想ノードの数に基づいて行数Hを決定し、仮想ノード間の論理的な接続関係を決定する。また、システム制御部212は、複数の仮想ノードに共通の行数hを決定する。
(ステップS72)システム制御部212は、クライアント31から入力されたデータ集合Aを、対角線上の仮想ノードの数分の部分集合に分割し、それら仮想ノードに分配する。各仮想ノードの仮想ノード制御部は、分配された部分集合を、当該仮想ノード内の対角線上のノードの数分の部分集合に更に分割し、それらノードに分配する。これにより、データ集合Aが複数のノードに分散配置される。ただし、データ集合Aの配置は、ノード21がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合Aとして前のデータ処理の結果を利用する場合、データ集合Aの配置が既に完了していることもある。
(ステップS73)システム制御部212は、対角線上の仮想ノード11n,22n,…,HHn内の代理ノードに、仮想ノード間でデータ要素を複製するよう指示する。各代理ノードの仮想ノード制御部は、対角線上のノードn11,n22,…,nhhに、データ要素を右方向および上方向の仮想ノードに複製するよう指示する。対角線上の各ノードの実行部は、右隣の仮想ノード内の自ノードに対応するノードに、データ要素を複製する(部分集合Ax)。また、対角線上の各ノードの実行部は、上側の隣接する仮想ノード内の自ノードに対応するノードに、データ要素を複製する(部分集合Ay)。
(ステップS74)システム制御部212は、対角線上の仮想ノード11n,22n,…,HHn内の代理ノードに、仮想ノード内でデータ要素を複製するよう指示する。各代理ノードの仮想ノード制御部は、対角線上のノードn11,n22,…,nhhに、データ要素を右方向および上方向に複製するよう指示する。各ノードの実行部は、対角線上のノードを始点に、データ要素を右方向および上方向にリレーする(部分集合Ax,Ay)。
(ステップS75)システム制御部212は、対角線上にない仮想ノード内の代理ノードに、データ要素を仮想ノード内で複製するよう指示する。各代理ノードの仮想ノード制御部は、対角線上のノードn11,n22,…,nhhに、左隣の仮想ノードから受信した部分集合Axを行方向に送信し、下側の隣接する仮想ノードから受信した部分集合Ayを列方向に送信するよう指示する。各ノードの実行部は、部分集合Axを行方向にリレーし、部分集合Ayを列方向にリレーする。なお、仮想ノードが入れ子になっており多階層に仮想化されている場合は、ステップS74,S75の処理が再帰的に実行される。その場合、再帰処理に関しては、システム制御部212が行った上記処理を、仮想ノード制御部が引き継ぐことで実現できる。ステップS72の処理についても同様である。
(ステップS76)システム制御部212は、対角線上の仮想ノード11n,22n,…,HHn内の代理ノードに、三角ジョインを指示する。当該代理ノードの仮想ノード制御部は、対角線上のノードn11,n22,…,nhhに三角ジョインの実行を指示し、対角線上にないノードに虱潰しジョインの実行を指示する。対角線上のノードの実行部は、自ノードがもつ部分集合の中でローカルに三角ジョインを行い、結果を当該ノードのデータ記憶部に書き込む。対角線上にないノードの実行部は、部分集合Ax,Ayの間でローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
また、システム制御部212は、対角線上にない仮想ノード内の代理ノードに、虱潰しジョインを指示する。当該代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに虱潰しジョインの実行を指示する。各ノードの実行部は、部分集合Ax,Ayの間でローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS77)システム制御部212は、三角ジョインに用いるノード全てでステップS76のデータ処理が完了したことを確認すると、クライアント31に三角ジョインの完了を報告する。このとき、システム制御部212は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図42は、第9の実施の形態のデータ配置例を示す図(その1)である。この例では、3個の仮想ノード11n,12n,22nを、三角ジョインに用いる。対角線上の仮想ノード11n,22nは3個のノードn11,n12,n22を含み、対角線上でない仮想ノード12nは4個のノードn11,n12,n21,n22を含む。また、データ集合Aには、4個のデータ要素a1〜a4が含まれている。対角線上の仮想ノード内の対角線上のノード11n11,11n22,22n11,22n22に、それぞれ1個のデータ要素が配置される。各仮想ノードを仮想的に1つのノードと見ると、仮想ノード11nには部分集合A1={a1,a2}が配置され、仮想ノード12nには部分集合A2={a3,a4}が配置されていると言える。
仮想ノード間の複製では、ノード11n11に配置されたデータ要素a1が、ノード11n11に対応するノード12n11に複製され、ノード11n22に配置されたデータ要素a2が、ノード11n22に対応するノード12n22に複製される。また、ノード22n11に配置されたデータ要素a3が、ノード22n11に対応するノード12n11に複製され、ノード22n22に配置されたデータ要素a4が、ノード22n22に対応するノード12n22に複製される。この時点では、対応関係にないノード間ではデータ要素は複製されない。
図43は、第9の実施の形態のデータ配置例を示す図(その2)である。この例では、ノード間の複製が完了した時点で、対角線上にない仮想ノード12nの対角線上のノード12n11,12n22に、それぞれ2個のデータ要素が収集されている。
対角線上の仮想ノード11n内では、ノード11n11がデータ要素a1をノード11n12に複製し、ノード11n22がデータ要素a2をノード11n12に複製する。同様に、対角線上の仮想ノード22n内では、ノード22n11がデータ要素a3をノード22n12に複製し、ノード22n22がデータ要素a4をノード22n12に複製する。
一方、対角線上にない仮想ノード12n内では、ノード12n11が行方向のリレーで受信したデータ要素a1をノード12n12に複製し、ノード12n22が行方向のリレーで受信したデータ要素a2をノード12n21に複製する。また、ノード12n11が列方向のリレーで受信したデータ要素a3をノード12n21に複製し、ノード12n22が列方向のリレーで受信したデータ要素a4をノード12n12に複製する。
図44は、第9の実施の形態のデータ配置例を示す図(その3)である。この例では、各仮想ノード内でのデータ要素の複製が完了すると、対角線上の仮想ノード内の対角線上のノード11n11,11n22,22n11,22n22はそれぞれ1個のデータ要素をもち、他のノードはそれぞれ2個のデータ要素をもっている。対角線上の仮想ノード内の対角線上の各ノードはローカルに三角ジョインを行い、他の各ノードはローカルに虱潰しジョインを行う。図44に示すように、データ集合Aから抽出される10通りの組み合わせが網羅されており、かつ、ノード間で重複して処理される組み合わせがない。
第9の実施の形態の情報処理システムによれば、第5の実施の形態と同様の効果が得られる。更に、第9の実施の形態では、通信遅延の比較的大きい仮想ノード間の通信を纏めて行い、その後、通信遅延の比較的小さい仮想ノード内の通信のみを行うため、ノード間の物理的な通信距離を考慮しない場合と比べて、意図しない待ち時間を抑制し得る。そのため、通信の並列化が容易となり、データ要素の複製を一層効率化できる。
[第10の実施の形態]
次に、第10の実施の形態を説明する。第3〜第9の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第10の実施の形態では、三角ジョインを、第9の実施の形態とは異なる方法で実行する。第10の実施の形態の情報処理システムは、第9の実施の形態と同様のシステム構成で実現できる。
図45は、第10の実施の形態のノード関係を示す図である。第10の実施の形態の三角ジョインでは、複数の仮想ノードを、論理的に正方形状に並べられたものとして扱う。縦方向および横方向には、それぞれH=2K+1個(Kは1以上の整数)の仮想ノードが並ぶ。行数Hは、データ処理に使用できる仮想ノードの数に基づいて、情報処理システムが決定する。行数Hの決定方法は、第9の実施の形態で説明した方法を用いることができる。ただし、第10の実施の形態では、行数Hは奇数であることに留意する。また、これら複数の仮想ノードを、論理的にトーラス状に接続されたものとして扱う。よって、仮想ノードiHnの右側に仮想ノードi1nが隣接し、仮想ノードHjnの下側に仮想ノード1jnが隣接しているものとして扱う。
また、各仮想ノード内では、複数のノードを、論理的に正方形状に並べられたものとして扱う。縦方向および横方向には、それぞれh=2k+1個の仮想ノードが並ぶ。行数hは、複数の仮想ノードに共通であり、各仮想ノードに含まれるノードの数に基づいて、情報処理システムが決定する。行数hの決定方法は、第9の実施の形態で説明した方法を用いることができる。ただし、第10の実施の形態では、行数hは奇数であることに留意する。また、これら複数のノードを、各仮想ノード内で論理的にトーラス状に接続されたものとして扱う。データ集合Aは、データ処理に用いる全ての仮想ノード11n,…,HHnに含まれる全てのノードn11,…,nhhに、均等(または、ほぼ均等)かつ重複なく分散される。ノード間でのデータ要素の複製は、まず異なる仮想ノード間で行われ、その後、各仮想ノード内で閉じて行われる。
図46は、第10の実施の形態のジョインの手順例を示すフローチャートである。
(ステップS81)システム制御部212は、三角ジョインに使用可能な仮想ノードの数に基づいて行数Hを決定し、仮想ノード間の論理的な接続関係を決定する。また、システム制御部212は、複数の仮想ノードに共通の行数hを決定する。
(ステップS82)システム制御部212は、クライアント31から入力されたデータ集合Aを、三角ジョインに用いる仮想ノードの数分の部分集合に分割し、それら仮想ノードに分配する。各仮想ノードの仮想ノード制御部は、分配された部分集合を、当該仮想ノードのノード数分の部分集合に更に分割し、それらノードに分配する。これにより、データ集合Aが複数のノードに分散配置される。ただし、データ集合Aの配置は、ノード21がデータ処理開始のコマンドを受け付ける前に、クライアント31からの指示に従って行っておいてもよい。また、データ集合Aとして前のデータ処理の結果を利用する場合には、データ集合Aの配置が既に完了していることもある。
(ステップS83)システム制御部212は、各仮想ノードの代理ノードに、対角線上の各仮想ノードを基準とした「近ノードリレー」と「遠ノードリレー」を、仮想ノード間で実行するよう指示する。各代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに、上記の2種類のリレーを指示する。各ノードの実行部は、他の仮想ノード内の対応するノードとの間で、データ集合Aの部分集合をリレーする。
仮想ノード間の近ノードリレーは、データ要素を、仮想ノード(i+2k)inから仮想ノードiinを通って仮想ノードi(i+k)nに至る直角パス(パス#1)に沿ってリレーするものである。仮想ノード間の遠ノードリレーは、データ要素を、仮想ノード(i+k)inから仮想ノードiinを通って仮想ノードi(i+2k)nに至る直角パス(パス#2)に沿ってリレーするものである。対角線上の仮想ノードiinに配置された部分集合は、データ要素数の差が高々1つになるように、均等(または、ほぼ均等)に二分割される。そして、分割した一方が近ノードリレーによりパス#1を通過する仮想ノードに複製され、分割した他方が遠ノードリレーによりパス#2を通過する仮想ノードに複製される。仮想ノードi(i+1)n〜i(i+k)nに配置された部分集合は、近ノードリレーによりパス#1を通過する仮想ノードに複製される。仮想ノードi(i+k+1)n〜i(i+2k)nに配置された部分集合は、遠ノードリレーによりパス#2を通過する仮想ノードに複製される。
(ステップS84)システム制御部212は、対角線上の仮想ノード11n,22n,…,HHn内の代理ノードに、仮想ノード内でデータ要素を複製するよう指示する。各代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに、対角線上の各ノードを基準とした「近ノードリレー」と「遠ノードリレー」を実行するよう指示する。各ノードの実行部は、自ノードに配置されたデータ要素と他の仮想ノードから受信したデータ要素とを、第8の実施の形態と同様の方法で、仮想ノード内で複製する。
(ステップS85)システム制御部212は、対角線上にない仮想ノード内の代理ノードに、仮想ノード内でデータ要素を複製するよう指示する。各代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに、行方向および列方向のリレーを指示する。各ノードの実行部は、1つの仮想ノードを基点とした仮想ノード間のリレーにより取得した部分集合Axを行方向にリレーし、他の仮想ノードを基点とした仮想ノード間のリレーにより取得した部分集合Ayを列方向にリレーする。すなわち、仮想ノード内で、虱潰しジョインと同様の方法によりデータ要素が複製される。なお、仮想ノードが入れ子になっており多階層に仮想化されている場合は、ステップS84,S85の処理が再帰的に実行される。その場合、再帰処理に関しては、システム制御部212が行った上記処理を、各仮想ノードの仮想ノード制御部が引き継ぐことで実現できる。ステップS82の処理も同様である。
(ステップS86)システム制御部212は、対角線上の仮想ノード11n,22n,…,HHn内の代理ノードに、三角ジョインを指示する。当該代理ノードの仮想ノード制御部は、対角線上のノードn11,n22,…,nhhに三角ジョインの実行を指示し、対角線上にないノードに虱潰しジョインの実行を指示する。対角線上のノードの実行部は、自ノードがもつ部分集合の中でローカルに三角ジョインを行い、結果を当該ノードのデータ記憶部に書き込む。対角線上にないノードの実行部は、1つのノードを基点としたリレーにより取得した部分集合Axと他のノードを基点としたリレーにより取得した部分集合Ayの間でローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
また、システム制御部212は、対角線上にない仮想ノード内の代理ノードに、虱潰しジョインを指示する。当該代理ノードの仮想ノード制御部は、仮想ノード内の各ノードに虱潰しジョインの実行を指示する。各ノードの実行部は、行方向のリレーにより取得した部分集合Axと列方向のリレーにより取得した部分集合Ayの間でローカルに虱潰しジョインを行い、結果を当該ノードのデータ記憶部に書き込む。
(ステップS87)システム制御部212は、三角ジョインに用いるノード全てでステップS86のデータ処理が完了したことを確認すると、クライアント31に三角ジョインの完了を報告する。このとき、システム制御部212は、各ノードのデータ記憶部から結果を収集してクライアント31に送信してもよいし、結果を収集せずに各ノードのデータ記憶部に格納されたままにしてもよい。
図47は、第10の実施の形態のデータ配置例を示す図(その1)である。この例では、9個の仮想ノード11n,12n,…,33nが三角ジョインに用いられ、論理的に1辺に3個の仮想ノードが並べられる。データ集合Aは、9個の仮想ノードに分散して配置される。各仮想ノードを仮想的に1つのノードと見ると、データ集合Aが9個の部分集合A1〜A9に分割されて仮想ノード11n,12n,…,33nに配置されると言える。
図48は、第10の実施の形態のデータ配置例を示す図(その2)である。各仮想ノードを仮想的に1つのノードと見ると、第8の実施の形態と同様のリレー方法によって、仮想ノード間でデータ要素が複製される。ただし、仮想ノード間のデータ要素の複製は、前述の通り、対応するノード間のデータ要素の複製として実現する。
仮想ノード11nに配置された部分集合A1は二分割され、一方が近ノードリレーにより仮想ノード12n,21n,31nに複製され、他方が遠ノードリレーにより仮想ノード12n,13n,21nに複製される。仮想ノード12nに配置された部分集合A2は、近ノードリレーにより仮想ノード11n,21n,31nに複製される。仮想ノード13nに配置された部分集合A3は、遠ノードリレーにより仮想ノード11n,12n,21nに複製される。
仮想ノード22nに配置された部分集合A5は二分割され、一方が近ノードリレーにより仮想ノード23n,32n,12nに複製され、他方が遠ノードリレーにより仮想ノード23n,21n,32nに複製される。仮想ノード23nに配置された部分集合A6は、近ノードリレーにより仮想ノード22n,32n,12nに複製される。仮想ノード21nに配置された部分集合A4は、遠ノードリレーにより仮想ノード22n,23n,32nに複製される。
仮想ノード33nに配置された部分集合A9は二分割され、一方が近ノードリレーにより仮想ノード31n,13n,23nに複製され、他方が遠ノードリレーにより仮想ノード31n,32n,13nに複製される。仮想ノード31nに配置された部分集合A7は、近ノードリレーにより仮想ノード33n,13n,23nに複製される。仮想ノード32nに配置された部分集合A8は、遠ノードリレーにより仮想ノード33n,31n,13nに複製される。
図49は、第10の実施の形態のデータ配置例を示す図(その3)である。この例では、9個の仮想ノード11n,12n,…,33nは、それぞれ9個のノードn11,n12,…,n33を含む。また、データ集合Aには81個のデータ要素a1〜a81が含まれている。よって、各ノードには、均等に1個のデータ要素が配置される。例えば、ノード11n11にデータ要素a1が配置され、ノード33n33にデータ要素a81が配置される。
データ要素が配置されると、対角線上の仮想ノード11n,22n,33nそれぞれを基点として、「近ノードリレー」と「遠ノードリレー」が、異なる仮想ノードの対応するノード間で行われる。例えば、ノード11n11に配置されたデータ要素a1が、近ノードリレーによりノード12n11,21n11,31n11に複製される。データ要素数が1であるため、遠ノードリレーは行われない。ノード12n11に配置されたデータ要素a4が、近ノードリレーによりノード11n11,21n11,31n11に複製される。ノード13n11に配置されたデータ要素a7が、遠ノードリレーによりノード11n11,12n11,21n11に複製される。
図50は、第10の実施の形態のデータ配置例を示す図(その4)である。図49のように配置されたデータ要素が仮想ノード間で複製されると、各ノードには、図50に示すようにデータ要素が収集される。なお、図50では、データ要素を識別するための添え字としての数字のみ記載している。例えば、ノード11n11にはデータ要素a1,a4,a7が収集される。ノード12n11にはデータ要素a1,a4,a7(部分集合Ax)とデータ要素a31,a34(部分集合Ay)が収集される。ノード13n11にはデータ要素a7(部分集合Ax)とデータ要素a55,a58,a61(部分集合Ay)が収集される。仮想ノード間のデータ要素の複製が完了すると、各仮想ノード内でデータ要素が複製される。
対角線上の仮想ノード11n,22n,33nでは、第8の実施の形態の三角ジョインと同様の方法で、データ要素が複製される。例えば、ノード11n11に収集されたデータ要素a1,a4,a7のうちデータ要素a1,a4が近ノードリレーによりノード11n12,11n21,11n31に複製され、データ要素a7が遠ノードリレーによりノード11n12,11n13,11n21に複製され。ノード11n12のデータ要素a2,a5,a8が、近ノードリレーによりノード11n11,11n21,11n31に複製される。ノード11n13のデータ要素a3,a6,a9が、遠ノードリレーによりノード11n11,11n12,11n21に複製される。
また、対角線上にない仮想ノードでは、第3の実施の形態の虱潰しジョインと同様の方法で、行方向および列方向にデータ要素が複製される。例えば、ノード12n11に収集されたデータ要素a1,a4,a7(部分集合Ax)が、行方向のリレーによりノード12n12,12n13に複製される。また、ノード12n11に収集されたデータ要素a31,a34(部分集合Ay)が、列方向のリレーによりノード12n21,12n31に複製される。
図51は、第10の実施の形態のデータ配置例を示す図(その5)である。上記のデータ要素の複製の結果、各ノードには、図51に示すようにデータ要素が収集される。例えば、ノード11n11にはデータ要素a1〜a9が収集される。ノード11n12にはデータ要素a1〜a9(部分集合Ax)とデータ要素a11,a12,a14,a15,a18(部分集合Ay)が収集される。ノード12n11にはデータ要素a1〜a9(部分集合Ax)とデータ要素a31,a34,a40,a43,a49,a52(部分集合Ay)が収集される。
対角線上の仮想ノード11n,22n,33n内の対角線上のノードn11,n22,n33は、自ノードに収集された部分集合の中でローカルに三角ジョインを行う。一方、他のノードは、自ノードに収集された部分集合Ax,Ayの間でローカルに虱潰しジョインを行う。例えば、ノード11n11は、データ要素a1〜a9から抽出される45通りの組み合わせに対してmap関数を適用する。ノード11n12は、データ要素a1〜a9から1つ選択し、データ要素a11,a12,a14,a15,a18から1つ選択することで、9個×5個=45通りの順序対に対してmap関数を適用する。ノード12n11は、データ要素a1〜a9から1つ選択し、データ要素a31,a34,a40,a43,a49,a52から1つ選択することで、9個×6個=54通りの順序対に対してmap関数を適用する。
このように、第10の実施の形態では、仮想ノード間では三角ジョインのデータ複製が行われる。対角線上の仮想ノード内では三角ジョインのデータ複製が再帰的に行われ、対角線上にない仮想ノード内では虱潰しジョインのデータ複製が行われる。そして、対角線上の仮想ノード内の対角線上のノード(仮想化なしと仮定した場合の対角線上のノード)ではローカルに三角ジョインが行われ、他のノードではローカルに虱潰しジョインが行われる。図51の例では、データ集合Aから抽出される3321通りの組み合わせが81個のノードによって網羅され、かつ、ノード間で重複して処理される組み合わせがない。
第10の実施の形態の情報処理システムによれば、第9の実施の形態と同様に、複数の異なるスイッチの配下にある複数のノードを三角ジョインに使用する場合でも、通信の並列化が容易となりデータ要素の複製を効率化できる。また、第8の実施の形態と同様に、三角ジョインに用いる複数のノードにできる限り均等にデータ要素を配置でき、データ要素を複製する初期段階においても複数のノードを効率的に用いることができる。