ここでは、MaxCompute で使用できる MapReduce プログラミングインターフェイスとその制限について説明します。

MaxCompute が提供する MapReduce プログラミングインターフェイスには、次の 3 つのバージョンがあります。
  • MaxCompute MapReduce: MaxCompute のネイティブインターフェイスで、他のインターフェイスよりも高速です。 ファイルシステムを公開せずにプログラムを開発するのに便利です。

  • MR2 (拡張 MapReduce): より複雑なジョブスケジューリングロジックに対応した MaxCompute の拡張版インターフェイスです。 MapReduce は、MaxCompute ネイティブインターフェイスと同じ方法で実装します。

  • Hadoop 互換バージョン : Hadoop MapReduce との高い互換性を備えていますが、MaxCompute ネイティブインターフェイスや MR2 との互換性はありません。

上記 3 つのバージョンは、 基本概念ジョブ送信入出力リソースの点で基本的に同じですが、唯一の違いは Java SDK です。 ここでは、MapReduce の原理を説明します。 MapReduce の詳細については、Hadoop MapReduce をご参照ください。
現時点で、MapReduce を使って外部テーブルのデータを読み書きすることはできません。

シナリオ

当初、MapReduce は分散データ処理モデルとして Google によって提案されました。現在は複数のビジネスシナリオで広く採用されています。 以下はその例です。
  • 検索:Web のクロール、フリップインデックス、PageRank。
  • Web アクセスログ分析
    • 個人向けの情報を提供するために、Web アクセスや買い物行動の特性の分析とマイニングを行います。
    • ユーザーのアクセス行動の分析
  • テキストの統計と分析
    • Mo Yan の小説のワードカウントと TFIDF 分析
    • 学術論文および特許文書の参照分析と統計
    • ウィキペディアのデータ分析など
  • 大規模データマイニング: 非構造化データ、時空間データ、画像データマイニング
  • 機械学習: 教師あり学習、教師なし学習、決定木や SVM などの分類アルゴリズム
  • 自然言語処理:
    • ビッグデータに基づくトレーニングと予測
    • 現在の単語のマトリックス、頻繁なアイテムセットのデータマイニング、繰り返しのドキュメント検出などを構築するためのコーパスに基づきます。
  • 広告の推奨事項: ユーザークリック (CTR) と購買行動 (CVR) の予測

データ処理

MapReduce のデータ処理は、Map と Reduce の 2 段階に分けられます。 最初に Map を実行してから Reduce を実行する必要があります。 Map と Reduce の処理ロジックはユーザーが定義しますが、MapReduce フレームワークのプロトコルに準拠する必要があります。 プロセスは次のとおりです。
  1. Map を実行する前に、入力データをスライスする必要があります。つまり、入力データを同じサイズのブロックに分割します。 各ブロックは単一の Map Worker の入力データとして処理されるため、複数の Map Worker が同時に処理を実行できます。
  2. スライスが分割された後、複数の Map Worker が同時に処理を行えます。 各 Map Worker は、データの読み取り後、計算を実行し、結果を Reduce に出力します。 Map Worker がデータを出力するには、出力レコードごとにキーを指定する必要があります。 このキー値によって、どの Reduce Worker にデータが送信されたのかが分かります。 キー値と Reduce Worker の関係は、多対 1 です。 同じキーを持つデータは同じ Reduce Worker に送信されるため、1 つの Reduce Worker が複数のキー値データを受け取ることがあります。
  3. Reduce 段階の前に、MapReduce フレームワークではキー値に従ってデータがソートされ、同じキー値を持つデータがグループ化されます。 Combiner を指定した場合、フレームワークでは Combiner が呼び出されて、同じキーデータが集約されます。 ユーザーは Combiner のロジックを定義する必要があります。 従来の MapReduce フレームワークとは異なり、Combiner と MaxCompute の Reduce の入力パラメーターと出力パラメーターは、一致している必要があります。 この処理は一般的にシャッフルと呼ばれます。
  4. Reduce 段階では、同じキーを持つデータが同じ Reduce Worker によってシャッフルされます。 Reduce Worker は、複数の Map Worker からデータを受け取ります。 各 Reduce Worker は、同じキーを持つ複数のレコードに対して Reduce 操作を実行します。 その後、Reduce 処理によって、これらの複数レコードから値が求められます。
MapReduce フレームワークの簡単な説明は、前述のプロセスで述べました。 詳細は、関連ドキュメントをご参照ください。

次の例では、WordCount を使用して MaxCompute MapReduce の処理段階について説明します。

'a.txt' という名前のテキストがあり、各行が数字で示されています。それぞれの数字の出現回数を数える必要があるとします。 テキスト内の数字は 'Word' と呼ばれ、数字の出現回数は 'Count' と呼ばれます。 MaxCompute MapReduce によるこの機能の実行順序を下図に示します。
実行順序:
  1. まず、テキストがスライスされ、データがスライスごとに単一の Map Worker に入力されます。
  2. Map Worker により入力が処理されます。 Map Worker で数値が取得されると、Count が 1 に設定されます。 次に、<Word,Count> キューが出力されます。 出力データのキーとして 'Word' が取得されます。
  3. Shuffle 段階の初期操作では、Map Worker の出力がキー値 (Wordの値) に従ってソートされます。 ソート後に結合操作が実行され、同じキー値の Count(Word 値)が累積され、新しい <Word,Count> キューが構成されます。 このプロセスはマージソートと呼ばれます。
  4. Shuffle の後半操作では、データが Reduce に送信されます。 データを受信した後、Reduce Worker はキー値に基づいてデータを再度ソートします。
  5. データの処理中、各 Reduce Worker によって Combiner と同じロジックで同じキー値 (Word 値) を持つ Count が累積され、出力値が取得されます。
  6. 結果が出力されます。
MaxCompute 内のデータはテーブルに格納されるため、MaxCompute MapReduce の入力と出力はテーブルでなければなりません。 出力をユーザー定義することはできません。また、対応するファイルシステムインターフェイスはありません。