(57)【特許請求の範囲】
【請求項１】
ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおいて複数のマップリデュースジョブをグループ化及びマージすることによって複数のクエリを最適化して全体の計算時間を削減する方法であって、
各マップ関数が関係演算子のＤＡＧ（Directed Acyclic Graph）として表されるクエリプランの一部分であることに基づいて、当該ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおいて複数クエリ最適化の問題として、複数のマップリデュースジョブが与えられた場合に、当該複数のマップリデュースジョブをグループ化して最適なグループを見つけることを、各グループの中で最適な統合クエリプランを見つけながら行うことにより、当該複数のマップリデュースジョブの全体の計算時間を削減する、という問題を設定し、
前記複数クエリ最適化の問題を解くために、グループ化技術を用いて、全てのクエリの前記計算時間を推定するコストモデルを作成して当該ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムに登録し、
当該ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおいて、登録された前記コストモデルを基に、処理時間削減のための貪欲アルゴリズムを用いて、複数のマップリデュースジョブをグループ化して最適なグループを見つけることと、発見的アルゴリズムを用いて複数のマップリデュースジョブを単一のマップリデュースジョブにマージするときに、グループ化された各グループを処理するための複数の統合クエリプランを生成し、生成された統合クエリプランの中から、当該統合クエリプランの処理時間を計算しながら、計算された処理時間を基に最小処理時間を有する準最適な統合クエリプランを見つけること、とを実行して、複数のマップリデュースジョブの前記全体の計算時間の削減を図り、
前記複数のマップリデュースジョブをグループ化する貪欲アルゴリズムの実行は、
各マップリデュースジョブを単一ジョブグループとして開始することと、
最大の利益をもたらす、マージされるマップリデュースジョブのグループのペアを反復的に選択することと、
いずれの２つのグループをマージすることによっても利益がないときは、前記反復的に選択することを停止してグループ化を終了することと、
を含み、
前記準最適な統合クエリプランを見つける発見的アルゴリズムの実行は、
各マップ関数における前記クエリプランが局所的に最適であることに基づいて複数のクエリプランの統合のためのルールを作成することと、
マップ関数の共有のより多くの機会を提供するように、フィルター演算子を独立した演算子に分割し、共通の演算子の順序を交換することによって、各クエリプランを等価なクエリプランに変換することと、
前記統合のためのルールに基づいて、前記変換から取得されたクエリプランをマージすることによって、複数の統合クエリプランの候補を生成することと、
生成された複数の統合クエリプランの中から最小処理時間を有する統合クエリプランの候補を前記準最適な統合クエリプランとして選択することと、
を含む、方法。
【請求項２】
前記複数クエリ最適化の問題は、各マップ関数が関係演算子のＤＡＧであるマップリデュースジョブの集合が与えられた場合に、それらのマップリデュースジョブを、全てのマップリデュースジョブの全体の計算時間を最小にする最適なクエリプランを有するマップリデュースジョブにグループ化及びマージせよ、と定義される、請求項１に記載の方法。
【請求項３】
当該ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおけるマップリデュースジョブの計算の前記コストモデルに基づく前記計算時間の計算として、
入力ファイルを読み出し、マップ関数を実行し、中間データを書き込み外部にソートするコストの加算として、各マップジョブの実行時間を計算することと、
ネットワークを介してマップ出力を転送し、マップ出力を外部にソート／マージし、それらをリデュース関数に読み込むコストの加算として、各リデュースジョブの実行時間を計算することと、
前記マップジョブの前記実行時間と前記リデュースジョブの前記実行時間との加算として各マップリデュースジョブの実行時間を計算することと、
を含む、請求項１に記載の方法。
【請求項４】
前記マップ関数を実行するコストは、各演算子の入力タプルの数を１つのタプルの処理時間に乗算したものによって推定される前記各演算子のオーバーヘッドを加算したものである、請求項３に記載の方法。
【請求項５】
当該ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおける前記複数のクエリプラン-の統合のためのルールは、
複数のクエリプラン間に共通の演算子がない場合には、該複数のクエリプランを単純にマージすることによって統合クエリプランの候補を生成するルール１と、
複数の共通の演算子がある場合には、該複数の共通の演算子間の順序を維持しつつ、共通の演算子のサブセット又は全てを共有することによって統合クエリプランの候補を生成するルール２と、
を含む、請求項１に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベース技術の分野に関し、より詳細には、クエリ最適化に関する。
【背景技術】
【０００２】
マップリデュース（MapReduce）フレームワークは、その単純なプログラミングモデルと、数千ものコモディティマシンにわたる良好なスケーラビリティとによって広く関心を持たれてきた。このフレームワークは、ユーザーが自身のマップ（Map）関数及びリデュース（Reduce）関数を記述することを可能にし、そのような関数を並列化する一般的なフレームワークを提供する。きめの細かなフォールトトレランスを可能にするために、マップからリデュースへの全ての中間データは、ディスクに記憶される。そのような特徴は、演算子間で中間データをパイプライン化する従来のデータベースシステムを特徴付ける。Ｈａｄｏｏｐは、マップリデュースモデルの１つの実施態様であり、コミュニティによって広く用いられている。
【０００３】
マップ関数及びリデュース関数は、ＨａｄｏｏｐではＪａｖａ等の低級言語で記述されるので、それらの言語に精通していない開発者にとっては煩わしく、それらの関数を再利用することが難しい。ＭＲプログラムの表現を簡素化するために、多くのシステムが、Ｈｉｖｅ、Ｐｉｇ、Ｉｍｐａｌａ、及びＰｒｅｓｔｏ等のマップリデュースフレームワーク上で高級言語（例えば、ＳＱＬクエリ）のサポートを提供している。それらのシステムは、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムと呼ばれる。そのようなシステムは、ＳＱＬ型のクエリ（query）をマップリデュースジョブのＤＡＧ（Directed Acyclic Graph：有向非循環グラフ）に変換する。これらのジョブは、その後、Ｈａｄｏｏｐ等のマップリデュースシステムによって１つずつ実行される。
【０００４】
幾つかのＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムは、クエリのバッチ処理を対象にしている。異なるクエリが同様の作業を実行することが多いので、クエリのバッチがシステムによって実行されるとき、多くの冗長な計算が行われる。例えば、複数のＭＲジョブが、同じ入力ファイルを読み出し、データスキャンを共有してＩ／Ｏコストを削減することができる。データスキャンを共有することに加えて、マップ出力及びマップ関数の共有等の異なるジョブ間で他の機会共有もある。このため、複数クエリ最適化のアイデアを適用して、そのようなシステムにおいて冗長な計算を回避することによって複数のジョブの処理を最適化することが有用である。マルチクエリ最適化は、複数のジョブを単一のＭＲジョブにグループ化して、全てのジョブの全体の計算時間を削減することである。
【０００５】
幾つかの既存の研究は、ＭＲジョブのバッチの幾つかの共有技法を提案している。それらの研究は、システムがＭＲジョブのバッチをグループ化することから利得を得ることができるか否かを推定するコストモデルを構築するものである。それらのコストモデルのほぼ全てが、入力スキャン及びマップ出力の共有しか考慮していない。なぜならば、それらのコストモデルは、Ｉ／Ｏコストが総計算時間を支配すると考えるからである。それらのコストモデルは、マップ関数の共有を考慮していなかった。関係演算子のＤＡＧからなるマップ関数が重く、無視することができないＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムでは、マップ関数の共有を考慮しないことによって、モデルは正確でないものとなる。加えて、Ｈｉｖｅにおける複数クエリオプティマイザーが近年提案されている。その研究は、ルールベースの方法を用いて、複数のクエリを、Ｈｉｖｅが実行することができる単一のインサートクエリに書き換える。その研究は、スキャン共有及びマップ関数共有を活用するが、共有するルールが過度に単純である。それらのルールは、同じ結合（join）演算の共有しか考慮せず、そのような共有が常に有益であると考える。
【発明の概要】
【発明が解決しようとする課題】
【０００６】
したがって、本発明は、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおいて処理される複数のクエリを最適化する方法を提供することを目的としている。
【課題を解決するための手段】
【０００７】
ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおける各マップ関数は、幾つかの関係演算子のシーケンスからなるクエリプラン（query plan）全体の一部分であり、幾つかの演算子の順序は交換することができる。この特性に基づいて、提案した方法は、複数のＭＲジョブを最適化する問題を、各グループ内の最適なクエリプランを有するＭＲジョブの最適なグループを見つけることと定義する。ＭＲジョブのバッチの全体の計算時間のコストモデルが、データを読み出し／書き込み／ソートするＩ／Ｏコストと、マップ関数における関係演算子のＤＡＧを処理するＣＰＵコストとの双方を考慮して作成される。各グループ内で最適な統合クエリプランを見つけるために、本方法は、各クエリプランが局所的に最適であるという特徴に基づいて探索空間を削減する幾つかのルールを生成する。次に、貪欲（greedy）アルゴリズムが用いられて、複数のジョブをグループ化する。この場合、より正確なコストモデルを適用することによって、より適したジョブを単一のグループ内に集約することができ、全体の計算時間が削減される。
【０００８】
本明細書において開示される方法は、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステム用に特別に設計された複数クエリ最適化メカニズムである。一般に、クエリのバッチの全体の計算時間を削減するために、入力スキャンの共有、マップ出力の共有、及びマップ関数の共有が考慮され、冗長な計算が回避される。一方、ほぼ全ての既存の研究は、ＣＰＵ節約をもたらすマップ関数共有を考慮することなく、Ｉ／Ｏ節約をもたらすスキャン共有及びマップ出力にしか着目していない。マップ関数は通常、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムでは複雑で重く、それらの研究は効率的でない場合がある。ＳＱＬ−ｏｎ−Ｈａｄｏｏｐにおけるマップ関数は、それらのほとんどが交換可能である関係演算子のシーケンスとして表されるクエリプランの一部分であることを考慮すると、開示した方法は、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐにおける複数クエリ最適化の問題を次のように定義する。すなわち、各マップ関数が、関係演算子のＤＡＧであるマップリデュースジョブの集合が与えられた場合に、それらのジョブを、全てのジョブの全体の計算時間を最小にする各グループ内の最適な統合クエリプランを有するグループに分割せよ。この問題を解くために、開示した方法は、データの読み出し、書き込み、ソート及び転送のＩ／Ｏコストと、マップ関数処理のＣＰＵコストとの双方を考慮に入れた計算時間を推定するコストモデルを作成する。このコストモデルとともに、上記問題の探索空間を削減する２つの発見的アルゴリズムが開示されている。
【０００９】
開示した方法では、複数のＭＲジョブをマージ（merge）するときに準最適な統合クエリプランを見つける発見的アルゴリズムが最初に開示される。単一のＭＲジョブにおける各クエリプランが局所的に最適であるという知見に基づいて、本アルゴリズムは、次の２つのルールを定義する。すなわち、（１）複数のクエリプラン間に共通の演算子がない場合、それらのクエリプランを単純にマージすることによって統合クエリプランが生成される；（２）複数の共通の演算子がある場合、それらの共通の演算子間の順序を維持しつつ、それらの共通の演算子のサブセット又は全てを共有することによって統合クエリプランが生成される。本アルゴリズムは、最初に、マップ関数共有のより多くの機会を提供するようにフィルター演算子を幾つかの独立した演算子に分割し、共通演算子の順序を交換することによって、各クエリプランを変換する。次に、本アルゴリズムは、上記ルールに基づいて、変換から取得されたプランをマージすることによって多くの統合クエリプランを生成する。最後に、本アルゴリズムは、最小実行時間を有する統合クエリプランを選ぶ。
【００１０】
開示した方法では、複数のマップリデュースジョブをグループ化する貪欲アルゴリズムが開示される。本アルゴリズムは、マージされるジョブのグループのペアを、それらのマージする利益に基づいて反復的に選択する。各ジョブは、最初は、単一ジョブグループとみなされる。各反復において、本アルゴリズムは、最大利益を生み出す２つのグループを新たなグループにマージする。この反復は、いずれの２つのグループをマージすることによっても利益がないときに終了する。
【００１１】
本発明のより完全な理解のために、以下の説明及び添付図面が参照される。
【図面の簡単な説明】
【００１２】
【図１】複数のマップリデュースジョブの間の幾つかの機会共有を示す図である。
【図２】ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおけるマップ関数の特殊な共有を示す図である。
【図３】コストモデルにおいて用いられるシンボルの定義を示す図である。
【図４】準最適な統合クエリプランを見つける変換段階及び統合段階を示す図である。
【図５】準最適な統合クエリプランを見つける発見的（heuristic）アルゴリズムを示す論理フロー図である。
【図６】複数のマップリデュースジョブをグループ化する貪欲アルゴリズムを示す論理フロー図である。
【図７】開示した方法を用いて３つのマップリデュースジョブをグループ化する一例を示す図である。
【図８】開示した方法を用いた新たなＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムのアーキテクチャを示すブロック図である。
【発明を実施するための形態】
【００１３】
本発明は、本発明の好ましい実施形態の以下の説明及び図における非常に多くの詳細によってより容易に理解することができる。
【００１４】
機会共有
Ａ．マップリデュースフレームワークにおける機会共有
複数のマップリデュースジョブの中には、冗長な計算を回避することができる多くの機会共有が存在する。本明細書において開示した方法は、次の３種類の共有、すなわち、スキャン共有、マップ出力共有及びマップ関数共有を特定する。そのような機会共有は、他の研究においても利用されている。次に、これらの機会共有を手短に紹介する。
【００１５】
スキャン共有。スキャン共有は、入力ファイルのスキャンの数を削減することによってＩ／Ｏコストを節約することができる。２つのＭＲジョブＪ１及びＪ２が同じ入力を有する場合、それらのＭＲジョブを単一のＭＲジョブＪにグループ化することによって、スキャンを共有することができる。図１における（ａ）は、Ｊ１及びＪ２をマージすることによって、入力ファイルＦ１のスキャンを１回のみとすることができることを示している。ユーザー定義のマップ関数Ｍ１及びＭ２は、マージマッパーにおいて共有ファイル上で呼び出される。マージマッパーでは、２つの出力ストリームが生成されることに留意されたい。これらのストリームを区別するために、リデューサー（reducer）ステージにおいて、各タプル（tuple）には、その起源を示すタグＴｉが追加される。例えば、リデュース関数Ｒ１は、タグＴ１を有するデータを読み出すことができる。
【００１６】
マップ出力共有。スキャン共有に加えて、マップ出力の鍵及び値のタイプがＭＲジョブＪ１及びＪ２の双方について同じである場合、マップ出力も共有することができる。この場合、Ｍ１及びＭ２は、各入力タプルに適用される。Ｍｉのみから得られる出力は、Ｔｉを用いてタグ付けされている一方、Ｍ１及びＭ２の双方から取得される出力は、Ｔ１２を用いてタグ付けされている。したがって、マップ出力の重複部分を共有することができる。マップ出力結果の生成を少なくすることによって、中間データのソート及びネットワークを介した転送に関するオーバーヘッドを省くことができる。
【００１７】
マップ関数共有。２つのマップ関数間で共通の計算を共有することによって、ＣＰＵ節約をもたらすことができる。例えば、Ｍ１及びＭ２は、同一である場合に、１度のみ実行することができる。マップステージの終了時に、２つのストリームが生成され、タグ付けされる。マップ出力も共有される場合、１つのストリームのみを生成する必要がある。場合によっては、全体の関数の一部分しか共有することができない場合がある。例えば、各マップ関数は、データに対して幾つかのフィルターを実行する。例えば、Ｍ１は「ａ＞１０及びｂ＜１００」である一方、Ｍ２は「ａ＞１０」であり、このように、ａに対する述語を共有することができる。
【００１８】
上述した機会共有の中で、スキャン共有及びマップ出力共有は、Ｉ／Ｏ節約をもたらすことができる一方、マップ関数共有は、ＣＰＵ節約をもたらすことができる。関係のある既存の研究のほぼ全ては、読み出し、ソート、転送等に起因したＩ／Ｏコストが通常、全体の計算時間の主要なものであると考える。このため、既存の研究は、それらの研究において、Ｉ／Ｏ節約、換言すれば、スキャン共有及びマップ出力共有にしか着目していない。一方、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムでは、マップ関数は通常、クエリプラン全体のほとんどの部分を実行するので重く複雑である。マップ関数共有は、大きなＣＰＵ節約を生み出すことができ、そのため、Ｉ／Ｏ節約のみを考えることは、そのようなシステムでは効率的でない場合がある。ＳＱＬ−ｏｎ−Ｈａｄｏｏｐにおけるマップ関数共有の詳細は、次のセクションにおいて説明される。したがって、本明細書において開示した方法は、Ｉ／Ｏ節約及びＣＰＵ節約の双方を考慮に入れる。
【００１９】
Ｂ．ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムにおけるマップ関数共有
上述したように、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムは、クエリを、マップリデュースジョブのＤＡＧとして表されたクエリプランに変換し、各マップ関数は、実際には、関係演算子のシーケンスからなるクエリプランの一部分である。マップ関数は通常、複雑で重いので、複数のＭＲジョブの間でそれらのマップ関数を共有することが必要である。幾つかのＭＲジョブが単一のジョブにマージされた場合、マージされたマップ関数の統合クエリプランが生成される。本発明者らの知る限り、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムのマップ関数におけるフィルター演算子、グループ化（group-by）演算子及び場合によってはマップ結合（map-join）演算子等のほとんどの演算子は通常、最終結果を変更することなく互いに交換することができる。この特徴によって、多数の統合クエリプランを生成することができる。このため、最も多くの利益を取得するための最良のものをどのように選ぶのかが問題となる。
【００２０】
図２は、２つのＭＲジョブ間でのマップ関数共有の一例を示している。これらの２つのジョブは、それらのマップ関数において同様の計算を実行する。演算子のシーケンスの下から上に、最初に、フィルター演算子が、同じ入力データに対して異なる述語を適用し、次に、同じマップ結合演算子が、このフィルタリングされたデータに適用され、最後に、この結合されたデータが、同じ鍵に基づいているが異なる関数を用いて部分的にグループ化される。これらの２つのジョブを組み合わせるには、２つのクエリプランを単一のプランに統合しなければならない。この例では、関数の一部分を共有するために、マップ結合演算子とフィルター演算子とを交換することがより望ましい。この場合、マップ結合演算子を共有し、１度だけ実行することができる。もちろん、そのような演算子の共有は、常に有利であるとは限らない場合がある。例えば、少数のタプルしか選択されないことを意味する、２つのフィルター演算子の選択が非常に少ないという場合、最初にフィルターを実行することによって、統合クエリプランの計算時間をより少なくすることが可能である。このため、最小実行時間を有する統合クエリプランをどのように選択するのかが、後のセクションにおいて説明される本質的な問題となる。
【００２１】
コストモデル
Ａ．問題定義
ＳＱＬ−ｏｎ−Ｈａｄｏｏｐにおいて複数のＭＲジョブを最適化する問題は、一般のマップリデュースフレームワークにおける問題と異なる。１つの主な理由は、ＳＱＬ−ｏｎ−Ｈａｄｏｏｐにおけるマップ関数が、関係演算子のシーケンスからなるクエリの全体のクエリプランの一部分であり、それらの順序のうちの幾つかは交換することができるからである。このため、複数のクエリプランを統合することによって新たなクエリプランの多くの候補が存在する。この特性を考慮に入れると、上記問題は以下のように定義される。
各マップ関数が、関係演算子のＤＡＧ｛Ｄ１、Ｄ２，．．．，Ｄｎ｝であるクエリプランの一部分であるマップリデュースジョブの集合｛Ｊ１，Ｊ２，．．．，Ｊｎ｝が与えられた場合に、それらのジョブを、全てのジョブの全体の計算時間を最小にする最適な実行プラン｛Ｄ’１、Ｄ’２，．．．，Ｄ’Ｓ｝を有するＳ個のグループ
【数１】
0006516110.tif 000002
にグループ化せよ。
【００２２】
Ｂ．コストモデル
この問題を解くには、どのジョブのグループが、ジョブを個別に処理するよりも全体の計算時間に最も多くの利益をもたらすことができるのかを知っている必要がある。このため、入力データ及び中間データの双方を読み出し／書き込むＩ／Ｏコストと、マップ関数を実行するＣＰＵコストとの双方を考慮して全体の計算時間を推定するコストモデルが構築される。各シンボルの定義は、図３に示されている。
【００２３】
一般に、マップタスクは、ＨＤＦＳからの入力データの読み出しと、クエリプランの計算と、ローカルディスクへの出力の書き込みと、外部への出力のソートとを含む。このため、マップ時間ＴＭｉは、以下の式（１）のように計算される。
【数２】
0006516110.tif 000003
ここで、クエリプランの計算時間は、先行演算子の出力タプルでもあるこの演算子の入力タプルの数を１つのタプルの処理時間に乗算したものによって推定される各演算子の処理時間を加算することによって計算される。そのような計算は、クエリプランが、１つずつ実行しなければならない演算子のシーケンスであると考えられることから、妥当なものである。ｐＭｉは、マップタスクのソーティングパスの数であり、以下の式（２）の値に等しい。
【数３】
0006516110.tif 000004
【００２４】
リデュースタスクは、ネットワークを通じたマップ出力の転送と、マージされたデータを外部にソートするリデュースサイド（reduce-side）と、ソートされたローカルデータの読み出しとを含む。ここで、本発明者らは、リデュース関数の計算時間と、リデュース出力をディスクに書き込むオーバーヘッドとを考慮しなかった。なぜならば、そのようなオーバーヘッドは、グループ化する場合とグループ化しない場合との双方において同じであるからである。リデュース時間ＴＲｉは、以下の式（３）のように計算される。
【数４】
0006516110.tif 000005
ここで、ｐＲｉは、リデュースタスクのソーティングパスの数であり、以下の式（４）の値に等しい。
【数５】
0006516110.tif 000006
【００２５】
単一のＭＲジョブの処理時間は、以下の式（５）のように、マップ時間及びリデュース時間の合計として計算される。
【数６】
0006516110.tif 000007
ここで、ｐｉは、ｐＭｉとｐＲｉとを加算したものである。
【００２６】
ｎ個のＭＲジョブ｛Ｊ１，．．．，Ｊｎ｝が与えられた場合に、グループ化を伴わない総処理時間
【数７】
0006516110.tif 000008
は、以下の式（６）のように、各ジョブの処理時間を加算したものとして計算される。
【数８】
0006516110.tif 000009
【００２７】
ｎ個のＭＲジョブが単一のジョブＧにグループ化される場合、グループ化されたジョブの処理は、一般のＭＲジョブの処理と同様である。ｎ個のジョブを個別に処理する時間と比較して、グループ化されたジョブの処理は、入力ファイルＦの読み出しを１回しか伴わない。マップ関数においてｎ個のクエリプランを計算することと異なり、グループ化されたジョブの処理は、最適な統合クエリプランＤｏｐｔを処理する。次に、グループ化されたジョブの処理は、Ｇのマップ関数の出力、換言すれば、ｎ個のマップ出力の合計ではないＤｏｐｔの出力をハンドリングする。このため、処理時間ＴＧは、以下の式（７）のように計算される。
【数９】
0006516110.tif 000010
ここで、ｐＧは、以下の式（８）の値ｐＭＧと式（９）の値ｐＲＧとを加算したものである。
【数１０】
0006516110.tif 000011
【数１１】
0006516110.tif 000012
【００２８】
したがって、原問題は、ｎ個のＭＲジョブを、最適なクエリプランＤ’＝｛Ｄ’１、Ｄ’２，．．．，Ｄ’Ｓ｝を有するＳ個のグループ
【数１２】
0006516110.tif 000013
にグループ化することから得られる利得Ｔｇａｉｎを最大にするものになる。利得Ｔｇａｉｎは以下の式（１０）で表され、式（１１）が成立する。
【数１３】
0006516110.tif 000014
【数１４】
0006516110.tif 000015
【００２９】
アルゴリズム
Ａ．最適なクエリプランの発見的アルゴリズム
コストモデルから、グループ化技術を用いた全体の処理時間を得るには、最適な統合クエリプランの計算時間を知ることが必要であることが分かる。最適な統合クエリプランを探求する問題は、以下のように定義される。
ｍ個の統合クエリプランＤ’＝｛Ｄ’１，．．．，Ｄ’ｍ｝を生成するｎ個のクエリプランＤ＝｛Ｄ１，．．．，Ｄｎ｝が与えられた場合に、全てのプランの総計算時間を削減する最適なクエリプランＤｏｐｔ∈Ｄ’を見つけよ。
【００３０】
上述したように、クエリプランを処理するコストＴＤ’ｉは、以下の式（１２）によってシミュレーションされる。
【数１５】
0006516110.tif 000016
【００３１】
このため、この問題は、コストＴＤ’ｉの処理時間を最小にする、以下の式（１３）のような最適なクエリプランＤｏｐｔを見つけるものになる。
【数１６】
0006516110.tif 000017
【００３２】
発見的アルゴリズムは、或る知見に基づいてこの問題を解くのに用いられる。既存のＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムを十分に活用するために、本アルゴリズムは、既に局所的に最適化されたシステムからクエリプランを受信する。このため、各クエリプランが局所的に最適であるという前提に基づいて、複数のクエリプランの統合のための２つのルールが定義される。
・ルール１：複数のクエリプランの間に共通の演算子がない場合には、それらのクエリプランを単純にマージすることによって、統合クエリプランが生成される。ここで、共通の演算子とは、プランの間で共有することができる演算子、すなわち、その出力を複数のプランによって用いることができる演算子を意味する。
・ルール２：複数の共通の演算子がある場合、それらの演算子間の順序を維持しつつ、それらの演算子のサブセット又は全てを共有することによって、統合クエリプランが生成される。
【００３３】
これらの２つのルールに基づいて、本発明者らのアルゴリズムは２つの部分に定義される。第１の部分は、現在のクエリプランを他の等価なクエリプランに変換するクエリプランの変換である。フィルター演算子変換及び形状変換の２種類の変換がある。
【００３４】
フィルター演算子変換。フィルター演算子は、幾つかの述語に基づいてデータのサブセットを選択することである。表の場合、複数の属性のうちの単一の属性に対して、多くの独立した交差述語（intersected predicate）が存在する場合がある。例えば、フィルター演算子は、ｃｏｌ１＞１０及びｃｏｌ２＜４０という２つの述語を有する。この場合、この演算子は、述語ｃｏｌ１＞１０を有するフィルター演算子１と、述語ｃｏｌ２＜４０を有するフィルター演算子２という２つの独立した演算子に変換される。単一の述語を幾つかの述語に分割することもできるが、この作業では、それは考慮されない。このため、ｍ個の述語は、ｍ個の新たなフィルター演算子を生成することができる。
【００３５】
形状変換。各マップ関数は、演算子のツリーを含み、このツリーの形状は、演算子の順序を交換することによって変更することができる。このため、形状変換は、演算子を交換して、マップ関数の作業を共有するより多くの機会を提供することである。最初に、その出力を複数のマップにおける次の演算子が直接用いることのできる共通の演算子が識別されることになる。ＤｉとＤｊとの間の共通の演算子の集合をＣｉｊと表記する（Ｃｉｊ＝Ｃｊｉ）。その後、本アルゴリズムは、ＤｉにおいてＣｉｊと同じ順序を維持しつつ、共通の演算子Ｃｉｊの順序を交換することによって他のクエリプランが変換されるクエリプランに対応するクエリプランＤｉを選択する。あらゆるクエリプランは、ベースクエリプランとして選択される。そのようなプロセスは、図４によって示すことができる。このように、クエリプランＤｉについて、ｎ−１個の変換（ｎはクエリプランの数である）｛Ｄｉ１，．．．，Ｄｉｊ，．．．，Ｄｉｎ｝がある。ここで、Ｄｉｊは、Ｄｊに基づく変換であり、ｊ≠ｉである。その結果、統合されるクエリプランのｎ個の集合Ｓｉ＝｛Ｄｉ，Ｄ１ｉ，．．．，Ｄｊｉ，．．．，Ｄｎｉ｝が得られる。ここで、１≦ｉ≦ｎ及びｊ≠ｉである。
【００３６】
変換後、本アルゴリズムは、次のステップである統合に至る。このステップは、変換段階から取得されたクエリプランの集合を単一のクエリプランに統合する。この統合は、上記で定義した２つのルールに準拠していなければならない。Ｄｉをベースクエリプランとみなすクエリプランの集合Ｓｉの場合、統合クエリプランは、Ｄｉの共通の演算子の数及び順序に依存する。Ｄｉの共通の演算子は、Ｃｉｊの和集合である。ここで、１≦ｊ≦ｎ及びｊ≠ｉである。各Ｃｉｊについて、本アルゴリズムは、サブセット又は全体集合をツリーの下部に移動させ（データは、下部から上部に転送される）、同じことを他のクエリプランの全てに対して行う。例えば、図４において、Ｃ１２＝｛Ｊ，Ｇ｝及びＳ１は、Ｄ１をベースクエリプランとみなす。Ｓ１について、本アルゴリズムは、演算子Ｊ又は演算子｛Ｊ，Ｇ｝をツリーの下部に移動させる。ルール２に基づくと、ＪとＧとの間の順序は維持されるべきであることに留意されたい。その結果、本アルゴリズムは、それに応じて、Ｄ２のクエリプランの形状を調整する。このため、統合クエリプランは、共通でない（uncommon）演算子が現われるまで、共通の演算子を共有することができる。この例では、統合クエリプランの２つの候補が生成される。１つの候補は演算子Ｊのみを共有し、もう１つの候補は双方の演算子｛Ｊ，Ｇ｝を共有する。したがって、Ｓｉの集合について、統合クエリプランのｃｉ個の候補が生成される。ここで、ｃｉは、Ｄｉの共通の演算子の数である。その結果、ｎ×ｃ個の候補が存在する。ここで、ｃは、全てのクエリプランの共通の演算子の平均個数である。加えて、全てのクエリプランを単純に組み合わせることによる統合クエリプランが常に存在する。なぜならば、場合によっては、何も共有しないことが最小のオーバーヘッドを有する場合があるからである。
【００３７】
本アルゴリズムは図５に示されている。入力は、クエリプランの集合Ｄ＝｛Ｄ１，．．．，Ｄｎ｝であり、出力は、計算時間Ｔｍｉｎを有する最適な統合クエリプランＤｏｐｔである。最初に、本アルゴリズムは、クエリプラン間の共通の演算子を見つける。次に、本アルゴリズムは、各クエリプランをベースプランとして選び、次に、他のプランをそれに応じて変換し、統合されるクエリプランのｎ個の集合を得る。この詳細は上記で説明されている。次に、本アルゴリズムは、クエリプランの各集合を統合して、最終の統合クエリプランの候補を生成する。最後に、本アルゴリズムは、全ての候補から、最小の実行時間を有する１つの統合クエリプランを選択し、このクエリプラン及び時間を返す。本アルゴリズムは、Ｏ（ｎｃ）時間で動作する。ここで、ｎはクエリプランの数であり、ｃは共通の演算子の平均個数である。この発見的アルゴリズムを用いると、準最適な解が見つかる。
【００３８】
Ｂ．最適なグループ化のための貪欲アルゴリズム
準最適なクエリプランが生成された後、次のステップは、ＭＲジョブをグループ化することである。最適なグループを見つける処理時間を削減するために、貪欲アルゴリズムが採用され、このアルゴリズムも準最適解のみを見つけることができる。本アルゴリズムは図６に記載されている。入力はｎ個のマップリデュースジョブＪ＝｛Ｊ１，．．．，Ｊｎ｝であり、出力はジョブのグループＧｏｐｔ＝｛Ｇ１，．．．，ＧＳ｝である。本アルゴリズムは、以下のように動作する。
ステップ−１：各ジョブを単一のグループＧｏｐｔ＝｛Ｇ１、Ｇ２，．．．，Ｇｎ｝として開始し；
ステップ−２：グループの各ペアの利得ＴＧｉＧｊ＝ＴＧｉ＋ＴＧｊ−ＴＧｉ∪Ｇｊを計算し、ここで、Ｇｉ，Ｇｊ∈Ｇｏｐｔであり；
ＴＧｉＧｊを計算するために、統合クエリプランが、上記で説明したアルゴリズムに基づいて生成され；
ステップ−３：最大利得Ｔｍａｘ＿ｇａｉｎを生成するグループのペアＧ’＝Ｇｉ∪Ｇｊを見つけ；
ステップ−４：Ｇ’をＧｏｐｔ内に追加し、ＧｏｐｔからＧｉ及びＧｊを削除し；
ステップ−５：Ｔｍａｘ＿ｇａｉｎ＜０になるまで、ステップ−２からステップ−４を繰り返し；
ステップ−６：Ｇｏｐｔを返す。
【００３９】
最初の反復は、最大マージ利益を有するグループのペアを得るのにＯ（ｎ２）を必要とすることに留意されたい。後続の反復は、先行のマージされたグループに新たなグループをマージすることの利益を計算するのにＯ（ｎ）のみで動作する。なぜならば、各反復においては、１つの新たなグループしか生成されないからである。このため、このグループ化するアルゴリズムの時間複雑度はＯ（ｎ２）である。ここで、ｎは、グループ化されるＭＲジョブの数である。
【００４０】
Ｃ．例
複数のクエリをグループ化する例が図７に示されている。チャーン分析からの特徴生成のための３つのクエリがある。各クエリは、異なる述語を有する表ｃｄｒへの集約を実行する。１つの共通の述語は、友人（friend）が削除された（eliminated）表に存在しないということである。この述語は、マップ結合演算によって実行することができる。なぜならば、削除された表は、非常に小さく、この表を全てのマップに分配する方が効率的であるからである。このため、各クエリは、マップ関数が、全ての述語を有するフィルター演算子と、「NOT EXISTS（存在しない）」計算のマップ結合演算子と、部分的なグループ化（group by）演算子とから逐次的に構成されるＭＲジョブに変換される。
【００４１】
本発明者らの方法を用いて、クエリが単一のＭＲジョブにグループ化された場合、図７の右側に示すように、最適な統合クエリプランを取得することができる。そのようなグループ化を用いると、多くの冗長な計算を省くことができる。第１に、３つのマップ関数は同じ表ｃｄｒを読み出すので、この表のスキャンは１度しか行われない。第２に、統合クエリプランは、２つの共通の演算子と、「type in ('SMS', 'VOICE')」という共通の述語を有するフィルター演算子と、マップ結合演算子とを共有することができる。最後に、２つのグループ化演算子の結果は、最初のＭＲジョブのリデュース関数によって共有することができる。Ｑ２のマップ出力は、これらのデータをＲ１及びＲ２の双方が用いることができることを意味するＴ１２を用いてタグ付けされる一方、Ｑ３のマップ出力は、Ｔ１３を用いてタグ付けされる。Ｑ１のマップ出力は、実際には、Ｑ２及びＱ３のマップ出力を組み合わせたものであり、このため、この出力を２回生成する必要はない。
【００４２】
アーキテクチャ
本発明者らの方法を有するＳＱＬ−ｏｎ−Ｈａｄｏｏｐシステムのアーキテクチャが図８に示されている。クエリのバッチがシステムに発行され、マルチクエリ受信機８１によってキャッシュされる。ＳＱＬパーサー８２が、マルチクエリ受信機８１とクエリプランナー８３との間に接続されている。次に、クエリは、クエリプランナー８３と、既存のシステムからのクエリオプティマイザー８４とによって複数のＭＲジョブのＤＡＧに変換及び最適化される。全てのクエリが変換及び最適化された後、それらのクエリからの全てのＭＲジョブは、複数クエリオプティマイザー８５に送信される。この複数クエリオプティマイザーは、まず、本発明者らのモデルに基づいて、マップリデュースジョブグループ化８６によってそれらのＭＲジョブをグループに分割し、次に、マルチクエリプランジェネレーター８７によってクエリプランを再生成する。本発明者らの複数クエリオプティマイザーが受信したＭＲジョブは最適化されるので、実際にクエリプランの一部分であるマップ関数は、局所的に最適であるとみなされる。このため、最適なクエリプランを見つけるという本アルゴリズムの本発明者らの前提は正しい。最後に、新たなクエリプランは、クエリ実行器（例えば、Ｈａｄｏｏｐ）８８によって実行され、結果はクライアントに返される。
【００４３】
開示した方法は、マップリデュースジョブグループ化モジュールにおいて実施される。最初に、コストモデルがシステムに登録される。このコストモデルを他のコストモデルに取り替えることは容易である。次に、このモジュールは、本明細書に開示したアルゴリズムを用いて、ジョブをグループに分割し、それらのジョブを、マージされたジョブごとの最適な統合クエリプランを用いて幾つかのジョブにマージする。その結果、幾つかの演算子は、２つ以上の後続の演算子が共有することができ、これは、複数クエリ最適化を有しないクエリプランとは異なっている。
【図１】
0006516110.tif 000018
【図２】
0006516110.tif 000019
【図３】
0006516110.tif 000020
【図４】
0006516110.tif 000021
【図５】
0006516110.tif 000022
【図６】
0006516110.tif 000023
【図７】
0006516110.tif 000024
【図８】
0006516110.tif 000025