(57)【特許請求の範囲】
【請求項１】
プロセッサを有する情報処理装置を複数含み、２以上の情報処理装置を用いて入力データに対して第１の処理を行い、第１の処理の結果に対して第１の演算処理を行うシステムで実行されるデータ処理方法であって、
第１の情報処理装置が、第１の入力データの集合が指定されると、過去に処理した入力データの集合に対応する第１の演算処理の結果を記憶する記憶装置から、前記第１の入力データの集合と重複する第２の入力データの集合に対応する第１の演算処理の結果を検索し、
前記第１の情報処理装置または第２の情報処理装置が、前記第２の入力データの集合に含まれ前記第１の入力データの集合に含まれない差分の入力データに対応する第１の処理の結果を取得し、
前記第１の情報処理装置または前記第２の情報処理装置が、前記差分の入力データに対応する第１の処理の結果を用いて、前記第２の入力データの集合に対応する第１の演算処理の結果から前記差分の入力データの影響を除去する第２の演算処理を実行することで、前記第１の入力データの集合に対応する第１の演算処理の結果を生成する、
データ処理方法。
【請求項２】
前記第１の情報処理装置または前記第２の情報処理装置は、
前記第１の入力データの集合に含まれ前記第２の入力データの集合に含まれない他の差分の入力データに対応する第１の処理の結果を取得し、
前記第２の入力データの集合に対応する第１の演算処理の結果に対する第２の演算処理の結果に、前記他の差分の入力データに対応する第１の処理の結果を合成することで、前記第１の入力データの集合に対応する第１の演算処理の結果を生成する、
請求項１記載のデータ処理方法。
【請求項３】
前記第１の情報処理装置は、前記第１の入力データの集合と重複する過去に処理した入力データの集合が複数あるとき、複数の入力データの集合に対応する複数の第１の演算処理の結果の中から、前記第１の入力データの集合との重複範囲が大きい入力データの集合に対応する第１の演算処理の結果を選択する、請求項１または２記載のデータ処理方法。
【請求項４】
前記第１の情報処理装置または前記第２の情報処理装置は、
前記差分の入力データに対応する第１の処理の結果を前記第２の入力データの集合に対応する第１の演算処理の結果に適用することで前記第１の入力データの集合に対応する第１の演算処理の結果を生成する第１の生成方法の計算量と、前記第１の入力データの集合の全体に対して第１の処理および第１の演算処理を行う第２の生成方法の計算量と、を予測し、
前記第１の生成方法の計算量が前記第２の生成方法の計算量よりも小さいときに、前記第１の生成方法に従って前記第１の入力データの集合に対応する第１の演算処理の結果を生成する、
請求項１乃至３の何れか一項に記載のデータ処理方法。
【請求項５】
前記第１の情報処理装置または前記第２の情報処理装置は、
前記差分の入力データの影響を除去する際に、前記第２の入力データの集合に対応する第１の演算処理の結果の値から前記差分の入力データに対応する第１の処理の結果の値を減算する、または、前記第２の入力データの集合に対応する第１の演算処理の結果に含まれる複数のデータ要素から前記差分の入力データに対応する第１の処理の結果に含まれるデータ要素を削除する、請求項１乃至４の何れか一項に記載のデータ処理方法。
【請求項６】
複数のノードを用いて入力データに対して第１の処理を行い、第１の処理の結果に対して第１の演算処理を行う分散処理システムであって、
過去に処理した入力データの集合に対応する第１の演算処理の結果を記憶する記憶装置と、
第１の入力データの集合が指定されると、前記記憶装置から前記第１の入力データの集合と重複する第２の入力データの集合に対応する第１の演算処理の結果を検索する検索手段と、
前記第２の入力データの集合に含まれ前記第１の入力データの集合に含まれない差分の入力データに対応する第１の処理の結果を取得し、前記差分の入力データに対応する第１の処理の結果を用いて、前記第２の入力データの集合に対応する第１の演算処理の結果から前記差分の入力データの影響を除去する第２の演算処理を実行することで、前記第１の入力データの集合に対応する第１の演算処理の結果を生成するデータ処理手段と、
を有する分散処理システム。
【請求項７】
入力データに対して複数のノードを用いて行われた第１の処理の結果に対して第１の演算処理を行うためのプログラムであって、コンピュータに、
第１の入力データの集合が指定されると、過去に処理した入力データの集合に対応する第１の演算処理の結果を記憶する記憶装置から、前記第１の入力データの集合と重複する第２の入力データの集合に対応する第１の演算処理の結果を取得し、
前記第２の入力データの集合に含まれ前記第１の入力データの集合に含まれない差分の入力データに対応する第１の処理の結果を取得し、
前記差分の入力データに対応する第１の処理の結果を用いて、前記第２の入力データの集合に対応する第１の演算処理の結果から前記差分の入力データの影響を除去する第２の演算処理を実行することで、前記第１の入力データの集合に対応する第１の演算処理の結果を生成する、
処理を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はデータ処理方法、分散処理システムおよびプログラムに関する。
【背景技術】
【０００２】
ネットワークに接続された複数のノード（例えば、コンピュータなどの情報処理装置）を備えた分散処理システムを用いてデータ処理を行うことがある。データを分割して複数のノードに割り当て、複数のノードを並列に用いることで、データ処理を高速化し得る。このようなデータ処理の並列化は、例えば、サーバ装置に対するアクセスを示すアクセスログの解析など、大量のデータを処理する際に行われる。
【０００３】
並列データ処理を行うプログラムの作成を支援するために、ＭａｐＲｅｄｕｃｅなどのフレームワークが提案されている。ＭａｐＲｅｄｕｃｅで定義されるデータ処理方法は、ＭａｐフェーズとＲｅｄｕｃｅフェーズを含む。Ｍａｐフェーズでは、入力されたデータを分割し、複数のノードを用いてデータを処理する。Ｒｅｄｕｃｅフェーズでは、Ｍａｐフェーズの結果を、キーなどに応じて１またはそれ以上のノードを用いて集約する。Ｒｅｄｕｃｅフェーズの結果を次のＭａｐフェーズに渡すこともできる。データの分割や集約は、フレームワークに自動的に実行させることもできる。
【０００４】
ところで、データ処理を更に高速化するため、過去の処理結果を再利用することが考えられている。例えば、データを更新頻度に基づき複数のグループに分類し、各グループについてデータの更新頻度を算出し、更新頻度が低いグループに属するデータのＲｅｄｕｃｅ結果をキャッシュして、Ｒｅｄｕｃｅ結果を再利用できるようにする提案がある。
【０００５】
また、文書管理システムにおいて、入力された検索条件が以前の検索と同じであれば、以前の検索時の時刻よりも登録／更新時刻が新しい文書のみを検索対象とし、今回検索時の検索結果に前回検索時の検索結果を付け加える提案がある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１０−９２２２２号公報
【特許文献２】特開２００２−２５９４４３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
入力データの集合に対して複数のノードを用いて第１段階の処理を行い、第２段階の処理において第１段階の処理結果を集計する分散処理システムが考えられる。この分散処理システムでは、ある入力データの集合に対してデータ処理を行う場合、当該入力データの集合と重複部分がある他の入力データの集合に対して過去にデータ処理を行っていた場合は、当該過去のデータ処理の結果を再利用できることが好ましい。
【０００８】
しかし、今回の入力データの集合と過去の入力データの集合の間にずれがあると、過去のデータ処理の結果の再利用が難しい場合があるという問題がある。
一側面では、本発明は、過去の処理結果の再利用可能性を高めたデータ処理方法、分散処理システムおよびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
一側面では、プロセッサを有する情報処理装置を複数含み、２以上の情報処理装置を用いて入力データに対して第１の処理を行い、第１の処理の結果に対して第１の演算処理を行うシステムで実行されるデータ処理方法が提供される。データ処理方法では、第１の情報処理装置が、第１の入力データの集合が指定されると、過去に処理した入力データの集合に対応する第１の演算処理の結果を記憶する記憶装置から、第１の入力データの集合と重複する第２の入力データの集合に対応する第１の演算処理の結果を検索する。第１の情報処理装置または第２の情報処理装置が、第２の入力データの集合に含まれ第１の入力データの集合に含まれない差分の入力データに対応する第１の処理の結果を取得する。第１の情報処理装置または第２の情報処理装置が、差分の入力データに対応する第１の処理の結果を用いて、第２の入力データの集合に対応する第１の演算処理の結果から差分の入力データの影響を除去する第２の演算処理を実行することで、第１の入力データの集合に対応する第１の演算処理の結果を生成する。
【００１１】
また、一側面では、複数のノードを用いて入力データに対して第１の処理を行い、第１の処理の結果に対して第１の演算処理を行う分散処理システムが提供される。分散処理システムは、記憶装置、検索手段およびデータ処理手段を有する。記憶装置は、過去に処理した入力データの集合に対応する第１の演算処理の結果を記憶する。検索手段は、第１の入力データの集合が指定されると、記憶装置から第１の入力データの集合と重複する第２の入力データの集合に対応する第１の演算処理の結果を検索する。データ処理手段は、第２の入力データの集合に含まれ第１の入力データの集合に含まれない差分の入力データに対応する第１の処理の結果を取得し、差分の入力データに対応する第１の処理の結果を用いて、第２の入力データの集合に対応する第１の演算処理の結果から差分の入力データの影響を除去する第２の演算処理を実行することで、第１の入力データの集合に対応する第１の演算処理の結果を生成する。
【００１２】
また、一側面では、コンピュータが実行するプログラムであって、入力データに対して複数のノードを用いて行われた第１の処理の結果に対して第１の演算処理を行うためのプログラムが提供される。
【発明の効果】
【００１３】
一側面によれば、過去の処理結果の再利用可能性を高めることができる。
【図面の簡単な説明】
【００１４】
【図１】第１の実施の形態の分散処理システムを示す図である。
【図２】第２の実施の形態の分散処理システムを示す図である。
【図３】第２の実施の形態の実行制御サーバのハードウェア例を示す図である。
【図４】第２の実施の形態のソフトウェア例を示す図である。
【図５】第２の実施の形態のＭａｐＲｅｄｕｃｅの例を示す図である。
【図６】第２の実施の形態のログデータの例を示す図である。
【図７】第２の実施の形態のログデータの処理例を示す図である。
【図８】第２の実施の形態のＲｅｄｕｃｅ結果テーブルの例を示す図である。
【図９】第２の実施の形態の分散処理の例を示すシーケンス図である。
【図１０】第２の実施の形態の分析処理の例を示すフローチャートである。
【図１１】第２の実施の形態の分析処理の結果の例を示す図である。
【図１２】第２の実施の形態の分散処理制御の例を示すフローチャートである。
【図１３】第２の実施の形態の分散処理の例を示す図である。
【図１４】第２の実施の形態のワードカウントのコード例を示す図である。
【図１５】第２の実施の形態のＭａｐ結果テーブルの例を示す図である。
【図１６】第３の実施の形態のＭａｐＲｅｄｕｃｅの例を示す図である。
【図１７】第３の実施の形態の評価値テーブルの例を示す図である。
【図１８】第３の実施の形態の第１のＭａｐの入出力例である。
【図１９】第３の実施の形態の第１のｓｈｕｆｆｌｅ＆ｓｏｒｔの入出力例である。
【図２０】第３の実施の形態の第１のＲｅｄｕｃｅの入出力例である。
【図２１】第３の実施の形態の第２のＭａｐの入出力例である。
【図２２】第３の実施の形態の第２のｓｈｕｆｆｌｅ＆ｓｏｒｔの入出力例である。
【図２３】第３の実施の形態の第２のＲｅｄｕｃｅの入出力例である。
【図２４】第３の実施の形態のＲｅｄｕｃｅ結果テーブルの例を示す図である。
【図２５】第３の実施の形態の分析処理の結果の例を示す図である。
【図２６】第３の実施の形態の分散処理の例を示す図である。
【図２７】第３の実施の形態の分散処理の例（続き）を示す図である。
【図２８】第３の実施の形態の逆Ｒｅｄｕｃｅのコード例を示す図である。
【図２９】第３の実施の形態のＲｅｄｕｃｅのコード例を示す図である。
【図３０】第４の実施の形態の分散処理の例を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の分散処理システムを示す図である。第１の実施の形態の分散処理システムは、入力データに対して複数のノードを用いて行われた第１の処理の結果に対して第２の処理を行うシステムである。第１の実施の形態の分散処理システムは、記憶装置１、情報処理装置２，３およびノード４，４ａを含む。記憶装置１、情報処理装置２，３およびノード４，４ａは、ネットワークで接続されている。ノード４，４ａは、データ処理を行うノードである。
【００１６】
ここで、第１の処理を行う際、例えば、入力データの集合が複数に分割されてノード４，４ａに入力される。本例では、ノード４，４ａが２つであるので、２つに分割される。ただし、ノードの数は３以上でもよい。第１の処理の結果は、入力データの集合の分割単位でノード４，４ａで生成される。すなわち、第１の処理の結果はノード４，４ａで生成された結果の集合である。第２の処理は、例えば当該結果の集合を集約する処理である。
【００１７】
情報処理装置２，３およびノード４，４ａは、ＣＰＵ（Central Processing Unit）などのプロセッサとＲＡＭ（Random Access Memory）などのメモリとを備えてもよく、メモリに記憶されたプログラムをプロセッサが実行するコンピュータであってもよい。
【００１８】
記憶装置１は、過去に行った入力データの集合に対応する第２の処理の結果を記憶する。
情報処理装置２は、検索手段２ａを有する。検索手段２ａは、第１の入力データの集合Ｄ１が指定されると、記憶装置１から第１の入力データの集合Ｄ１と重複する第２の入力データＤ２の集合に対応する第２の処理の結果Ｒ２を検索する。
【００１９】
情報処理装置３は、データ処理手段３ａを有する。データ処理手段３ａは、第２の入力データの集合Ｄ２に含まれ第１の入力データの集合Ｄ１に含まれない差分の入力データＤ２ａに対応する第１の処理の結果Ｒ２ａを取得する。データ処理手段３ａは、取得した第１の処理の結果Ｒ２ａを用いて、検索した第２の処理の結果Ｒ２から差分の入力データＤ２ａの影響を除去することで、第１の入力データの集合Ｄ１に対応する第２の処理の結果Ｒ１を生成する。
【００２０】
ノード４，４ａは、入力データの集合に対して第１の処理を実行し、第１の処理の結果を生成する。
なお、検索手段２ａとデータ処理手段３ａとを同一の情報処理装置上に設けてもよい。また、データ処理手段３ａの処理をノード４，４ａが実行してもよい。
【００２１】
第１の実施の形態の分散処理システムによれば、検索手段２ａにより、第１の入力データの集合Ｄ１が指定されると、記憶装置１から第１の入力データの集合Ｄ１と重複する第２の入力データの集合Ｄ２に対応する第２の処理の結果Ｒ２が検索される。データ処理手段３ａにより、第２の入力データの集合Ｄ２に含まれ第１の入力データの集合Ｄ１に含まれない差分の入力データＤ２ａに対応する第１の処理の結果Ｒ２ａが取得され、当該第１の処理の結果Ｒ２ａを用いて、検索された第２の処理の結果Ｒ２から差分の入力データＤ２ａの影響を除去することで、第１の入力データの集合Ｄ１に対応する第２の処理の結果Ｒ１が生成される。
【００２２】
これにより、過去の処理結果の再利用可能性を高めることができる。例えば、分散処理システムにより、入力データの集合に対して複数のノードを用いて第１段階の処理を行い、第２段階の処理において第１段階の処理結果を集計することがある。当該分散処理システムにおいて、第２段階の処理結果を保存して再利用することが考えられる。しかし、第２段階の処理結果が集計結果であると、事後的に当該処理結果を入力データの範囲と対応するように分割できるとは限らない。このため、今回の入力データの集合と過去の入力データの集合の間にずれがあると、そのままでは再利用が難しい場合が生じ得る。
【００２３】
そこで、第１の実施の形態の分散処理システムでは、過去の入力データの集合に含まれるが今回の入力データの集合には含まれない差分の入力データの第１の処理の結果を取得する。そして、当該差分の入力データの第１の処理の結果を用いて、過去の入力データの集合に対応する第２の処理の結果から当該差分の入力データの影響を除去する。これにより、過去の入力データの集合に対応する第２の処理の結果の再利用可能性を高められる。
【００２４】
なお、今回の入力データの集合に含まれるが過去の入力データの集合には含まれない他の差分の入力データが存在する場合もある。上記の例で言えば、第１の入力データの集合Ｄ１に含まれるが第２の入力データの集合Ｄ２には含まれない他の差分の入力データＤ１ａである。この場合、他の差分の入力データＤ１ａについて第１の処理の結果Ｒ１ａを取得すればよい。
【００２５】
すなわち、第２の処理の結果Ｒ２から差分の入力データＤ２ａの影響を除去すると、第２の入力データの集合Ｄ２のうち第１の入力データの集合Ｄ１に重複する部分の入力データＤ２ｂに対応する第２の処理の結果Ｒ２ｂが得られる。当該重複する部分の入力データＤ２ｂは、第１の入力データの集合Ｄ１のうち第２の入力データの集合Ｄ２に重複する部分の入力データＤ１ｂに等しい。このため、第２の処理の結果Ｒ２ｂは、重複する部分の入力データＤ１ｂに対応する第２の処理の結果に等しい。よって、第２の処理の結果Ｒ２ｂに第２の処理の結果Ｒ１ａを合成すれば、第１の入力データの集合Ｄ１に対応する第２の処理の結果Ｒ１を得られる。
【００２６】
このように、過去の入力データの集合に対応する第２の処理の結果の再利用性を高めることで、今回の入力データの集合に対応する第２の処理の結果を生成する処理を効率的に行えるようになる。
【００２７】
更に、第１の入力データの集合Ｄ１と重複する複数の第２の入力データの集合Ｄ２，Ｄ３に対応する第２の処理の結果Ｒ２，Ｒ３が検索される場合もある。その場合には、入力データの集合間で重複する範囲が最も大きい第２の処理の結果を選択するようにしてもよい。重複する範囲がより大きい程、過去の結果を利用できる範囲も大きくなる。このため、今回の入力データに対する処理範囲を小さくでき、データ処理をより効率的に行えるからである。
【００２８】
［第２の実施の形態］
図２は、第２の実施の形態の分散処理システムを示す図である。第２の実施の形態の分散処理システムは、入力されたログデータに含まれる文字列（文字を含む）をカウントする処理（以下、ワードカウントと呼ぶことがある）を複数のノードに分散処理させる。第２の実施の形態の分散処理システムでは、分散処理にＭａｐＲｅｄｕｃｅを用いるものとする。ＭａｐＲｅｄｕｃｅを利用するためのフレームワークとして、例えば、Ｈａｄｏｏｐが知られている。
【００２９】
第２の実施の形態の分散処理システムは、ＥＣ（Electronic Commerce）サーバ２０、クライアント３０、実行制御サーバ１００、分析サーバ２００、処理組立サーバ３００、結果登録サーバ４００、入力情報管理サーバ５００、結果情報管理サーバ６００およびデータ処理サーバ７００，７００ａ，・・・を含む。各サーバは、ネットワーク１０に接続されている。ネットワーク１０は、例えばＬＡＮ（Local Area Network）である。また、ネットワーク１０は、インターネット（図示を省略）に接続されている。
【００３０】
ＥＣサーバ２０は、電子商取引による商品販売サービスを提供するサーバコンピュータである。ＥＣサーバ２０は、顧客による商品の購入を受け付ける。ＥＣサーバ２０は、顧客が購入した商品の内容を示すログを入力情報管理サーバ５００に格納する。
【００３１】
クライアント３０は、分散処理システムを管理する管理者が操作するクライアントコンピュータである。クライアント３０は、管理者による所定の操作入力を受け付けると、入力情報管理サーバ５００に格納されたログデータの集計を実行制御サーバ１００に依頼する。当該処理依頼には、集計を行う期間（時間範囲）を示す情報やカウントしたい商品を示す文字列の情報が含まれる。管理者は、クライアント３０を操作して、当該期間や文字列を入力できる。
【００３２】
実行制御サーバ１００は、分散処理システム全体を制御するサーバコンピュータである。実行制御サーバ１００は、クライアント３０からの指示に応じて、他のサーバと連携し、分散処理の実行を制御する。具体的には、実行制御サーバ１００は、指定された期間のログデータの分析を分析サーバ２００に依頼する。実行制御サーバ１００は、分析サーバ２００から分析結果を得ると、ワードカウントに係るＭａｐＲｅｄｕｃｅの組立を処理組立サーバ３００に依頼する。当該組立依頼は、分析結果の情報を含む。実行制御サーバ１００は、処理組立サーバ３００によるＭａｐＲｅｄｕｃｅの組立結果に基づいて、データ処理サーバ７００，７００ａ，・・・を制御し、指定された文字列につき、ワードカウントを実行させる。例えば、実行制御サーバ１００は、データ処理サーバ７００，７００ａ，・・・のうち、アイドル（idle）状態のサーバにＭａｐ処理またはＲｅｄｕｃｅ処理を割り当てる。実行制御サーバ１００のような制御を行うノードをマスター（master）と呼ぶことがある。
【００３３】
分析サーバ２００は、ログデータの分析処理を実行するサーバコンピュータである。分析サーバ２００は、実行制御サーバ１００からログデータの分析依頼を受け付けると、入力情報管理サーバ５００に格納されたログデータを参照して、指定された期間のログを分析する。具体的には、分析サーバ２００は、結果情報管理サーバ６００に格納された過去の処理結果と今回指定された期間との対比を行い、過去の処理結果のうち今回のＭａｐＲｅｄｕｃｅの結果として利用可能なものがあるかを検索する。分析サーバ２００は、分析結果を実行制御サーバ１００に応答する。
【００３４】
処理組立サーバ３００は、ＭａｐＲｅｄｕｃｅの組立処理を実行するサーバコンピュータである。処理組立サーバ３００は、実行制御サーバ１００からＭａｐＲｅｄｕｃｅの組立依頼および分析サーバ２００による分析結果を受け付けると、組立処理を実行する。具体的には、過去の処理結果のうち今回のＭａｐＲｅｄｕｃｅの結果として利用可能なものがある場合、当該過去の処理結果を利用したＭａｐＲｅｄｕｃｅの組立を行う。過去の処理結果のうち今回のＭａｐＲｅｄｕｃｅの結果として利用可能なものがない場合、入力データの全部に対するＭａｐＲｅｄｕｃｅの組立を行う。
【００３５】
結果登録サーバ４００は、データ処理サーバ７００，７００ａ，・・・によるＲｅｄｕｃｅ処理の結果を取得して、結果情報管理サーバ６００に登録するサーバコンピュータである。
【００３６】
入力情報管理サーバ５００は、入力情報を管理するサーバコンピュータである。入力情報は、ＥＣサーバ２０によって記録されたログデータである。
結果情報管理サーバ６００は、結果情報を管理するサーバコンピュータである。結果情報は、結果登録サーバ４００によって登録されたＲｅｄｕｃｅ処理の結果である。
【００３７】
データ処理サーバ７００，７００ａ，・・・は、データを並列処理するサーバコンピュータである。データ処理サーバ７００，７００ａ，・・・は、実行制御サーバ１００から割り当てられたＭａｐ処理またはＲｅｄｕｃｅ処理を実行する。１つのデータ処理サーバがＭａｐ処理およびＲｅｄｕｃｅ処理を割り当てられることもある。このようにデータの並列処理を担当するノードを、ワーカー（worker）あるいはスレーブ（slave）と呼ぶことがある。
【００３８】
図３は、第２の実施の形態の実行制御サーバのハードウェア例を示す図である。実行制御サーバ１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、ディスクドライブ１０６および通信部１０７を有する。各ユニットが実行制御サーバ１００のバスに接続されている。他のサーバやクライアント３０も、実行制御サーバ１００と同様のハードウェアを用いて実装できる。
【００３９】
ＣＰＵ１０１は、実行制御サーバ１００の情報処理を制御するプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されているプログラムやデータの少なくとも一部を読み出し、ＲＡＭ１０２に展開してプログラムを実行する。なお、実行制御サーバ１００は、複数のプロセッサを設けて、プログラムを分散して実行してもよい。
【００４０】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムや処理に用いるデータを一時的に記憶する揮発性メモリである。なお、実行制御サーバ１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えていてもよい。
【００４１】
ＨＤＤ１０３は、ＯＳ（Operating System）プログラムやアプリケーションプログラムなどのプログラムおよびデータを記憶する不揮発性の記憶装置である。ＨＤＤ１０３は、ＣＰＵ１０１の命令に従って、内蔵の磁気ディスクに対してデータの読み書きを行う。なお、実行制御サーバ１００は、ＨＤＤ以外の種類の不揮発性の記憶装置（例えば、ＳＳＤなど）を備えてもよく、複数の記憶装置を備えていてもよい。
【００４２】
画像信号処理部１０４は、ＣＰＵ１０１の命令に従って、実行制御サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、例えば、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイを用いることができる。
【００４３】
入力信号処理部１０５は、実行制御サーバ１００に接続された入力デバイス１２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４４】
ディスクドライブ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る駆動装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。ディスクドライブ１０６は、例えば、ＣＰＵ１０１の命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４５】
通信部１０７は、ネットワーク１０を介して他のサーバと通信を行う通信インタフェースである。通信部１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００４６】
図４は、第２の実施の形態のソフトウェア例を示す図である。図４に示すユニットの一部または全部は、各サーバが実行するプログラムのモジュールであってもよい。また、図４に示すユニットの一部または全部は、ＦＰＧＡ（Field Programmable Gate Array）やＡＳＩＣ（Application Specific Integrated Circuit）などの電子回路であってもよい。
【００４７】
ＥＣサーバ２０は、ＥＣアプリ２１を有する。ＥＣアプリ２１は、電子商取引の機能を実現するアプリケーションである。ＥＣサーバ２０はＷｅｂサーバとして機能する。ＥＣアプリ２１は、当該Ｗｅｂサーバ上のＷｅｂアプリケーションとして、ユーザが操作する端末装置から利用可能である。
【００４８】
クライアント３０は、ブラウザ３１を有する。ブラウザ３１は、実行制御サーバ１００にＷｅｂアクセスするためのＷｅｂブラウザである（実行制御サーバ１００は、Ｗｅｂサーバとしても機能する）。管理者は、ブラウザ３１を操作して、ワードカウントの処理依頼を実行制御サーバ１００に行える。処理依頼と共に、処理に用いる情報（処理対象期間や検索する文字列など）を入力できる。なお、クライアント３０から実行制御サーバ１００への処理依頼は、例えば、ＣＬＩ（Command Line Interface）を用いて行ってもよい。
【００４９】
実行制御サーバ１００は、実行制御部１１０を有する。実行制御部１１０は、分散処理の実行を制御する。実行制御部１１０は、クライアント３０から受信した処理依頼に応じて、ワードカウントの処理を開始する。実行制御部１１０は、指定された期間のログの分析を分析サーバ２００に依頼する。実行制御部１１０は、分析サーバ２００から分析結果を取得すると、ワードカウントに係るＭａｐＲｅｄｕｃｅの組立を処理組立サーバ３００に依頼する。当該組立依頼は、分析結果の情報を含む。実行制御部１１０は、処理組立サーバ３００から組立結果を取得すると、当該組立結果に基づいて、Ｍａｐ処理やＲｅｄｕｃｅ処理をデータ処理サーバ７００，７００ａ，・・・に割り当てる。Ｍａｐ処理に対する入力データは、指定された期間のログとなる。
【００５０】
実行制御部１１０は、ＭａｐＲｅｄｕｃｅによる分散処理によって得られたワードカウントの結果をクライアント３０に応答する。また、実行制御部１１０は、Ｒｅｄｕｃｅ処理の結果を結果登録サーバ４００に送信する。
【００５１】
分析サーバ２００は、分析部２１０を有する。分析部２１０は、実行制御部１１０からの分析依頼に応じて、入力情報管理サーバ５００および結果情報管理サーバ６００に格納された情報を参照して、指定された期間のログの分析を実行し、分析結果を実行制御部１１０に応答する。
【００５２】
処理組立サーバ３００は、処理組立部３１０を有する。処理組立部３１０は、実行制御部１１０からの組立依頼および分析結果に応じて、ＭａｐＲｅｄｕｃｅの組立処理を実行し、組立結果を実行制御部１１０に応答する。
【００５３】
結果登録サーバ４００は、結果登録部４１０を有する。結果登録部４１０は、実行制御部１１０からＲｅｄｕｃｅ処理の結果を取得し、結果情報管理サーバ６００に登録する。
入力情報管理サーバ５００は、入力情報記憶部５１０を有する。入力情報記憶部５１０は、入力情報を記憶する。
【００５４】
結果情報管理サーバ６００は、結果情報記憶部６１０を有する。結果情報記憶部６１０は、結果情報を記憶する。
データ処理サーバ７００は、データ処理部７１０を有する。データ処理部７１０は、実行制御部１１０によりＭａｐ処理が割り当てられると、入力データの一部を取得してＭａｐ処理を実行する。また、データ処理部７１０は、実行制御部１１０によりＲｅｄｕｃｅ処理が割り当てられるとＭａｐ処理の結果に対してＲｅｄｕｃｅ処理を実行し、Ｒｅｄｕｃｅ処理の結果を実行制御サーバ１００に応答する。
【００５５】
図５は、第２の実施の形態のＭａｐＲｅｄｕｃｅの例を示す図である。第２の実施の形態の分散処理システムが実行するワードカウントは、ステップＳ１，Ｓ２，Ｓ３を含む。
ステップＳ１は、Ｍａｐ処理である。Ｍａｐ処理では、各データ処理部が、自身が担当する入力データの一部に対して、キー（key）とバリュー（value）とのペア（以下、キー・バリュー・ペアと呼ぶことがある）を生成する。具体的には、キーは商品を示す文字列の情報である。バリューは、当該入力データの一部に含まれる当該文字列の数である。
【００５６】
ステップＳ２は、ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理である。ステップＳ２には、ステップＳ１の出力が入力される。ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理では、入力されたキー・バリュー・ペアをキーでソートし、同じキーをもつキー・バリュー・ペア同士を集約する。同じキーをもつキー・バリュー・ペアを、同じデータ処理部に入力して、Ｒｅｄｕｃｅ処理を実行する。第２の実施の形態の分散処理システムでは、データ処理サーバ７００，７００ａ，・・・が協調してｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。
【００５７】
ステップＳ３は、Ｒｅｄｕｃｅ処理である。ステップＳ３には、ステップＳ２の出力が入力される。Ｒｅｄｕｃｅ処理では、入力されたキー・バリュー・ペアをマージして新たなキー・バリュー・ペアを出力する。出力するキー・バリュー・ペアについて、キーは商品を示す文字列の情報であり、バリューは入力データの全範囲に含まれる当該文字列の数である。
【００５８】
図６は、第２の実施の形態のログデータの例を示す図である。ログデータ５１１は、入力情報記憶部５１０に記憶される。ログデータ５１１の１行には、タイムスタンプが含まれる。例えば、タイムスタンプ“２０１１／０５／０１  ００：００：０２”は、当該１行分のログが２０１１年５月１日０時０分２秒に記録されたものであることを示す。また、ログデータ５１１の１行には、ログの内容を示すメッセージが含まれる。例えば、メッセージ“・・・ａｐｐｌｅ・・・”は、購入された商品名“ａｐｐｌｅ”を含んでいる。ログデータ５１１の１行分のデータがログデータ５１１の１レコードに相当する。すなわち、ログデータ５１１は、レコードの集合である。
【００５９】
ここで、以下ではデータ処理部７１０，７１０ａ，・・・に対し、入力データを日付で区分して入力し、Ｍａｐ処理を実行させるものとする。５月１日のレコードの集合をログデータ５１１ａとする。５月２日のレコードの集合をログデータ５１１ｂとする。５月３日のレコードの集合をログデータ５１１ｃとする。５月４日のレコードの集合をログデータ５１１ｄとする。５月５日のレコードの集合をログデータ５１１ｅとする。５月６日のレコードの集合をログデータ５１１ｆとする。すなわち、ログデータ５１１ａ，５１１ｂ，５１２ｃ，５１１ｄ，５１１ｅ，５１１ｆは、ログデータ５１１の部分集合である。
【００６０】
なお、ログデータ５１１を区分する方法として日付以外の他の単位を用いてもよい。例えば、時間帯（例えば１時台、２時台など）の単位で区分してもよい。また、週（例えば第１週目、第２週目など）の単位で区分してもよい。
【００６１】
次に、第２の実施の形態の分散処理システムにおける、過去の結果を利用しない場合のワードカウントを例示する。なお、以下の説明では、ワードカウント対象の文字列として、“ａｐｐｌｅ”および“ｏｒａｎｇｅ”を含む文字列が指定されているとする。
【００６２】
図７は、第２の実施の形態のログデータの処理例を示す図である。図７では、５月１日〜５月５日の期間に属するログを入力データとして、ワードカウントを行う場合を例示している。
【００６３】
ステップＳ１では、ログデータ５１１ａ，５１１ｂ，５１１ｃ，５１１ｄ，５１１ｅをデータ処理部７１０，７１０ａ，・・・に入力してＭａｐ処理を実行し、Ｍａｐ結果５１２ａ，５１２ｂ，５１２ｃ，５１２ｄ，５１２ｅを生成する。
【００６４】
Ｍａｐ結果５１２ａは、ログデータ５１１ａに対するＭａｐ処理の結果（５月１日分）である。例えば、Ｍａｐ結果５１２ａにはキー・バリュー・ペア＜ａｐｐｌｅ，３＞、＜ｏｒａｎｇｅ，４＞などが含まれる。
【００６５】
Ｍａｐ結果５１２ｂは、ログデータ５１１ｂに対するＭａｐ処理の結果（５月２日分）である。Ｍａｐ結果５１２ｃは、ログデータ５１１ｃに対するＭａｐ処理の結果（５月３日分）である。Ｍａｐ結果５１２ｄは、ログデータ５１１ｄに対するＭａｐ処理の結果（５月４日分）である。Ｍａｐ結果５１２ｅは、ログデータ５１１ｅに対するＭａｐ処理の結果（５月５日分）である。
【００６６】
ステップＳ２では、Ｍａｐ結果５１２ａ，５１２ｂ，５１２ｃ，５１２ｄ，５１２ｅに対し、データ処理部７１０，７１０ａ，・・・がｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。そして、検索対象の文字列ごとにｓｈｕｆｆｌｅ＆ｓｏｒｔ結果５２１，５２２，・・・を生成する。ｓｈｕｆｆｌｅ＆ｓｏｒｔ結果５２１は、文字列“ａｐｐｌｅ”に関するｓｈｕｆｆｌｅ＆ｓｏｒｔ処理の結果である。例えば、ｓｈｕｆｆｌｅ＆ｓｏｒｔ結果５２１は、Ｍａｐ結果５１２ａ，５１２ｂ，５１２ｃ，５１２ｄ，５１２ｅのうちキーが“ａｐｐｌｅ”であるキー・バリュー・ペアの集合である。なお、ｓｈｕｆｆｌｅ＆ｓｏｒｔ結果５２１は、当該キー・バリュー・ペアの集合をキーでマージしたキー・バリューズ・ペアとして取得されてもよい（例えば、＜ａｐｐｌｅ，３，４，５，・・・＞など）。ｓｈｕｆｆｌｅ＆ｓｏｒｔ結果５２２は、同様に文字列“ｏｒａｎｇｅ”に関するｓｈｕｆｆｌｅ＆ｓｏｒｔ処理の結果である。
【００６７】
ステップＳ３では、ｓｈｕｆｆｌｅ＆ｓｏｒｔ結果５２１，５２２，・・・をデータ処理部７１０，７１０ａ，・・・に入力してＲｅｄｕｃｅ処理を実行し、Ｒｅｄｕｃｅ結果５３１，５３２，・・・を生成する。Ｒｅｄｕｃｅ結果５３１，５３２，・・・は、キー・バリュー・ペアである。上述したようにキーは文字列の情報、バリューは入力データに含まれる当該文字列の数の合計である。例えば、Ｒｅｄｕｃｅ結果５３１は、文字列“ａｐｐｌｅ”に関するＲｅｄｕｃｅ処理の結果である。Ｒｅｄｕｃｅ結果５３２は、文字列“ｏｒａｎｇｅ”に関するＲｅｄｕｃｅ処理の結果である。
【００６８】
Ｒｅｄｕｃｅ結果５３１，５３２，・・・をまとめた、Ｒｅｄｕｃｅ結果５３０が当該ワードカウントの最終の処理結果となる。
このようにして、過去の結果を利用しない場合は、入力データの全範囲に対してＭａｐＲｅｄｕｃｅを実行する。
【００６９】
Ｒｅｄｕｃｅ結果５３０は、結果登録サーバ４００により結果情報記憶部６１０に登録される。
図８は、第２の実施の形態のＲｅｄｕｃｅ結果テーブルの例を示す図である。Ｒｅｄｕｃｅ結果テーブル６１１は、結果情報記憶部６１０に記憶される。Ｒｅｄｕｃｅ結果テーブル６１１は、入力データ識別子およびＲｅｄｕｃｅ結果の項目を含む。
【００７０】
入力データ識別子の項目には、Ｒｅｄｕｃｅ結果に対応する入力データの識別情報（以下、入力データ識別子と呼ぶことがある）が登録される。当該入力データ識別子には、入力データの処理対象範囲を示す情報が含まれる。例えば、入力データ識別子“２０１１／０５／０１−２０１１／０５／０５−Ｒｅｄｕｃｅ”は、２０１１年５月１日〜２０１１年５月５日の期間を処理対象範囲としたことを示す。Ｒｅｄｕｃｅ結果の項目には、当該処理対象範囲の入力データに対するＲｅｄｕｃｅ結果が登録される。
【００７１】
次に、以上の構成の分散処理システムにおける分散処理の手順を説明する。まず、分散処理の全体の流れを説明する。
図９は、第２の実施の形態の分散処理の例を示すシーケンス図である。以下、図９に示す処理をステップ番号に沿って説明する。
【００７２】
（ステップＳＴ１）クライアント３０は、実行制御サーバ１００にワードカウントの処理依頼を送信する。処理依頼は、処理対象の期間および検索対象とする文字列の情報を含む。実行制御サーバ１００は、処理依頼を受信する。
【００７３】
（ステップＳＴ２）実行制御サーバ１００は、分析サーバ２００に分析依頼を送信する。分析依頼は、処理対象の期間の情報を含む。ここでは、期間は日付範囲（例えば、“２０１１／０５／０２〜２０１１／０５／０６”）で指定されるものとする。分析サーバ２００は、分析依頼を受信する。
【００７４】
（ステップＳＴ３）分析サーバ２００は、入力情報記憶部５１０および結果情報記憶部６１０を参照して、指定された期間のログデータ（以下、「今回の入力データ」ということがある）について分析処理を実行し、分析結果を得る。分析処理の詳細は後述する。
【００７５】
（ステップＳＴ４）分析サーバ２００は、実行制御サーバ１００に分析結果を応答する。実行制御サーバ１００は、分析結果を受信する。
（ステップＳＴ５）実行制御サーバ１００は、ＭａｐＲｅｄｕｃｅを用いたワードカウントの処理の組立依頼を処理組立サーバ３００に送信する。組立依頼は、分析結果の情報を含む。処理組立サーバ３００は、組立依頼を受信する。
【００７６】
（ステップＳＴ６）処理組立サーバ３００は、組立処理を実行し、組立結果を得る。組立処理の詳細は後述する。
（ステップＳＴ７）処理組立サーバ３００は、実行制御サーバ１００に組立結果を応答する。実行制御サーバ１００は、組立結果を受信する。
【００７７】
（ステップＳＴ８）実行制御サーバ１００は、組立結果に基づいてデータ処理サーバ７００，７００ａ，・・・にＭａｐ処理およびＲｅｄｕｃｅ処理を割り当て、指定された文字列に関するワードカウントの処理を実行させる。図９では、データ処理サーバ７００，７００ａ以外のデータ処理サーバの図示を省略している。実行制御サーバ１００は、各文字列に関するワードカウントの結果（Ｒｅｄｕｃｅ結果５３１，５３２，・・・に相当）をデータ処理サーバ７００，７００ａ，・・・から受信する。
【００７８】
（ステップＳＴ９）実行制御サーバ１００は、ワードカウントの結果を結果登録サーバ４００に送信する。結果登録サーバ４００は、受信したワードカウントの結果を入力データ識別子に対応付けて、結果情報記憶部６１０に記憶されたＲｅｄｕｃｅ結果テーブル６１１に登録する。
【００７９】
（ステップＳＴ１０）実行制御サーバ１００は、ワードカウントの結果をクライアント３０に応答する。
このように、第２の実施の形態の分散処理システムでは、ＭａｐＲｅｄｕｃｅを実行する前に、処理組立サーバ３００が処理の組立を行う。処理の組立は、分析サーバ２００の分析結果に応じた方法で行われる。次に、ステップＳＴ３の分析処理の手順を説明する。
【００８０】
図１０は、第２の実施の形態の分析処理の例を示すフローチャートである。以下、図１０に示す処理をステップ番号に沿って説明する。
（ステップＳ１１）分析部２１０は、入力情報記憶部５１０を参照して、処理対象の期間として指定された期間のログデータ（今回の入力データ）を取得する。分析部２１０は、今回の入力データの入力データ識別子を取得する。分析部２１０は、指定された期間の最も早い日付と最も遅い日付とをハイフン“−”で結合し、更にその最後にハイフン“−”と“Ｒｅｄｕｃｅ”の文字列を結合することで、当該入力データ識別子を得る。
【００８１】
（ステップＳ１２）分析部２１０は、結果情報記憶部６１０に記憶されたＲｅｄｕｃｅ結果テーブル６１１から過去に処理された入力データの入力データ識別子の一覧を取得する。
【００８２】
（ステップＳ１３）分析部２１０は、ステップＳ１１で得た今回の入力データの入力データ識別子と、ステップＳ１２で得た入力データ識別子の一覧とを照合して、今回のワードカウントの結果を得るために利用可能な過去の処理（Ｒｅｄｕｃｅ）結果を検索する。具体的には、分析部２１０は、今回の入力データの入力データ識別子で示される期間（以下、「今回の入力データの期間」と呼ぶことがある）と重複する期間をもつ過去の処理結果を検索する。複数の処理結果が検索された場合には、その中で重複する期間が最も長いものを選択する。ここで検索された処理結果を、今回のワードカウントの結果を得るために利用する「前回の処理結果」と呼ぶこととする。また、当該「前回の処理結果」を得るために過去に処理された入力データを「前回の入力データ」と呼ぶこととする。「前回の入力データ」は、本例では「前回の処理結果」に対応する入力データ識別子が示す期間（以下、「前回の入力データの期間」と呼ぶことがある）のログデータである。なお、「前回の処理結果」を検索できない場合は、ステップＳ１４をスキップして分析処理を終了する。
【００８３】
（ステップＳ１４）分析部２１０は、前回の入力データおよび今回の入力データから次の３種類のデータを抽出する。第１のデータは、「前回だけに出現する入力データ」である。「前回だけに出現する入力データ」は、前回の入力データの期間には含まれるが今回の入力データの期間には含まれない期間のログデータである。第２のデータは、「重複する入力データ」である。「重複する入力データ」は、前回の入力データの期間および今回の入力データの期間の両方の期間に含まれる期間のログデータである。第３のデータは、「今回だけに出現する入力データ」である。「今回だけに出現する入力データ」は、前回の入力データの期間には含まれないが今回の入力データの期間には含まれる期間のログデータである。
【００８４】
このようにして、分析部２１０は、入力データを分析する。なお、分析部２１０は、ステップＳ１１で得た入力データ識別子を実行制御サーバ１００に送信しておいてもよい。その場合、例えば、実行制御サーバ１００は、データ処理サーバ７００，７００ａ，・・・から、今回の入力データに対するＲｅｄｕｃｅ結果を、当該入力データ識別子とともに結果登録サーバ４００に送信する。すると、結果登録サーバ４００は、当該入力データ識別子に対応付けてＲｅｄｕｃｅ結果を結果情報記憶部６１０に登録できる。
【００８５】
図１１は、第２の実施の形態の分析処理の結果の例を示す図である。図１１の例では、今回の入力データＤ１０は、５月２日〜５月６日のログデータ５１１ｂ，５１１ｃ，５１１ｄ，５１１ｅ，５１１ｆの集合である（各ログデータに含まれるレコードの集合ということもできる）。前回の入力データＤ２０は、５月１日〜５月５日のログデータ５１１ａ，５１１ｂ，５１１ｃ，５１１ｄ，５１１ｅの集合である（各ログデータに含まれるレコードの集合ということもできる）。
【００８６】
この場合、前回だけに出現する入力データＰ１は、１日のログデータ５１１ａである。重複する入力データＰ２は、２日〜５日のログデータ５１１ｂ，５１１ｃ，５１１ｄ，５１１ｅである。今回だけに出現する入力データＰ３は、６日のログデータ５１１ｆである。
【００８７】
ここで、処理組立部３１０は、図９のステップＳＴ６においてＭａｐＲｅｄｕｃｅを組み立てる。このとき、入力データの全体に対してＭａｐＲｅｄｕｃｅを実行する場合には、図７で説明した手順を組み立てる。一方、処理組立部３１０は、図１１のように区分されたデータに対しては、図７で説明した手順とは異なった手順を組み立てる。次に、図１１のように区分されたデータに対する組立処理の手順を説明する。
【００８８】
図１２は、第２の実施の形態の分散処理制御の例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。
（ステップＳ２１）処理組立部３１０は、前回だけに出現する入力データＰ１を入力としたＭａｐ処理を作成する。
【００８９】
（ステップＳ２２）処理組立部３１０は、ステップＳ２１のＭａｐ処理の結果および前回の入力データＤ２に対応する前回の処理結果を入力とした逆Ｒｅｄｕｃｅ処理を作成する。ここで、逆Ｒｅｄｕｃｅ処理とは、前回の処理結果から前回だけに出現する入力データＰ１の影響を除去する処理である。
【００９０】
（ステップＳ２３）処理組立部３１０は、今回だけに出現する入力データＰ３を入力としたＭａｐ処理を作成する。
（ステップＳ２４）処理組立部３１０は、ステップＳ２２の逆Ｒｅｄｕｃｅ処理の結果およびステップＳ２３のＭａｐ処理の結果を入力としたＲｅｄｕｃｅ処理を作成する。
【００９１】
このようにして、処理組立部３１０はＭａｐＲｅｄｕｃｅを組み立てる。ここで、ステップＳ２１で作成したＭａｐ処理およびステップＳ２３で作成したＭａｐ処理は並列に実行するように組み立てる。ただし、ステップＳ２２で作成した逆Ｒｅｄｕｃｅ処理およびステップＳ２３で作成したＭａｐ処理を並列に実行するように組み立ててもよい。
【００９２】
実行制御部１１０は、処理組立部３１０が組み立てたＭａｐ処理、逆Ｒｅｄｕｃｅ処理およびＲｅｄｕｃｅ処理をデータ処理サーバ７００，７００ａ，・・・に割り当てる。ただし、ステップＳ２３をステップＳ２１の前に実行してもよい。
【００９３】
次に、このようにして組み立てられたワードカウントに係るＭａｐ処理、逆Ｒｅｄｕｃｅ処理およびＲｅｄｕｃｅ処理の入出力を具体的に説明する。ここで、以下では、今回の入力データＤ１０に対する処理結果を得るために前回の入力データＤ２０を利用するものとする。
【００９４】
図１３は、第２の実施の形態の分散処理の例を示す図である。以下、図１３に示す処理をステップ番号に沿って説明する。
（ステップＳ３１）データ処理部７１０，７１０ａ，・・・は、前回だけに出現する入力データＰ１に対するＭａｐ処理を実行し、前回だけに出現する入力データＰ１に対応するＭａｐ結果Ｐ１ａを生成する。データ処理部７１０，７１０ａ，・・・には、各自がＭａｐ処理の対象とする入力データの範囲が実行制御部１１０により与えられる。本例では、入力データを日付単位で区切って１つのＭａｐ処理の処理単位とする。ここでは、前回だけに出現する入力データＰ１は、１日のログデータ５１１ａである。したがって、この場合、当該ステップＳ３１のＭａｐ処理を割り当てられるのは例えば１つのデータ処理部である。ただし、当該１日のログデータ５１１ａを時間単位などに更に分割して複数のデータ処理部にＭａｐ処理を割り当ててもよい。そうすれば、当該Ｍａｐ処理を高速に行える。Ｍａｐ結果Ｐ１ａは、１日のログデータ５１１ａに対する１日のＭａｐ結果５１２ａとなる。
【００９５】
（ステップＳ３１ａ）データ処理部７１０，７１０ａ，・・・は、今回だけに出現する入力データＰ３に対するＭａｐ処理を実行し、今回だけに出現する入力データＰ３に対応するＭａｐ結果Ｐ３ａを生成する。ここでは、今回だけに出現する入力データＰ３は、６日のログデータ５１１ｆである。したがって、この場合、ステップＳ３１のＭａｐ処理と同様に、何れか１つのデータ処理部でＭａｐ処理を実行してもよいし、６日のログデータ５１１ｆを時間単位などに更に分割して複数のデータ処理部でＭａｐ処理を実行してもよい。Ｍａｐ結果Ｐ３ａは、６日のログデータ５１１ｆに対する６日のＭａｐ結果５１２ｆとなる。なお、ステップＳ３１，Ｓ３１ａは並列に実行可能である。例えば、ステップＳ３１で用いるデータ処理サーバ以外のデータ処理サーバを用いて当該ステップＳ３１ａを実行することで、ステップＳ３１，３１ａを並列実行する。
【００９６】
（ステップＳ３２）データ処理部７１０，７１０ａ，・・・は、Ｍａｐ結果Ｐ１ａに対してｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。データ処理部７１０，７１０ａ，・・・は、結果情報記憶部６１０から前回の処理結果を取得し、当該ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理結果を用いて逆Ｒｅｄｕｃｅ処理を実行し、逆Ｒｅｄｕｃｅ結果６１２を生成する。ここでは、前回の処理結果は、前回の入力データＤ２に対応する前回のＲｅｄｕｃｅ結果５３０である。例えば、１日のＭａｐ結果５１２ａはキー・バリュー・ペア＜ａｐｐｌｅ，３＞および＜ｏｒａｎｇｅ，４＞を含む。前回の処理結果（前回のＲｅｄｕｃｅ結果５３０）はキー・バリュー・ペア＜ａｐｐｌｅ，１９＞および＜ｏｒａｎｇｅ，１２＞を含む。この場合、例えば、データ処理部７１０は、キー“ａｐｐｌｅ”に関して逆Ｒｅｄｕｃｅ処理を行う。具体的には、前回の処理結果＜ａｐｐｌｅ，１９＞から＜ａｐｐｌｅ，３＞を差し引いてキー・バリュー・ペア＜ａｐｐｌｅ，１６＞を生成する。また、例えば、データ処理部７１０ａは、キー“ｏｒａｎｇｅ”に関して逆Ｒｅｄｕｃｅ処理を行う。具体的には、前回の処理結果＜ｏｒａｎｇｅ，１２＞から＜ｏｒａｎｇｅ，４＞を差し引いてキー・バリュー・ペア＜ｏｒａｎｇｅ，８＞を生成する。逆Ｒｅｄｕｃｅ結果６１２は、重複する入力データＰ２に対応するＲｅｄｕｃｅ結果に等しい。
【００９７】
（ステップＳ３３）データ処理部７１０，７１０ａ，・・・は、Ｍａｐ結果Ｐ３ａに対してｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。データ処理部７１０，７１０ａ，・・・は、逆Ｒｅｄｕｃｅ結果６１２および当該ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理結果を用いてＲｅｄｕｃｅ処理を実行し、Ｒｅｄｕｃｅ結果６１３を生成する。例えば、逆Ｒｅｄｕｃｅ結果６１２はキー・バリュー・ペア＜ａｐｐｌｅ，１６＞および＜ｏｒａｎｇｅ，８＞を含む。Ｍａｐ結果Ｐ３ａはキー・バリュー・ペア＜ａｐｐｌｅ，９＞および＜ｏｒａｎｇｅ，５＞を含む。この場合、例えば、データ処理部７１０は、キー“ａｐｐｌｅ”に関してＲｅｄｕｃｅ処理を行う。具体的には、逆Ｒｅｄｕｃｅ結果＜ａｐｐｌｅ，１６＞に＜ａｐｐｌｅ，９＞を加えてキー・バリュー・ペア＜ａｐｐｌｅ，２５＞を生成する。また、例えば、データ処理部７１０ａは、キー“ｏｒａｎｇｅ”に関してＲｅｄｕｃｅ処理を行う。具体的には、逆Ｒｅｄｕｃｅ結果＜ｏｒａｎｇｅ，８＞に＜ｏｒａｎｇｅ，５＞を加えてキー・バリュー・ペア＜ｏｒａｎｇｅ，１３＞を生成する。
【００９８】
このようにして、前回の入力データＤ２０を用いて、今回の入力データＤ１０に対するＭａｐＲｅｄｕｃｅの結果を得る。
ここで、ステップＳ３２では、Ｍａｐ結果Ｐ１ａのみを処理対象とする。例えば、Ｍａｐ結果Ｐ１ａ，Ｐ３ａの区別は、Ｍａｐ結果を何れのデータ処理サーバから取得したかにより行える。前回だけに出現する入力データＰ１に対するＭａｐ処理を割り当てたデータ処理サーバから取得したＭａｐ結果はＭａｐ結果Ｐ１ａである。今回だけに出現する入力データＰ３に対するＭａｐ処理を割り当てたデータ処理サーバから取得したＭａｐ結果はＭａｐ結果Ｐ３ａである。あるいは、データ処理サーバ側で、逆Ｒｅｄｕｃｅ処理対象となるＭａｐ結果Ｐ１ａのキー・バリュー・ペアのバリューに、所定のフラグを付加してもよい。
【００９９】
なお、ステップＳ３１，Ｓ３１ａを並列に実行するものとしたが、ステップＳ３１ａをステップＳ３２と並列に実行してもよい。また、ステップＳ３１，Ｓ３１ａを直列に実行してもよい。直列に実行する場合、ステップＳ３１，Ｓ３１ａの実行順序は任意に決定できる。すなわち、ステップＳ３１を先に実行してもよいし、ステップＳ３１ａを先に実行してもよい。
【０１００】
また、図１１では、今回の入力データＤ１０および前回の入力データＤ２０に対する分析処理の結果、３つにデータを区分できる場合を例示した。これは、分析結果のうちの１パターンである。分析結果のパターンとしてはこの場合も含めて次の場合が考えられる。
【０１０１】
（１）「前回の処理結果」を検索できなかった場合。
（２）「前回の処理結果」を検索でき、重複する入力データＰ２および今回だけに出現する入力データＰ３のみが得られる場合（前回だけに出現する入力データＰ１は得られない）。例えば、前回の入力データが５月１日〜５月５日のログデータであるのに対して、今回の入力データが５月１日〜５月６日のログデータである場合である。
【０１０２】
（３）「前回の処理結果」を検索でき、前回だけに出現する入力データＰ１および重複する入力データＰ２のみが得られる場合（今回だけに出現する入力データＰ３は得られない）。例えば、前回の入力データが５月１日〜５月５日のログデータであるのに対して、今回の入力データが５月２日〜５月５日のログデータである場合である。
【０１０３】
（４）「前回の処理結果」を検索でき、前回だけに出現する入力データＰ１、重複する入力データＰ２および今回だけに出現する入力データＰ３が得られる場合。図１１で説明した場合である。
【０１０４】
分析結果が（１）の場合は、今回の入力データの全体に対して、図５で説明したＭａｐＲｅｄｕｃｅを実行する。
分析結果が（２）の場合は、今回だけに出現する入力データＰ３に関してＭａｐ処理を実行し（ステップＳ３１ａに相当）、当該Ｍａｐ結果にｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行して前回の処理結果に加えればよい（ステップＳ３３に相当）。すなわち、ステップＳ３１，Ｓ３２を実行せず、前回のＲｅｄｕｃｅ結果５３０およびＭａｐ結果Ｐ３ａをステップＳ３３の入力とする。
【０１０５】
分析結果が（３）の場合は、前回だけに出現する入力データＰ１に関してＭａｐ処理を実行し（ステップＳ３１に相当）、当該Ｍａｐ結果にｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行して前回の処理結果からその影響を除去すればよい（ステップＳ３２に相当）。すなわち、ステップＳ３１ａ，Ｓ３３を実行せず、逆Ｒｅｄｕｃｅ結果６１２がワードカウントの最終結果となる。
【０１０６】
分析結果が（４）の場合は、図１３で説明した通りである。
図１４は、第２の実施の形態のワードカウントのコード例を示す図である。図１４（Ａ）は、Ｒｅｄｕｃｅ処理のコード例を示している。図１４（Ｂ）は、逆Ｒｅｄｕｃｅ処理のコード例を示している。なお、各コード例は、プログラム言語としてＪａｖａ（登録商標）を想定している。
【０１０７】
図１４（Ａ）では、ＷｏｒｄＣｏｕｎｔ＿Ｒｅｄｕｃｅクラスに、ｒｅｄｕｃｅメソッドが定義されている。ｒｅｄｕｃｅメソッドは、キーワードに対するカウント値の合計を示す変数ｓｕｍに初期値“０”を代入し、キー・バリュー・ペアのバリューの値を順次加算していき、キーワードのカウント数を集計する操作である。
【０１０８】
図１４（Ｂ）では、ＷｏｒｄＣｏｕｎｔ＿Ｒｅｖｅｒｓｅ＿Ｒｅｄｕｃｅクラスに、ｗｏｒｄｃｏｕｎｔ＿ｒｅｄｕｃｅメソッドおよびｓｅｔＳｕｍメソッドが定義されている。ｗｏｒｄｃｏｕｎｔ＿ｒｅｄｕｃｅメソッドは、キーワードに対するカウント値の合計を示す変数ｓｕｍから、キー・バリュー・ペアのバリューの値を順次減算していくことで、過去の集計結果から差分の集計結果の影響を除去する操作である。ｓｅｔＳｕｍメソッドは、変数ｓｕｍの初期値に前回Ｒｅｄｕｃｅ結果の値を設定する操作である。
【０１０９】
このような操作を定義することで、ワードカウントの処理に対する逆Ｒｅｄｕｃｅ処理を行える。
以上で説明したように、第２の実施の形態の分散処理システムでは、今回の入力データＤ１０に対するワードカウントを行う際に、今回の入力データＤ１０と重複する前回の入力データＤ２０に対応する前回の処理結果を検索する。そして、前回の入力データだけに出現する入力データＰ１に対するＭａｐ処理を実行し、当該Ｍａｐ処理の結果にｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。そして、当該ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理の結果を用いて前回の処理結果から、前回の入力データだけに出現する入力データＰ１の影響を除去する。これにより、今回の入力データＤ１０と前回の入力データＤ２０とにずれがあっても、前回の処理結果を利用することができる。このため、過去の処理結果の利用可能性を向上できる。
【０１１０】
なお、上記の例では、前回のＲｅｄｕｃｅ結果から前回だけに出現する入力データＰ１の影響を除去するために、前回だけに出現する入力データＰ１に対するＭａｐ処理を行って（ステップＳ３１に相当）、Ｍａｐ結果Ｐ１ａを取得するものとした。一方、このような方法に限らず、ステップＳ３１を省く方法も考えられる。
【０１１１】
具体的には、前回の入力データに対するＭａｐ結果を入力データ識別子に対応付けて保存しておいてもよい。今回の入力データのワードカウントを行う際に、前回だけに出現する入力データＰ１に対応するＭａｐ結果Ｐ１ａ（差分のＭａｐ結果）を抽出する。そして、Ｍａｐ結果Ｐ１ａに対するｓｈｕｆｆｌｅ＆ｓｏｒｔ処理から開始するようにする。そのためのＭａｐ結果の保存例を以下に示す。
【０１１２】
図１５は、第２の実施の形態のＭａｐ結果テーブルの例を示す図である。Ｍａｐ結果テーブル６１４は、結果情報記憶部６１０に記憶される。例えば、結果登録部４１０は、データ処理部７１０，７１０ａ，・・・からＭａｐ結果を取得して、結果情報記憶部６１０にＭａｐ結果識別子とともに格納する。Ｍａｐ結果テーブル６１４は、Ｍａｐ結果識別子およびＭａｐ結果の項目を含む。
【０１１３】
Ｍａｐ結果識別子の項目には、Ｍａｐ結果識別子が登録される。Ｍａｐ結果識別子は、Ｍａｐ結果を識別するための識別情報である。Ｍａｐ結果の項目には、Ｍａｐ結果が登録される。
【０１１４】
ここで、例えば、入力データを日付単位に分割し、各日付単位にＭａｐ処理を行うようにすることで、各日付のレコードに対応するＭａｐ結果を得られる。このため、結果登録部４１０は、各Ｍａｐ結果のＭａｐ結果識別子に、各日付を示す情報を付与する。例えば、Ｍａｐ結果識別子を“２０１１／０５／０１−Ｍａｐ”とする。これは、２０１１年５月１日のログデータ５１１ａに対応するＭａｐ結果５１２ａである。
【０１１５】
このように、前回の入力データに対するＭａｐ結果を保存しておけば、今回の入力データのワードカウントを行う際に、前回だけに出現する入力データＰ１に対するＭａｐ処理を省ける。すなわち、前回だけに出現する入力データＰ１に対応するＭａｐ結果Ｐ１ａを抽出し、当該Ｍａｐ結果Ｐ１ａに対するｓｈｕｆｆｌｅ＆ｓｏｒｔ処理から実行開始できる。
【０１１６】
［第３の実施の形態］
以下、第３の実施の形態を説明する。前述の第２の実施の形態との相違点を主に説明し、共通する点の説明を省略する。
【０１１７】
第２の実施の形態では、ワードカウントの処理を例示して説明した。ワードカウントでは、逆Ｒｅｄｕｃｅ処理において、前回の処理結果の集計値から前回だけに出現するデータＰ１に対応する値を引き算することで、前回だけに出現するデータＰ１の影響を除去した。一方、引き算をする場合に限らず、逆Ｒｅｄｕｃｅ処理を利用可能である。そこで、第３の実施の形態では、ＭａｐＲｅｄｕｃｅによる他の処理に対して、逆Ｒｅｄｕｃｅ処理を利用する場合を例示する。
【０１１８】
ここで、第３の実施の形態の分散処理システムの全体構成は、図２で説明した第２の実施の形態の分散処理システムの全体構成と同様である。第３の実施の形態の分散処理システムに含まれる各サーバを第２の実施の形態と同様の名称・符号を用いて示す。当該各サーバのハードウェア例およびソフトウェア例は、図３，４で説明した第２の実施の形態の各サーバのハードウェア例およびソフトウェア例と同様である。第３の実施の形態の各サーバに含まれる構成を第２の実施の形態と同様の名称・符号を用いて示す。
【０１１９】
第３の実施の形態の分散処理システムでは、電子商取引において、ユーザによる商品の評価値を受け付け、その評価値に基づいて当該ユーザへ勧める商品を抽出する。具体的には、当該ユーザと他のユーザとの間の商品ごとの評価値の相関から、当該ユーザが高評価を付けると予測される商品を抽出してお勧め商品とする。第３の実施の形態の分散処理システムは、多数のユーザおよび商品に係る大量の評価値データを分散処理することで、お勧め商品の抽出処理を高速に実行する。なお、以下では、第３の実施の形態の分散処理システムが出力する、各商品の各ユーザによる予測評価値の情報を、リコメンド情報と称することがある。
【０１２０】
第３の実施の形態のＥＣサーバ２０は、ユーザの商品に対する評価値を受け付ける。ユーザは、例えばインターネットを介して通信可能な端末装置を操作して、ＥＣサーバ２０に商品ごとの評価値を送信できる。ＥＣサーバ２０は、入力された評価値をユーザの情報（例えば、ユーザ名）や評価値を受け付けた時間を示すタイムスタンプに対応付けて、入力情報管理サーバ５００に格納する。
【０１２１】
図１６は、第３の実施の形態のＭａｐＲｅｄｕｃｅの例を示す図である。第３の実施の形態の分散処理システムでは、リコメンド情報を生成するまでに、第１，第２フェーズの２回のフェーズで、ＭａｐＲｅｄｕｃｅを利用する。第１，第２フェーズは、データ処理サーバ７００，７００ａ，・・・により実行される。第１，第２フェーズの結果、ユーザ間の評価値の相関を得ることができる。ユーザ間の相関に基づいて、各ユーザが高評価すると予測される商品を抽出し、これをお勧め商品とする。
【０１２２】
第１フェーズは、ステップＳ１ａ，Ｓ２ａ，Ｓ３ａを含む。ステップＳ１ａは、第１のＭａｐ処理である。ステップＳ１ａでは、例えばＣＳＶ（Comma Separated Value）形式のデータが入力される。当該入力データには、ユーザ名、商品を示す情報、評価した日付、評価値が含まれる。ステップＳ１ａでは、入力データに対して、キー・バリュー・ペアが生成される。具体的には、キーは商品を示す情報である。バリューは当該商品を評価したユーザ名、その評価値および評価した日付のセットである。
【０１２３】
ステップＳ２ａは、第１のｓｈｕｆｆｌｅ＆ｓｏｒｔ処理である。ステップＳ２ａでは、ステップＳ１ａの出力が入力される。ステップＳ２ａでは、入力されたキー・バリュー・ペアをキーでソートして出力する。このとき、キーが同一のキー・バリュー・ペアが同一のデータ処理部に入力されるように出力する。
【０１２４】
ステップＳ３ａは、第１のＲｅｄｕｃｅ処理である。ステップＳ３ａでは、ステップＳ２ａの出力が入力となる。ステップＳ３ａでは、入力されたデータをマージして新たなキー・バリュー・ペアを出力する。具体的には、キーは商品を示す情報である。バリューは商品ごとの全ユーザの評価値のセットである。
【０１２５】
第２フェーズは、ステップＳ４，Ｓ５，Ｓ６を含む。ステップＳ４は、第２のＭａｐ処理である。ステップＳ４では、ステップＳ３ａの出力が入力となる。ステップＳ４では、入力されたデータに基づいて、新たなキー・バリュー・ペアを出力する。具体的には、キーはあるユーザ名と別のユーザ名のセットである。バリューは当該各ユーザによる評価値のセットである。
【０１２６】
ステップＳ５は、第２のｓｈｕｆｆｌｅ＆ｓｏｒｔ処理である。ステップＳ５では、ステップＳ４の出力が入力される。ステップＳ５では、入力されたキー・バリュー・ペアをキーでソートして出力する。
【０１２７】
ステップＳ６は、第２のＲｅｄｕｃｅ処理である。ステップＳ６では、ステップＳ５の出力が入力となる。ステップＳ６では、入力されたキー・バリュー・ペアに基づいて、ユーザ間の相関係数を求め、これを評価の類似度Ｓｉｍｉｌａｒｉｔｙ（ｕｓｅｒ１，ｕｓｅｒ２）とする。例えば、ユーザ“Ｔａｒｏ”および“Ｊｉｒｏ”の類似度Ｓｉｍｉｌａｒｉｔｙ（Ｔ，Ｊ）（“Ｔ”は“Ｔａｒｏ”を、“Ｊ”は“Ｊｉｒｏ”を示す）は、次の（１）式により求めることができる。
【０１２８】
【数１】
0005919825.tif 000002
【０１２９】
ここで、Ｃｏｖ（Ｔ，Ｊ）は、ユーザ“Ｔａｒｏ”および“Ｊｉｒｏ”の評価値の共分散である。σＴは“Ｔａｒｏ”の評価値の標準偏差であり、σＪは“Ｊｉｒｏ”の評価値の標準偏差である。また、Ｔｉは“Ｔａｒｏ”の商品“Ｉｔｅｍ”に対する評価値であり、Ｊｉは“Ｊｉｒｏ”の“Ｉｔｅｍ”に対する評価値である。Ｔ，Ｊの上付きバーはそれぞれＴｉ，Ｊｉの相加平均を示す。
【０１３０】
このように、第１，第２フェーズを実行して、各ユーザ間の相関係数を算出する。各ユーザ間の相関係数を用いて、例えば、“Ｔａｒｏ”のある商品“Ｉｔｅｍ”に対する予測評価値Ｒａｔｅ（Ｔ，ｉｔｅｍ）（“Ｔ”は“Ｔａｒｏ”を示す）を次の（２）式により求めることができる。
【０１３１】
【数２】
0005919825.tif 000003
【０１３２】
ここで、Σは、当該“Ｉｔｅｍ”に対して計算対象の期間内に評価を行った全ユーザについての和をとるものである。“ｕｓｅｒ”の上付きバーは当該期間内の全ユーザによる評価値の相加平均を示す。
【０１３３】
図１７は、第３の実施の形態の評価値テーブルの例を示す図である。評価値テーブル５１３は、入力情報記憶部５１０に記憶される。評価値テーブル５１３は、日付、商品ＩＤ（IDentifier）および評価値の項目を含む。
【０１３４】
日付の項目には、評価値が入力された日付が登録される。商品ＩＤの項目には、評価対象の商品を示す情報が登録される。評価値の項目には、各ユーザによる評価値が登録される。例えば、２０１１年３月１日に、商品ＩＤ“Ｉｔｅｍ１”の商品に対して、ユーザ“Ｔａｒｏ”が入力した評価値“１”が登録されている。評価値が大きい程、高評価であるとする。
【０１３５】
なお、入力情報記憶部５１０に登録されるデータは、同様の項目を含めばＣＳＶ形式など他のデータ形式でもよい。
図１８は、第３の実施の形態の第１のＭａｐの入出力例である。データＤ１１は、ステップＳ１ａ（第１のＭａｐ処理）の入力データである。データＤ１１は、評価値テーブル５１３から管理者が指定した期間の情報をＣＳＶ形式で抽出したものである。データＤ１１には、ユーザ名、商品ＩＤ、評価日付および評価値の順で情報が記述されている。
【０１３６】
データＤ１２は、ステップＳ１ａの出力データである。データＤ１２は、データＤ１１に含まれる商品ＩＤをキーとしたキー・バリュー・ペアを含む。バリューは、ユーザ名、評価日付および評価値の各値を“−”（ハイフン）で結んだものである。
【０１３７】
図１９は、第３の実施の形態の第１のｓｈｕｆｆｌｅ＆ｓｏｒｔの入出力例である。データＤ１２は、ステップＳ１ａの出力データであり、ステップＳ２ａ（第１のｓｈｕｆｆｌｅ＆ｓｏｒｔ処理）の入力データである。データＤ１３は、ステップＳ２ａの出力データである。
【０１３８】
データＤ１３は、データＤ１２のキー・バリュー・ペアをキー（商品ＩＤ）でソートしたものである。
図２０は、第３の実施の形態の第１のＲｅｄｕｃｅの入出力例である。データＤ１３は、ステップＳ２ａの出力データであり、ステップＳ３ａ（第１のＲｅｄｕｃｅ処理）の入力データである。
【０１３９】
データＤ１４は、ステップＳ３ａの出力データである。データＤ１４は、データＤ１３のキー・バリュー・ペアをキー（商品ＩＤ）でマージしたものであり、商品ＩＤに対する全ユーザの評価値を集約したものである。例えば、キー（商品ＩＤ）に対するバリューとして、ユーザと評価値とのセットが評価を行ったユーザ分だけ抽出される。
【０１４０】
なお、同一ユーザが同一商品に複数回評価を行っている場合には、新しい方の評価値を採用する。
図２１は、第３の実施の形態の第２のＭａｐの入出力例である。データＤ２１は、ステップＳ３ａの出力データ（データＤ１４と同一）であり、ステップＳ４（第２のＭａｐ処理）の入力データである。データＤ２２は、ステップＳ４の出力データである。
【０１４１】
データＤ２２は、データＤ２１に基づいて生成された新たなキー・バリュー・ペアを含む。具体的には、データＤ２１の各行について、評価したユーザの組をキーとして抽出し、抽出したユーザによる評価値の組をバリューとしたものである。データＤ２２では、ユーザ名を“−”（ハイフン）で結んだ値をキーとしている（例えば、“Ｔａｒｏ−Ｊｉｒｏ”）。また、各ユーザによる評価値を“，”（カンマ）で区切った値をバリューとしている（例えば、“（１，４）”）。
【０１４２】
図２２は、第３の実施の形態の第２のｓｈｕｆｆｌｅ＆ｓｏｒｔの入出力例である。データＤ２２は、ステップＳ４の出力データであり、ステップＳ５（第２のｓｈｕｆｆｌｅ＆ｓｏｒｔ処理）の入力データである。
【０１４３】
データＤ２３は、ステップＳ５の出力データである。データＤ２３は、データＤ２２のキー・バリューをキー（ユーザ名の組）でソートしたものである。
図２３は、第３の実施の形態の第２のＲｅｄｕｃｅの入出力例である。データＤ２３は、ステップＳ５の出力データであり、ステップＳ６（第２のＲｅｄｕｃｅ処理）の入力データである。データＤ２４は、ステップＳ６の出力データであり、データＤ２３に基づいて生成されるデータである。
【０１４４】
データＤ２４の各行は、データＤ２３に基づいて（１）式により算出されたユーザ間の類似度（相関係数）である。
データＤ２５は、ユーザ間の類似度を用いて（２）式により算出された各ユーザの各商品に対する予測評価値の一覧であり、お勧め商品を抽出するためのリコメンド情報である。例えば、ユーザ“Ｔａｒｏ”に対するお勧め商品を３つ抽出したい場合には、データＤ２５からＲａｔｅ（Ｔａｒｏ，Ｉｔｅｍ）のうち、大きい方から３つ選択して、該当する商品を特定すればよい。
【０１４５】
図２４は、第３の実施の形態のＲｅｄｕｃｅ結果テーブルの例を示す図である。Ｒｅｄｕｃｅ結果テーブル６１５は、結果情報記憶部６１０に記憶される。Ｒｅｄｕｃｅ結果テーブル６１１は、入力データ識別子およびＲｅｄｕｃｅ結果の項目を含む。各項目に登録される情報は、図８で説明したＲｅｄｕｃｅ結果テーブル６１１と同様である。
【０１４６】
ここで、図１８〜２３では今回の入力データの全体について、第１，第２フェーズのＭａｐＲｅｄｕｃｅを行ってリコメンド情報を取得する方法を例示した。第３の実施の形態の分散処理システムでは、過去に取得済のリコメンド情報を検索し、今回の入力データに対するリコメンド情報の取得に利用することができる。
【０１４７】
第３の実施の形態の分散処理の流れは、図９で説明した第２の実施の形態の分散処理の流れと同様である。また、第３の実施の形態の分析処理の手順は、図１０で説明した第２の実施の形態の分散処理の手順と同様である。更に、第３の実施の形態の組立処理の手順は、図１２で説明した第２の実施の形態の組立処理の手順と同様である。
【０１４８】
図２５は、第３の実施の形態の分析処理の結果の例を示す図である。図２５の例では、今回の入力データＤ１０ａは、３月２日〜３月６日の評価値のデータの集合である。前回の入力データＤ２０ａは、３月１日〜３月５日の評価値のデータの集合である。
【０１４９】
この場合、前回だけに出現する入力データＰ１は、１日の評価値データである。重複する入力データＰ２は、２日〜５日の評価値データである。今回だけに出現する入力データＰ３は、６日の評価値データである。
【０１５０】
処理組立部３１０は、当該分析結果に基づいてＭａｐＲｅｄｕｃｅを組み立てる。このとき、入力データの全体に対してＭａｐＲｅｄｕｃｅを実行する場合には、図１８〜２３で説明した手順を組み立てる。一方、処理組立部３１０は、図２５のように区分されたデータに対しては、図１８〜２３で説明した手順とは異なった手順を組み立てる。次に、処理組立部３１０により組み立てられた分散処理の手順の具体例を説明する。
【０１５１】
図２６は、第３の実施の形態の分散処理の例を示す図である。以下、図２６に示す処理をステップ番号に沿って説明する。
（ステップＳ４１）データ処理部７１０，７１０ａ，・・・は、前回だけに出現する入力データＰ１に対するＭａｐ処理を実行し、Ｍａｐ結果Ｐ１ａを生成する。本例では、入力データを日付単位で区切って１つのＭａｐ処理の処理単位とする。ここでは、前回だけに出現する入力データＰ１は、１日の評価値データである。したがって、この場合、当該ステップＳ４１のＭａｐ処理を割り当てられるのは例えば１つのデータ処理部である。ただし、当該１日の評価値データを更に分割して複数のデータ処理部にＭａｐ処理を割り当ててもよい。そうすれば、当該Ｍａｐ処理を高速に行える。
【０１５２】
（ステップＳ４２）データ処理部７１０，７１０ａ，・・・は、Ｍａｐ結果Ｐ１ａに対してｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。データ処理部７１０，７１０ａ，・・・は、結果情報記憶部６１０から前回の処理結果を取得し、当該ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理結果を用いて逆Ｒｅｄｕｃｅ処理を実行し、逆Ｒｅｄｕｃｅ結果６１６を生成する。ここでは、前回の処理結果は、前回の入力データ２０ａに対応する前回Ｒｅｄｕｃｅ結果５４０である。例えば、Ｍａｐ結果Ｐ１ａは、キー・バリュー・ペア＜Ｉｔｅｍ１，Ｔａｒｏ−３／１−１＞および＜Ｉｔｅｍ２，Ｊｉｒｏ−３／１−２＞を含む。前回の処理結果（前回Ｒｅｄｕｃｅ結果５４０）は、キー・バリュー・ペア＜Ｉｔｅｍ１，（Ｔａｒｏ−３／１−１，Ｊｉｒｏ−３／２−４，・・・）＞および＜Ｉｔｅｍ２，（Ｊｉｒｏ−３／１−２，Ｋｅｎｊｉ−３／２−４，・・・）＞を含む。この場合、例えば、データ処理部７１０は、キー“Ｉｔｅｍ１”に関して逆Ｒｅｄｕｄｅ処理を行う。具体的には、前回の処理結果＜Ｉｔｅｍ１，（Ｔａｒｏ−３／１−１，Ｊｉｒｏ−３／２−４，・・・）＞から“Ｔａｒｏ−３／１−１”を除去して、キー・バリュー・ペア＜Ｉｔｅｍ１，（Ｊｉｒｏ−３／２−４，・・・）＞を生成する。また、例えば、データ処理部７１０ａは、キー“Ｉｔｅｍ２”に関して逆Ｒｅｄｕｃｅ処理を行う。具体的には、前回の処理結果＜Ｉｔｅｍ２，（Ｊｉｒｏ−３／１−２，Ｋｅｎｊｉ−３／２−４，・・・）＞から“Ｊｉｒｏ−３／１−２”を除去して、キー・バリュー・ペア＜Ｉｔｅｍ２，（Ｋｅｎｊｉ−３／２−４，・・・）＞を生成する。逆Ｒｅｄｕｃｅ結果６１６は、重複する入力データＰ２に対応するＲｅｄｕｃｅ結果に等しい。
【０１５３】
図２７は、第３の実施の形態の分散処理の例（続き）を示す図である。以下、図２７に示す処理をステップ番号に沿って説明する。
（ステップＳ４１ａ）データ処理部７１０，７１０ａ，・・・は、今回だけに出現する入力データＰ３に対するＭａｐ処理を実行し、Ｍａｐ結果Ｐ３ａを生成する。ここでは、今回だけに出現する入力データＰ３は、６日の評価値データである。したがって、この場合、ステップＳ４１のＭａｐ処理と同様に、何れか１つのデータ処理部でＭａｐ処理を実行してもよいし、６日の評価値データを更に分割して複数のデータ処理部でＭａｐ処理を実行してもよい。なお、ステップＳ４１，Ｓ４１ａは並列に実行可能である。例えば、ステップＳ４１で用いたデータ処理サーバ以外のデータ処理サーバを用いて当該ステップＳ４１ａを実行することで、ステップＳ４１，Ｓ４１ａを並列実行する。
【０１５４】
（ステップＳ４３）データ処理部７１０，７１０ａ，・・・は、Ｍａｐ結果Ｐ３ａに対してｓｈｕｆｆｌｅ＆ｓｏｒｔ処理を実行する。データ処理部７１０，７１０ａ，・・・は、逆Ｒｅｄｕｃｅ結果６１６および当該ｓｈｕｆｆｌｅ＆ｓｏｒｔ処理結果を用いてＲｅｄｕｃｅ処理を実行し、Ｒｅｄｕｃｅ結果６１７を生成する。例えば、逆Ｒｅｄｕｃｅ結果６１６はキー・バリュー・ペア＜Ｉｔｅｍ１，（Ｊｉｒｏ−３／２−４，・・・）＞を含む。Ｍａｐ結果Ｐ３ａはキー・バリュー・ペア＜Ｉｔｅｍ１，Ｔａｒｏ−３／６−５＞および＜Ｉｔｅｍ３，Ｋｅｎｊｉ−３／６−５＞を含む。この場合、例えば、データ処理部７１０は、キー“Ｉｔｅｍ１”に関してＲｅｄｕｃｅ処理を行う。具体的には、逆Ｒｅｄｕｃｅ結果＜Ｉｔｅｍ１，（Ｊｉｒｏ−３／２−４，・・・）＞に＜Ｉｔｅｍ１，Ｔａｒｏ−３／６−５＞を追加してキー・バリュー・ペア＜Ｉｔｅｍ１，（Ｔａｒｏ−３／６−５，Ｊｉｒｏ−３／２−４，・・・）＞を生成する。また、例えば、データ処理部７１０ａは、キー“Ｉｔｅｍ３”に関してＲｅｄｕｃｅ処理を行う。具体的には、キー・バリュー・ペア＜Ｉｔｅｍ３，（Ｋｅｎｊｉ−３／６−５）＞を新たに生成する。
【０１５５】
このようにして、前回の入力データＤ２０ａを用いて、今回の入力データＤ１０ａに対するＭａｐＲｅｄｕｃｅの結果を得る。
なお、ステップＳ４１，Ｓ４１ａを並列に実行するものとしたが、ステップＳ４１ａをステップＳ４２と並列に実行してもよい。また、ステップＳ４１，Ｓ４１ａを直列に実行してもよい。直列に実行する場合、ステップＳ４１，Ｓ４１ａの実行順序は任意に決定できる。すなわち、ステップＳ４１を先に実行してもよいし、ステップＳ４１ａを先に実行してもよい。
【０１５６】
図２８は、第３の実施の形態の逆Ｒｅｄｕｃｅのコード例を示す図である。第３の実施の形態の逆Ｒｅｄｕｃｅのコードには、ＣｏｌｌａｂｏｒａｔｉｖｅＦｉｌｔｅｒｒｉｎｇ＿ｐｈａｓｅ１＿Ｒｅｖｅｒｓｅ＿Ｒｅｄｕｃｅクラスに、ｒｅｄｕｃｅメソッドが定義されている。当該ｒｅｄｕｃｅメソッドは、前回の処理結果から、Ｍａｐ結果Ｐ１ａに含まれるキー・バリュー・ペアのバリューに設定されたユーザ名および日付が同じデータを削除する操作である。例えば、図２６のステップＳ４２の例でいえば、前回Ｒｅｄｕｃｅ結果５４０のキー・バリュー・ペア＜Ｉｔｅｍ１，（Ｔａｒｏ−３／１−１，Ｊｉｒｏ−３／２−４，・・・）＞に含まれる“Ｔａｒｏ−３／１−１”と、Ｍａｐ結果Ｐ１ａのキー・バリュー・ペア＜Ｉｔｅｍ１，Ｔａｒｏ−３／１−１＞に含まれる“Ｔａｒｏ−３／１−１”は、同一のユーザ名および日付を含む。よって、前回Ｒｅｄｕｃｅ結果５４０の当該キー・バリュー・ペアから“Ｔａｒｏ−３／１−１”を削除する。
【０１５７】
このような操作を定義することで、第１フェーズにおける逆Ｒｅｄｕｃｅ処理を行える。
図２９は、第３の実施の形態のＲｅｄｕｃｅのコード例を示す図である。第３の実施の形態のＲｅｄｕｃｅのコードには、ＣｏｌｌａｂｏｒａｔｉｖｅＦｉｌｔｅｒｉｎｇ＿ｐｈａｓｅ１＿Ｒｅｄｕｃｅクラスに、ｒｅｄｕｃｅメソッドが定義されている。当該ｒｅｄｕｃｅメソッドは、逆Ｒｅｄｕｃｅ結果６１６にＭａｐ結果Ｐ３ａに含まれるキー・バリュー・ペアのバリューに設定されたユーザ名および日付を設定する操作である。例えば、図２７のステップＳ４３の例でいえば、逆Ｒｅｄｕｃｅ結果６１６のキー・バリュー・ペア＜Ｉｔｅｍ１，（Ｊｉｒｏ−３／２−４，・・・）＞に対して、Ｍａｐ結果Ｐ３ａのキー・バリュー・ペア＜Ｉｔｅｍ１，Ｔａｒｏ−３／６−５＞に含まれる“Ｔａｒｏ−３／６−５”を追加する。なお、逆Ｒｅｄｕｃｅ結果６１６のキー・バリュー・ペアに、同じユーザ名で日付の古いものがある場合は、削除する。
【０１５８】
このような操作を定義することで、逆Ｒｅｄｕｃｅ結果６１６のキー・バリュー・ペアにＭａｐ結果Ｐ３ａに含まれるキー・バリュー・ペアのバリューを追加するＲｅｄｕｃｅ処理を行える。
【０１５９】
このように、第３の実施の形態の分散処理システムにおいても、逆Ｒｅｄｕｃｅを利用して、過去の処理結果の利用可能性を向上できる。
なお、以上の説明では、第１フェーズにおいて逆Ｒｅｄｕｃｅを行う例を示したが、第２フェーズに含まれる集計処理でも逆Ｒｅｄｕｃｅを利用してもよい。
【０１６０】
例えば、式（１）では標準偏差の算出が含まれる。標準偏差は分散の平方根であり、分散は次の式（３）で求めることができる。
【０１６１】
【数３】
0005919825.tif 000004
【０１６２】
式（３）には、各要素ｘｉの二乗平均（ｘｉの二乗総和を要素数ｎで除したもの）およびｘｉの平均値（ｘｉの総和を要素数ｎで除したもの）の二乗が含まれている。ここで、ｘｉの二乗平均の計算のうち、ｘｉの二乗総和を算出する際に逆Ｒｅｄｕｃｅを利用することもできる。また、ｘｉの平均値の二乗の計算のうち、ｘｉの総和を算出する際に逆Ｒｅｄｕｃｅを利用することもできる。
【０１６３】
［第４の実施の形態］
以下、第４の実施の形態を説明する。前述の第２，第３の実施の形態との相違点を主に説明し、共通する点の説明を省略する。
【０１６４】
第２，第３の実施の形態の分散処理システムでは、逆Ｒｅｄｕｃｅによって過去の処理結果の利用可能性を向上できる。しかしながら、逆Ｒｅｄｕｃｅを用いる場合の計算量が逆Ｒｅｄｕｃｅを用いない場合の計算量を上回る場合も考えられる。この場合は逆Ｒｅｄｕｃｅを用いずに処理を行うことが好ましい。そこで、第４の実施の形態では、逆Ｒｅｄｕｃｅを用いる場合の計算量と逆Ｒｅｄｕｃｅを用いない場合の計算量とを比較し、比較結果を基に本番処理の実行方法を決定する機能を提供する。
【０１６５】
ここで、第４の実施の形態の分散処理システムの全体構成は、図２で説明した第２の実施の形態の分散処理システムの全体構成と同様である。第４の実施の形態の分散処理システムに含まれる各サーバを第２の実施の形態と同様の名称・符号を用いて示す。当該各サーバのハードウェア例およびソフトウェア例は、図３，４で説明した第２の実施の形態の各サーバのハードウェア例およびソフトウェア例と同様である。第４の実施の形態の各サーバに含まれる構成を第２の実施の形態と同様の名称・符号を用いて示す。
【０１６６】
図３０は、第４の実施の形態の分散処理の例を示すフローチャートである。以下、図３０に示す処理をステップ番号に沿って説明する。
（ステップＳ５１）実行制御部１１０は、クライアント３０から処理依頼を受信する。
【０１６７】
（ステップＳ５２）実行制御部１１０は、分析部２１０に入力データを分析させ、処理組立部３１０に分析結果に応じた組立処理を行わせる。ここで、分析により、前回だけに出現する入力データＰ１、重複する入力データＰ２および今回だけに出現する入力データＰ３が得られているとする。この場合、組立処理の結果、逆Ｒｅｄｕｃｅを用いた処理が作成される。実行制御部１１０は、逆Ｒｅｄｕｃｅを用いる場合の計算量と逆Ｒｅｄｕｃｅを用いない場合の計算量とを比較する。例えば、計算量は、各データに含まれるレコードの数により比較できる。具体的には、前回だけに出現する入力データＰ１に含まれるレコードの数が重複する入力データＰ２に含まれるレコードの数以上の場合は、逆Ｒｅｄｕｃｅを用いた場合の計算量が逆Ｒｅｄｕｃｅを用いない場合の計算量を上回ると判断する。一方、前回だけに出現する入力データＰ１に含まれるレコードの数が重複する入力データＰ２に含まれるレコードの数よりも小さい場合は、逆Ｒｅｄｕｃｅを用いた場合の計算量が逆Ｒｅｄｕｃｅを用いない場合の計算量を下回ると判断する。
【０１６８】
（ステップＳ５３）実行制御部１１０は、本番のＭａｐＲｅｄｕｃｅの方法を決定する。具体的には、逆Ｒｅｄｕｃｅを用いる場合の計算量が逆Ｒｅｄｕｃｅを用いない場合の計算量を下回る場合、逆Ｒｅｄｕｃｅを用いてＭａｐＲｅｄｕｃｅを実行すると決定する。一方、逆Ｒｅｄｕｃｅを用いる場合の計算量が逆Ｒｅｄｕｃｅを用いない場合の計算量を上回る場合、逆Ｒｅｄｕｃｅを用いずに、今回の入力データの全体に対してＭａｐＲｅｄｕｃｅを実行すると決定する。
【０１６９】
（ステップＳ５４）実行制御部１１０は、ステップＳ５３で決定した方法に基づいて、データ処理部７１０，７１０ａ，・・・にＭａｐ処理およびＲｅｄｕｃｅ処理（逆Ｒｅｄｕｃｅを用いる場合は更に逆Ｒｅｄｕｃｅ処理）を割り当て、ＭａｐＲｅｄｕｃｅを実行する。
【０１７０】
このようにして、実行制御部１１０は、計算量の小さい方法を選択してＭａｐＲｅｄｕｃｅを実行する。これにより、当該処理の高速化を図れる。
なお、ステップＳ５２の判定では、所定割合の入力データを用いてＭａｐＲｅｄｕｃｅを試行して、処理時間を計測して、逆Ｒｅｄｕｃｅの適用による高速化の可否を求めてもよい。具体的には、前回だけに出現する入力データＰ１、重複する入力データＰ２および今回だけに出現する入力データＰ３から同じ割合ずつレコードを抽出する。そして、逆Ｒｅｄｕｃｅを用いる場合と、逆Ｒｅｄｕｃｅを用いない場合とで、ＭａｐＲｅｄｕｃｅの処理時間（計算量に相当）を比較する。
【０１７１】
逆Ｒｅｄｕｃｅを用いる場合の全体の処理時間Ｔ１は、例えば、次のように表せる。
Ｔ１＝Ｍａｘ（前回分Ｍａｐ処理時間＋前回分逆Ｒｅｄｕｃｅ処理時間，今回分Ｍａｐ処理時間）＋今回分Ｒｅｄｕｃｅ処理時間
ここで、Ｍａｘ演算子は、括弧内の要素のうち、最大のものを選択することを表す。前回分Ｍａｐ処理時間は、前回だけに出現する入力データＰ１に対するＭａｐ処理の所要時間である。前回分逆Ｒｅｄｕｃｅ処理時間は、前回分Ｍａｐ処理の結果に対する逆Ｒｅｄｕｃｅ処理の所要時間である。今回分Ｍａｐ処理時間は、今回だけに出現する入力データＰ３に対するＭａｐ処理の所要時間である。今回分Ｒｅｄｕｃｅ処理時間は、今回分Ｍａｐ処理の結果に対するＲｅｄｕｃｅ処理の所要時間である。なお、逆ＲｅｄｕｃｅやＲｅｄｕｃｅの処理時間が非常に小さいと考えて、これらの処理時間を無視してもよい。その場合、逆Ｒｅｄｕｃｅを用いる場合の全体の処理時間Ｔ１ａをＴ１ａ＝（前回分Ｍａｐ処理時間，今回分Ｍａｐ処理時間）と表すこともできる。
【０１７２】
逆Ｒｅｄｕｃｅを用いない場合の全体の処理時間Ｔ２は、例えば、次のように表せる。
Ｔ２＝Ｍａｘ（重複分Ｍａｐ処理時間，今回分Ｍａｐ処理時間）＋Ｍａｘ（重複分Ｒｅｄｕｃｅ処理時間，今回分Ｒｅｄｕｃｅ処理時間）
ここで、重複分Ｍａｐ処理時間は重複する入力データＰ２に対するＭａｐ処理の所要時間である。重複分Ｒｅｄｕｃｅ処理時間は、重複分Ｍａｐ処理の結果に対するＲｅｄｕｃｅ処理の所要時間である。
【０１７３】
そして、ステップＳ５３では、Ｔ１（あるいはＴ１ａ）とＴ２との大小関係に応じて、いずれの方法を用いて処理するか決定する。具体的には、Ｔ１（あるいはＴ１ａ）がＴ２よりも小さければ、逆Ｒｅｄｕｃｅを用いて処理を行う。Ｔ１（あるいはＴ１ａ）がＴ２以上であれば、逆Ｒｅｄｕｃｅを用いずに処理を行う。
【０１７４】
このようにして、両方の処理の計算量の大小を比較することもできる。
なお、データ処理サーバ７００，７００ａ，・・・の機能はコンピュータに所定のプログラムを実行させることで実現できる。当該プログラムは、コンピュータ読み取り可能な可搬型の記録媒体に記録しておくことができる。当該記録媒体には、記録媒体１３と同様に種々の媒体を用いることができる。当該プログラムを流通させるには、例えば、そのプログラムが記録された記録媒体を配布する。または、そのプログラムをサーバコンピュータに格納しておき、ネットワーク経由でデータ処理サーバ７００，７００ａ，・・・に転送する。データ処理サーバ７００，７００ａ，・・・は、例えば、記録媒体に記録されたプログラムまたはネットワークから取得したプログラムを、自装置の不揮発性の記憶媒体に格納する。そして、当該不揮発性の記憶媒体からプログラムを読み取り実行する。ただし、データ処理サーバ７００，７００ａ，・・・は、取得したプログラムを、不揮発性の記憶媒体に格納せずに逐次、ＲＡＭに展開して実行することも可能である。
【符号の説明】
【０１７５】
１  記憶装置
２，３  情報処理装置
２ａ  検索手段
３ａ  データ処理手段
４，４ａ  ノード
Ｄ１  第１の入力データの集合
Ｄ２  第２の入力データの集合
【図１】
0005919825.tif 000005
【図２】
0005919825.tif 000006
【図３】
0005919825.tif 000007
【図４】
0005919825.tif 000008
【図５】
0005919825.tif 000009
【図６】
0005919825.tif 000010
【図７】
0005919825.tif 000011
【図８】
0005919825.tif 000012
【図９】
0005919825.tif 000013
【図１０】
0005919825.tif 000014
【図１１】
0005919825.tif 000015
【図１２】
0005919825.tif 000016
【図１３】
0005919825.tif 000017
【図１４】
0005919825.tif 000018
【図１５】
0005919825.tif 000019
【図１６】
0005919825.tif 000020
【図１７】
0005919825.tif 000021
【図１８】
0005919825.tif 000022
【図１９】
0005919825.tif 000023
【図２０】
0005919825.tif 000024
【図２１】
0005919825.tif 000025
【図２２】
0005919825.tif 000026
【図２３】
0005919825.tif 000027
【図２４】
0005919825.tif 000028
【図２５】
0005919825.tif 000029
【図２６】
0005919825.tif 000030
【図２７】
0005919825.tif 000031
【図２８】
0005919825.tif 000032
【図２９】
0005919825.tif 000033
【図３０】
0005919825.tif 000034