データベース内でのマップ・リデュース -...

15
Oracleホワイト・ペーパー 200910データベース内でのマップ・リデュース

Upload: others

Post on 20-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Oracleホワイト・ペーパー

2009年10月

データベース内でのマップ・リデュース

データベース内でのマップ・リデュース

はじめに .............................................................................................................................. 2

方法論 ................................................................................................................................. 3

ステップ・バイ・ステップの例 ......................................................................................... 4

ステップ1 - 環境設定 .................................................................................................... 4

ステップ2 - マッパーの作成 ...................................................................................... 6

ステップ3 - シンプルなマッパー使用法 ....................................................................... 7

ステップ4 - リデューサーの作成 .................................................................................. 7

ステップ5 - データベース内でのマップ・リデュース ................................................. 9

まとめ ............................................................................................................................... 10

付録1 - パッケージ・ヘッダー .......................................................................................... 11

付録2 - パッケージ・ボディ ............................................................................................ 12

データベース内でのマップ・リデュース

2

はじめに

マップ・リデュース・モデルは、パラレル・プログラムの記述と実装において一般的な手法になり

ました。多くの場合、このようなカスタムのマップ・リデュース・プログラムは大量データセット

をパラレル処理するために使用されます。このホワイト・ペーパーでは、パラレル・パイプライン・

テーブル・ファンクションとパラレル処理を使用して、Oracleデータベース内でマップ・リデュース・

プログラムを実装する方法について説明します。

データベース内でのマップ・リデュース

3

方法論

パイプライン・テーブル・ファンクションは、データ・フロー内に手続き型ロジックを埋め込む手

段として、Oracle9iで導入されました。論理的には、テーブル・ファンクションはFROM句に挿入で

きるファンクションであり、行ストリームを返す表として機能します。また、テーブル・ファンク

ションの入力に行ストリームを指定することもできます。パイプライン・テーブル・ファンクショ

ンはデータ・フロー内に埋め込まれているため、データがSQL文に対して'ストリーミング'されるこ

とで、ほとんどのケースで中間的なマテリアライズが回避されます。また、パイプライン・テーブ

ル・ファンクションをパラレル化することもできます。

テーブル・ファンクションをパラレル化するには、入力データを再分割するためのキーを指定しま

す。テーブル・ファンクションはPL/SQL、Java、Cでネイティブ実装できます。テーブル・ファンク

ションに関する例と詳細情報について、また上述の使用法について、詳しくは次のURLを参照して

ください。

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/08_subs.htm#19677

パイプライン・テーブル・ファンクションは複数のリリースにわたって顧客に使用されてきた機能

であり、Oracleデータベースの拡張性インフラストラクチャの中核をなしています。外部ユーザーと

Oracle Developmentの両方で、テーブル・ファンクションは簡単かつ効率的にデータベース・カーネ

ルを拡張する手段として使用されてきました。

Oracleデータベースでテーブル・ファンクションが使用されている例として、Oracle SpatialやOracle

Warehouse Builderに実装されている多数の機能があります。Oracle Spatialでの使用法には、空間結合

や空間データのマイニング処理が含まれます。またOracle Warehouse Builderでは、Match-Mergeアル

ゴリズムやその他の列単位処理アルゴリズムなどのデータ・フローにおいて、エンドユーザーがテー

ブル・ファンクションを利用して手続き型ロジックをパラレル化できます。

データベース内でのマップ・リデュース

4

ステップ・バイ・ステップの例

パラレル化の使用法と、マップ・リデュース・アルゴリズムをOracleデータベース内に記述するため

のパイプライン・テーブル・ファンクションの使用法について説明するため、ここでは標準的なマッ

プ・リデュース例であるワード・カウントの実装方法について説明します。ワード・カウントにな

じみのない読者のために説明すると、このプログラムは一連のドキュメントからすべての異なる単

語を抜き出し、この単語がドキュメント内で何回使用されているかという回数と一緒に返します。

このワード・カウント例における手続き型コードはPL/SQLで実装されていますが、上述のとおり、

好みの言語を使用することもできます。

ステップ1 - 環境設定

ここで対象とする一連のドキュメントは、データベースの外部ファイルか、データベース内のSecure

Files/CLOB列のいずれかになります。この表内にドキュメントは保管され、実質的にファイル・シス

テムを反映します。

ここでは、次の定義を使用してデータベース内に表を作成します。

この表に含まれるそれぞれの行が、1つのドキュメントに相当します。ここでは、この表に非常に単

純なデータを挿入して、次のテキストを含む3つのドキュメントを生成します。

マップ・ファンクションとリデュース・テーブル・ファンクションの両方の結果がパッケージ内で

維持され、コードは整然とした形のままになります。実行する手順を示すため、パッケージ全体か

ら取得したスニペットを次の項に示します。実際のパッケージに含まれる一連の型が、このコード

を実行するために必要となります。すべてのコードは、Oracle Database 11g(11.1.0.6)を使用してテ

ストされました。次の図に、配置するパッケージを示します。

データベース内でのマップ・リデュース

5

図1 パッケージ・ヘッダーの作成

図2 パッケージ・ボディの作成

データベース内でのマップ・リデュース

6

ステップ2 - マッパーの作成

はじめに、ドキュメントを"マップ"(マップ・リデュースの場合)またはトークン化する汎用ファン

クションを作成する必要があります。ここでの目的は、優れたマップ・ファンクションを示すこと

ではなく、データベース内での基本的な動きを示すことである点に注意してください。ここで示す

マップ・ファンクションは非常に基本的なものであり、より優れた実装例が他に見つかる可能性が

あります。異なる表を使用する場合、次のコード内の必要個所をすべて置換してください。

データベース内でのマップ・リデュース

7

ステップ3 - シンプルなマッパー使用法

ここまでで、データベース内にマッパーが作成されたため、次にこれを使用します(注:select文を

実行する前に、付録1および2に示したパッケージを作成してください)。次の文を実行すると、ド

キュメント表内のすべてのドキュメントに含まれる単語の全リストと、それぞれの使用回数が返さ

れます。この文では、回数を数えるためにOracleの集計エンジンが使用されています。マップ・リ

デュースでは、Oracleエンジンを使用せずに、独自の集計機能(リデューサー)を作成します。

出力結果は、次のとおりです。

図3 マップ・ファンクションを使用した単語および回数のリスト

ステップ4 - リデューサーの作成

言うまでもありませんが、独自の集計テーブル・ファンクションを作成してドキュメント内の単語

の使用回数を数えることができます。前項のようにOracle集計エンジンを利用するのではなく、マッ

プ・リデュース・プログラムを作成する場合がこれに当たります。この集計テーブル・ファンクショ

ンがマップ・リデュース・プログラム・ユニットのリデューサーになります。

このテーブル・ファンクションでは、入力データを単語で区切って、(Oracle実行エンジンのソート

機能を使用するために)そのデータを単語ごとに並べ替え、またはグループ化するよう指定されて

います。この例を完成させるため、サンプルのカウント・プログラムを次に示します。

データベース内でのマップ・リデュース

8

データベース内でのマップ・リデュース

9

ステップ5 - データベース内でのマップ・リデュース

これで、完全なマップ・リデュース・プログラムが完成しました。テーブル・ファンクションを使

用する問合せを実行すると、外部ドキュメントに対するパラレル・ワークロードが返され、典型的

なマップ・リデュース・プログラムの役割を果たします。

図4 カスタム・テーブル・ファンクションの出力結果

一連の簡単な手順で示されたとおり、Oracleデータベース内でのマップ・リデュース・プログラムの

作成は非常に分かりやすい作業です。テーブル・ファンクションを使用することで、またあらゆる

種類のロジックをパラレル処理するテーブル・ファンクションの機能によって、データとパラレル

処理に対する使いやすいインタフェースが提供されます。

データベース内でのマップ・リデュース

10

まとめ

Oracleテーブル・ファンクションは、オラクル内外の多数のグループによってOracle Database 11gを

拡張するために使用されてきた、実績あるテクノロジーです。

Oracleテーブル・ファンクションはOracleデータベース内でマップ・リデュースを実装するための堅

牢かつスケーラブルな手段であり、Oracle Parallel Executionフレームワークのスケーラビリティを活

用しています。テーブル・ファンクションをSQLと組み合わせて使用すると、データベース開発者が

よく知っている言語を使用して、精通した環境内でマップ・リデュース機能を開発するための効率

的で簡単な仕組みが提供されます。

データベース内でのマップ・リデュース

11

付録1 - パッケージ・ヘッダー

次に、前述のパッケージ・ヘッダーを示します。

データベース内でのマップ・リデュース

12

付録2 - パッケージ・ボディ

次のコードは、この例で使用されたパッケージ・ボディです(2ページにわたって記載されています)。

データベース内でのマップ・リデュース

13

ホワイト・ペーパー・タイトル

データベース内でのマップ・リデュース

2009年10月

著者:Shrikanth Shankar、

Jean-Pierre Dijcks

Oracle Corporation

World Headquarters

500 Oracle Parkway

Redwood Shores, CA 94065

U.S.A.

海外からのお問い合わせ窓口:

電話:+1.650.506.7000

ファクシミリ:+1.650.506.7200

oracle.com

Copyright © 2009, Oracle and/or its affiliates. All rights reserved.

本文書は情報提供のみを目的として提供されており、ここに記載される内容は予告なく変更されることがあります。本文書は一

切間違いがないことを保証するものではなく、さらに、口述による明示または法律による黙示を問わず、特定の目的に対する商

品性もしくは適合性についての黙示的な保証を含み、いかなる他の保証や条件も提供するものではありません。オラクルは本文

書に関するいかなる法的責任も明確に否認し、本文書によって直接的または間接的に確立される契約義務はないものとします。

本文書はオラクル社の書面による許可を前もって得ることなく、いかなる目的のためにも、電子または印刷を含むいかなる形式

や手段によっても再作成または送信することはできません。

Oracleは米国Oracle Corporationおよびその子会社、関連会社の登録商標です。その他の名称はそれぞれの会社の商標です。

0109