並列化コントラクトまたはPACTプログラミングモデルは、MapReduce プログラミング モデルを一般化したものであって、2 次関数を使用して大規模な (ペタバイト) データ セット に対して並列に同時計算を実行します。
概要
MapReduce と同様に、任意のユーザー コードは PACT によって渡され、実行されます。ただし、PACT は MapReduce のいくつかの概念を一般化します。
- 2 次関数: PACT は、より多くの 2 次関数を提供します。現在、入力コントラクトと呼ばれる 5 つの 2 次関数がサポートされています。このセットは将来拡張される可能性があります。
- プログラム構造: PACT では、任意の非循環データ フロー グラフを作成できます。対照的に、MapReduce プログラムは静的な構造 (Map -> Reduce) を持ちます。
- データ モデル: PACT のデータ モデルは、任意のタイプの任意の数のフィールドのレコードです。MapReduce の KeyValue ペアは、2 つのフィールドを持つレコードと見なすことができます。
オープンソースの並列データ処理プラットフォームであるApache Flink はPACTを実装しています。Flink では、ユーザーがアノテーションを使用してユーザー関数を指定できます。
論理ビュー
並列化コントラクト (PACT) は、データ フロー内のデータ処理演算子です。したがって、PACT には 1 つ以上のデータ入力と 1 つ以上の出力があります。PACT は 2 つのコンポーネントで構成されます。
- 入力契約
- ユーザー機能
- ユーザーコード注釈
以下の図は、これらのコンポーネントがどのように連携するかを示しています。入力コントラクトは、入力データを独立して処理可能なサブセットに分割します。ユーザー コードは、これらの独立したサブセットごとに呼び出されます。サブセットは独立しているため、すべての呼び出しを並列に実行できます。
オプションで、ユーザー コードに追加情報を注釈として付けることができます。これらの注釈は、ブラック ボックス ユーザー関数の動作に関する情報を公開します。PACT コンパイラーは、この情報を利用して、より効率的な実行プランを取得できます。ただし、注釈がなくても実行結果は変わりませんが、出力コントラクトが間違っていると、間違った結果が生成されます。
現在サポートされている入力コントラクトと注釈については、以下で紹介し、説明します。
入力契約
入力コントラクトは、PACT の入力データを、PACT のユーザー関数に渡される独立して処理可能なサブセットに分割します。入力コントラクトは、データ入力の数と独立したサブセットの生成方法が異なります。
より正式には、入力コントラクトは、1 次関数 (ユーザー コード)、1 つ以上の入力セット、および入力ごとに 0 個以上のキー フィールドをパラメーターとして持つ 2 次関数です。1 次関数は、入力セットのサブセットを使用して (1 回または) 複数回呼び出されます。1 次関数には副作用がないため、各呼び出しは互いに独立しており、すべての呼び出しを並列に実行できます。
MapReduce プログラミング モデルの2 次関数map()とReduce()は、PACT プログラミング モデルのコンテキストにおける入力契約です。
地図
マップ入力コントラクトは MapReduce と同じように動作します。単一の入力があり、各入力レコードを独自のサブセットに割り当てます。したがって、すべてのレコードは互いに独立して処理されます。
減らす
Reduce 入力コントラクトは、MapReduce の Reduce 関数と同じセマンティクスを持ちます。単一の入力があり、同一のキー フィールドを持つすべてのレコードをグループ化します。これらの各グループは、全体としてユーザー コードに渡され、処理されます (下の図を参照)。PACT プログラミング モデルは、部分的な集約など、オプションの Combiner もサポートします。
クロス
クロス入力コントラクトは 2 つの入力で動作します。両方の入力のレコードの直積を構築します。直積の各要素 (レコードのペア) はユーザー コードに渡されます。
マッチ
マッチ入力コントラクトは、2 つの入力に対して機能します。両方の入力から、異なる入力からのキー フィールドが同一のレコードを一致させます。したがって、これは、両方の入力のキーが結合する属性である等価結合に似ています。一致したレコードの各ペアは、ユーザー コードに渡されます。
共同グループ
CoGroup 入力コントラクトも 2 つの入力で機能します。これは、2 つの入力に対する Reduce として考えることができます。各入力で、レコードはキーによってグループ化され (Reduce と同様に)、ユーザー コードに渡されます。Match とは対照的に、1 つの入力のみがキーとペアになっている場合、ユーザー コードもキーに対して呼び出されます。
契約記録データモデル
MapReduce とは対照的に、PACT はより汎用的なレコードのデータ モデル (Pact Record) を使用して関数間でデータを渡します。Pact Record は、フリー スキーマのタプルと考えることができます。レコードのフィールドの解釈は、ユーザー関数によって決まります。キー/値ペア (MapReduce の場合) は、2 つのフィールド (キーと値) のみを持つレコードの特殊なケースです。
キーを操作する入力コントラクト (//Reduce//、//Match//、//CoGroup// など) の場合、レコードのフィールドのどの組み合わせがキーを構成するかを指定します。任意のフィールドの組み合わせを使用できます。1 つ以上のフィールドで //Reduce// および //Match// コントラクトを定義するプログラムと、フィールド間でデータを最小限に移動するように記述する方法については、クエリ例を参照してください。
レコードはまばらに入力される可能性があります。つまり、//null// 値を持つフィールドがある可能性があります。たとえば、フィールド 2 と 5 のみが設定されているレコードを生成することは可能です。フィールド 1、3、4 は //null// と解釈されます。ただし、コントラクトによってキー フィールドとして使用されるフィールドは null であってはなりません。そうでない場合は例外が発生します。
ユーザーコード注釈
ユーザー コード アノテーションは、PACT プログラミング モデルではオプションです。開発者は、ユーザー コードの特定の動作をオプティマイザーに明示的に指定できます。PACT オプティマイザーはその情報を利用して、より効率的な実行プランを取得できます。ただし、有効なアノテーションがユーザー コードに添付されていない場合、結果の正確性には影響しません。一方、無効なアノテーションが指定されると、計算結果が誤ってしまう可能性があります。以下に、現在使用可能な出力コントラクトのセットを示します。
定数フィールド
定数フィールド注釈は、ユーザー コード関数によって変更されないフィールドをマークします。すべての入力レコードについて、定数フィールドは出力レコード内のコンテンツと位置を変更しないことに注意してください。Cross、Match、CoGroup などのバイナリ 2 次関数の場合、ユーザーは入力ごとに 1 つの注釈を指定できます。
定数フィールドを除く
Constant Fields Exceptアノテーションは Constant Fields アノテーションの逆です。アノテーションが付けられたユーザー関数によって変更される可能性のあるすべてのフィールドにアノテーションを付けるため、オプティマイザーはアノテーションが付けられていないフィールドを定数と見なします。このアノテーションは慎重に使用する必要があります。また、バイナリ 2 次関数 (Cross、Match、CoGroup) の場合、入力ごとに 1 つのアノテーションを定義できます。入力には Constant Fields アノテーションまたは Constant Fields Except アノテーションのいずれかを使用できることに注意してください。
PACTプログラム
PACT プログラムは、データ ソース、PACT、およびデータ シンクで構成されるデータ フロー グラフとして構築されます。1 つ以上のデータ ソースが入力データを含むファイルを読み取り、それらのファイルからレコードを生成します。それらのレコードは、それぞれ入力コントラクト、ユーザー コード、およびオプションのコード注釈で構成される 1 つ以上の PACT によって処理されます。最後に、結果は 1 つ以上のデータ シンクによって出力ファイルに書き戻されます。MapReduce プログラミング モデルとは対照的に、PACT プログラムは任意の複雑さを持つことができ、固定構造はありません。
下の図は、2 つのデータ ソース、4 つの PACT、および 1 つのデータ シンクを持つ PACT プログラムを示しています。各データ ソースは、ファイル システム内の指定された場所からデータを読み取ります。両方のソースは、Map Input Contracts を使用して、それぞれの PACT にデータを転送します。ユーザー コードは図に示されていません。両方の Map PACT の出力は、Match Input Contracts を使用して PACT にストリームされます。最後の PACT には Reduce Input Contracts があり、その結果をデータ シンクに転送します。
Wiki:pactProgram.png?nolink&600
MapReduce に対する PACT の利点
- PACT プログラミング モデルは、よりモジュール化されたプログラミング スタイルを推奨します。ユーザー関数の数は一般的に多くなりますが、より細分化され、特定の問題に焦点が当てられます。そのため、MapReduce ジョブでよくある機能の混在を回避できます。
- 特に複数の入力が必要な場合、データ分析タスクは単純なデータ フローとして表現できます。
- PACT にはレコードベースのデータ モデルがあり、すべてのデータ項目を単一の値タイプにまとめる必要がないため、カスタム データ型を指定する必要性が軽減されます。
- PACT は、並列プログラミング モデルを「破壊」する分散キャッシュなどの補助構造の必要性を頻繁に排除します。
- デカルト積の構築や、同じキーを持つレコードの結合などのデータ編成操作は、ランタイム システムによって実行されます。MapReduce では、このような頻繁に必要となる機能は、ユーザー コードの開発者が提供する必要があります。
- PACT は、システムにいくつかの自由度を残す宣言的な方法でデータの並列化を指定します。これらの自由度は、自動最適化の重要な前提条件です。PACT コンパイラは、さまざまな実行戦略を列挙し、送信するデータの推定量が最も少ない戦略を選択します。対照的に、Hadoop は MapReduce ジョブを常に同じ戦略で実行します。
MapReduce と PACT プログラミング モデルのより詳細な比較については、弊社の論文 //「MapReduce と PACT - データ並列プログラミング モデルの比較」// (弊社のページを参照) をお読みください。
参考文献
- 「Nephele/PACTs: Web スケールの分析処理のためのプログラミング モデルと実行フレームワーク」—TU Berlin の D. Battré、S. Ewen、F. Hueske、O. Kao、V. Markl、および D. Warneke による論文で、Proc. of ACM SoCC 2010 に掲載されています。この論文では、Stratosphere 研究プロジェクトで開発された、MapReduce の一般化である PACT プログラミング モデルを紹介しています。
- 「MapReduce と PACT - データ並列プログラミング モデルの比較」—TU Berlin の A. Alexandrov、S. Ewen、M. Heimel、F. Hueske、O. Kao、V. Markl、E. Nijkamp、D. Warneke による論文で、Proc. of BTW 2011 に掲載されました。
さらに読む
- Kepler 科学ワークフロー システムにおける分散データ並列実行のフレームワーク
外部リンク
- 成層圏プロジェクトのホームページ
- 成層圏スライドプレゼンテーション
- ビデオ講義 並列データフロープログラミング
