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 などの関数型言語が備える map と reduce のプリミティブで、原典自身がその点を明記している。
動作の流れ
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 }
実務での活用方法は関連書籍にも詳しい。
この記事は役に立ちましたか?
関連用語
関連する記事
データベース本ガイド - SQL から設計まで学べる技術書の選び方
データベースの基礎から設計、パフォーマンスチューニングまで学べる技術書の選び方と学習順序を紹介します。
ゼロから作る Deep Learning シリーズの読む順番 - 全 6 巻の内容と選び方を整理
ゼロから作る Deep Learning シリーズ全 6 巻 (基礎 / 自然言語処理 / フレームワーク / 強化学習 / 生成モデル / LLM) の読む順番を解説。各巻の内容 / 発売年 / 前提知識を一覧表で整理し、目的別にどの巻から読むべきかを案内します。
Web 開発本ガイド - フロントエンドからバックエンドまで
Web 開発の全体像を学べる技術書の選び方と学習マップを紹介。フレームワーク本の賞味期限問題と公式ドキュメントとの使い分けも解説します。