MapReduce

大規模データを Map (分割 / 変換) と Reduce (集約) の 2 段階で並列処理する分散処理モデル

分散システムデータ分析

MapReduce とは

MapReduce は、Google の Jeffrey Dean と Sanjay Ghemawat が 2004 年の論文「MapReduce: Simplified Data Processing on Large Clusters」(OSDI 2004) で発表した分散処理モデルである。大規模データを Map (分割・変換) と Reduce (集約) の 2 段階で並列処理する。開発者は Map 関数と Reduce 関数だけを記述すれば、データの分散、並列実行、障害復旧はフレームワークが自動的に処理する。

Hadoop の基盤技術として広く普及し、ビッグデータ処理の基礎概念として定着した。名前と発想の出どころは Lisp などの関数型言語が備える mapreduce のプリミティブで、原典自身がその点を明記している。

動作の流れ

MapReduce は大量データを複数のチャンクに分割し、Map フェーズで各チャンクを並列処理してキーと値のペアを出力する。Shuffle フェーズで同じキーのデータをグループ化し、Reduce フェーズでグループごとに集約処理を行う。

入力データ (テラバイト級)
    ↓ 分割
[チャンク1] [チャンク2] [チャンク3] ...
    ↓ Map (並列実行)
[(k1,v1), (k2,v2)] [(k1,v3), (k3,v4)] [(k2,v5)] ...
    ↓ Shuffle (同じキーをグループ化)
[k1: [v1,v3]] [k2: [v2,v5]] [k3: [v4]]
    ↓ Reduce (並列実行)
[k1: result1] [k2: result2] [k3: result3]

ワードカウントの例

入力: "hello world hello foo world hello"

Map フェーズ (各ワーカーが並列実行):
  ワーカー1: "hello world hello" → ("hello",1), ("world",1), ("hello",1)
  ワーカー2: "foo world hello"   → ("foo",1), ("world",1), ("hello",1)

Shuffle フェーズ:
  ("hello", [1,1,1]), ("world", [1,1]), ("foo", [1])

Reduce フェーズ (各キーを並列集約):
  ("hello", 3), ("world", 2), ("foo", 1)

MapReduce が解決した問題

2004 年以前、大規模データの分散処理は以下の課題を開発者が個別に解決する必要があった。

  • データの分割と各ノードへの配布
  • 並列実行の制御とスケジューリング
  • ノード障害時のリトライと復旧
  • 中間結果のシャッフルとソート
  • 結果の集約

MapReduce はこれらを抽象化し、開発者は「各レコードに何をするか (Map)」と「グループ化された結果をどう集約するか (Reduce)」だけを記述すればよくなった。

現代での位置づけ

MapReduce は革新的だったが、以下の制約から、2026 年時点の新規案件では Apache Spark や Flink が選ばれることが多い。

観点MapReduce (Hadoop)Apache Spark
処理モデルバッチのみバッチ + ストリーミング
中間データディスクに書き出しインメモリ処理
速度ディスク I/O がボトルネックになりやすい反復処理ほど差が開く
プログラミングMap/Reduce の 2 段階に制約SQL、DataFrame、柔軟な DAG
反復処理苦手 (毎回ディスクから読み直し)得意 (メモリにキャッシュ)

MapReduce の最大の弱点は、各フェーズの中間結果をディスクに書き出すことだ。機械学習のように同じデータを何度も反復処理するワークロードでは、毎回ディスクから読み直すオーバーヘッドが致命的になる。Spark はデータをメモリに保持するため、反復処理では差が大きく開く。

「Spark は MapReduce の 100 倍速い」といった倍率が語られることがあるが、これは反復処理を含む特定のベンチマークで測られた数値で、1 パスで終わる単純な集計では差が小さいこともある。倍率を前提に設計せず、自分のワークロードで測るのが確実である。

AWS での MapReduce

AWS では Amazon EMR (かつての Elastic MapReduce) が Hadoop / Spark のマネージドサービスを提供している。ただし、クラスタを自分で設計・運用する必要がないなら、次の選択肢の方が扱いやすいことが多い。

  • Athena: S3 上のデータに SQL でクエリ (MapReduce の集計処理を SQL で代替)
  • Glue: ETL ジョブを Spark ベースで実行 (サーバーレス)
  • EMR Serverless: Spark と Hive のジョブをクラスタ構成なしで実行
  • Lambda + Step Functions: 小〜中規模のデータ処理を並列実行

判断の分かれ目はクラスタを使い切れるかどうかである。ジョブが断続的なら、待機時間も課金されるクラスタは無駄が大きい。逆に一日中ジョブが詰まっている状態なら、クラスタ型の方が処理単価で有利になる。

JavaScript の map/reduce との関係

JavaScript の Array.prototype.map()Array.prototype.reduce() は、MapReduce と同じ概念をシングルマシンで実行するものだ。

const orders = [
  { category: 'books', amount: 1500 },
  { category: 'electronics', amount: 30000 },
  { category: 'books', amount: 2000 },
];

// Map: 各要素を変換
const mapped = orders.map(o => ({ key: o.category, value: o.amount }));

// Reduce: 集約
const totals = orders.reduce((acc, o) => {
  acc[o.category] = (acc[o.category] || 0) + o.amount;
  return acc;
}, {} as Record<string, number>);
// { books: 3500, electronics: 30000 }

実務での活用方法は関連書籍にも詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事