MapReduce

用語集のトップページへ

MapReduce とは

MapReduce は、Apache Hadoop エコシステムの一部であり、Java ベースの分散実行フレームワークです。開発者が実装する Map 処理と Reduce 処理の 2 つの処理ステップを公開することで、分散プログラミングの複雑さを解消します。Map 処理では、データは並列処理するタスク間で分割されます。データの各チャンクには、変換ロジックを適用できます。Map 処理が完了すると Reduce 処理が行われ、Map 処理で分割されたデータの集約を実行します。通常、MapReduce は入出力ともに Hadoop 分散ファイルシステム(HDFS)を使用します。しかし、その上に構築された Sqoop のような技術には、リレーショナルシステムにアクセスできるものがあります。

MapReduce の歴史

MapReduce は、2004 年に Google の Jeffery Dean 氏と Sanjay Ghemawat 氏によって Google 内で開発されました。彼らの論文「MapReduce: Simplified Data Processing on Large Clusters」において、MapReduce は関数型プログラミングでよく使用される map 関数と reduce 関数にヒントを得たものであることが示されています。当時、Google 独自の MapReduce システムは、Google File System(GFS)上で動作していました。しかし、Google は 2014 年までに、MapReduce を主要なビッグデータ処理モデルとして使用しなくなりました。かつて、MapReduce は HDFS に格納されたデータを取得できる唯一の方法でした。現在では、HDFS からデータを取得する方法として Hive や Pig といった他のクエリベースのシステムがあり、MapReduce モデルで記述されたジョブとともに実行される SQL ライクなステートメントが使用されています。

MapReduce の仕組み

MapReduce システムは、Map と Reduce の処理/関数の組み合わせとして一般化されていますが、通常は、3 つのステップで構成されています。それぞれのステップをご紹介します。
  • Map 処理:入力データは、小さなブロックに分割されます。Hadoop フレームワークは、処理するデータのサイズと各 Mapper サーバーで利用可能なメモリブロックに基づいて、使用する Mapper 数を決定します。各ブロックは、Mapper に割り当てられ、処理されます。各ワーカーノードは、ローカルデータに map 関数を適用し、一時ストレージに出力を書き込みます。プライマリ(マスター)ノードでは、冗長な入力データの 1 つのコピーのみが処理されるようにします。
  • シャッフル、集約(Combine)、パーティション: ワーカーノードは、map 関数によって生成された出力キーに基づいてデータを再分配し、あるキーに属する全てのデータが同じワーカーノードに配置されるようにします。オプションの処理となる Combiner(Reducer)は、各 Mapper サーバー上で個別に実行することで各 Mapper のデータをさらに削減し、データフットプリントの削減やシャッフルとソートを容易にすることが可能です。パーティションはオプションではなく、データを Reducer に提示する方法を決定し、また特定の Reducer に割り当てる処理です。
  • Reduce 処理:Mapper の進行中に Reducer を開始することはできません。ワーカーノードは、key-value ペアの出力データの各グループを並列に処理し、key-value ペアを出力として生成します。同じキーを持つ全ての Map の出力値は、1 つの Reducer に割り当てられ、Reducer はそのキーの値を集計します。初期データのフィルタリングやソートが必須の map 関数とは異なり、reduce 関数はオプションです。

MapReduce で考慮すべき事柄


  • 柔軟性に欠ける MapReduce のプログラミングパラダイム

Map 処理と Reduce 処理のインターフェースをプログラマーに公開することで、Hadoop での分散アプリケーションの作成が容易になった一方で、MapReduce のプログラミングパラダイムで幅広いロジックを表現することは困難です。MapReduce でうまく機能しないロジックの一例として、反復処理が挙げられます。一般的に、データはメモリ上に保持されず、反復処理のロジックは MapReduce アプリケーションを連結することで処理されるため、複雑さが増してしまいます。
 

  • 読み取り/書き込みの集中

MapReduce ジョブでは、ユーザーデータ用の分散メモリ構造の概念がないため、メモリに保存するデータはほとんどなく、データは HDFS に対して読み書きする必要があります。さらに複雑な MapReduce アプリケーションでは、より小さな MapReduce ジョブを連結して使用します。これらのジョブ間ではデータの受け渡しができないため、HDFS を介したデータ共有が必要になり、処理のボトルネックが生じます。
 

  • Java に特化

MapReduce は Java ベースであるため、MapReduce アプリケーションを書く最も効率的な方法は、Java を使用することでしょう。そのコードは別の開発環境でコンパイルし、Hadoop クラスタにデプロイする必要があります。このような開発スタイルは、SQL などの他の技術や Python などのインタプリタ言語に慣れているデータアナリストやデータサイエンティストにはあまり採用されていません。MapReduce には、C、Python、シェルスクリプトといった他の言語で書かれた Map/Reduce ロジックを呼び出す機能が備わっています。しかし、プログラムの実行を処理するためにシステムプロセスをスピンアップする必要があり、この操作はジョブの性能に影響を与えるオーバーヘッドを発生させます。
 

  • ビッグデータ製品からのフェーズアウト

MapReduce は、ビッグデータを扱う製品から排除される傾向にあります。一部の Hadoop ディストリビューションには MapReduce が含まれていますが、レガシーアプリケーションのサポートを目的としたものです。ビックデータを利用するユーザーは、MapReduce アプリケーションを構築するのではなく、代わりに Apache Spark のようなシンプルで高速なフレームワークを採用するようになっています。

MapReduce の使用目的

レガシーアプリケーションや Sqoop、Pig のような Hadoop のネイティブツールは、現在も MapReduce を活用しています。しかし、MapReduce アプリケーションの開発は非常に限られており、オープンソース技術として大きな貢献をしているとはいえません。

MapReduce と Spark に関するよくある誤解

  • MapReduce について
  • Spark について

MapReduce のメリット

  1. スケーラビリティ
  2. 柔軟性
  3. セキュリティと認証機能
  4. 高速なデータ処理
  5. 極めてシンプルなプログラミングモデル
  6. 可用性と弾力性

MapReduce の性能を向上させるためのヒント

  1. ユーバーモードを有効化する
  2. ネイティブなライブラリを使用する
  3. ブロックサイズを大きくする
  4. Map のタスクの所要時間を監視する
  5. データ圧縮が分割可能かどうかを特定する
  6. 削減されたタスクの数を設定する
  7. データの分割を分析する
  8. フェーズパフォーマンスの動作をシャッフルする
  9. MapReduce コードを最適化する

MapReduce と Databricks Delta Engine の比較

Databricks の Delta Engine は、Apache Spark と Photon と呼ばれる C++ エンジンをベースにしています。これにより、MapReduce にはない DAG 処理の柔軟性、インメモリ処理による高速性、ネイティブにコンパイルされた特別なエンジンによる圧倒的に高速なクエリ応答時間を実現します。ユーザーは、Python、Scala、R、SQL を使用して Databricks の Delta Engine を操作できます。既存の Spark アプリケーションは、データ形式として「delta」を指定するといった簡単な行の変更で、Delta Engine を使用するように変更できます。MapReduce と HDFS は、データのトランザクション一貫性や、データセット内の既存データの更新/削除をネイティブにサポートしていません。一方、Delta Engine は、データ作成者と利用者によるデータへの同時アクセスを可能にし、完全な CRUD 機能を提供します。また、MapReduce は、ビッグデータ環境における共通の問題である極小ファイルに対応するビルトイン機能を持ちませんが、Databricks の Delta Engine は、ストレージに書き込まれるデータサイズを最適化するオートコンパクション機能を備えています。OPTIMIZE コマンドを使用すると、必要に応じてファイルをコンパクトにすることも可能です。Delta のトランザクション一貫性機能により、エンドユーザーやアプリケーションがデータにアクセスしていても、この操作を実行できます。

MapReduce の代替となる 5 つの選択肢

  1. Apache Spark
  2. Apache Storm
  3. Ceph
  4. Hydra
  5. Google BigQuery

関連リソース


用語集のトップページへ