MapReduceはクラスター上の分散コンピューティングを実行するフレームワークです。2004年に誕生しました。

MapReduceの構造や機能など、その全体像についてわかりやすく解説します。


MapReduce-Overview

MapReduceは一言でいえば「ビッグデータを分散処理するプログラミングモデル」です。しかしこれだけでは何のことかわかりません。

まずビッグデータから解明していきましょう。

データの量と種類が膨大で、発生頻度や更新頻度が多く膨大なデータが日々発生しているような非定型的なデータの集合体がビッグデータです。

型通りのやり方では管理も解析も不可能な巨大データ群を想定して下さい。

それに対応すべく登場したのが「MapReduce」で、ペタバイト級のデータ群に対して分散コンピューティングを実行します。

この処理はクラスターと呼ばれる複数のコンピューターの結合体の上で行われるものです。


基本理念

MapReduceの基本理念は分散処理です。そのため、処理はMapReduceの2つの工程に分散されることとなります。

masterノードがデータを分割して「Mapper」ノードに送りキーと値のペアに変換されますが、これは「mapping」と呼ばれる工程です。

その後、キー内容による選択(shuffling)、整列(sort)、集約(combine)、結果のマスターノードへの報告(reducing)と進むことになります。

これらの処理がノード毎に分散して行われるのがMapReduceです。


MapReduceの計算過程

この2つの工程に関しては更に詳細に追跡してみる必要がありそうです。MapとReduceそれぞれのステップについて解説します。

流れはMapからCombine、更にReduceへと遷移するものです。

この流れの中では「Mapper」と「Reducer」という2つのサーバーが働きますが、サーバーは同一でも異なるものでもどちらでも構いません。


Map

このステップではデータは分割されて小さなブロックに分かれます。

100個のレコードがあったとして100個のMapperが一つずつ同時対応すること、2個のMapperが50個ずつ処理すること、どちらも可能です。

このステップではMapperの数を決定します。


中間ステップ

MapとReduceの間には中間ステップがあり、CombinePartitionという仕事を担当します。

Combineでは各Mapperのデータの単純化と縮小を施し、ダウンストリームへ渡します。

これはshufflingとsortをしやすくするためにデータを減少させる作業です。

PartitionはMapperから得たキーと値のペアリングを別のペアリングへと変換するステップです。

このステップではハッシュ値の決定とパーティションの割り当ても行います。

ハッシュ値は暗号や認証に利用される固定長の値のことです。Mapperから出力されるキーを基に計算されます。


Reduce

Mapperでの処理完了後、shufflingとsortを行い、同一キーを持つ出力値を集計します。以上のステップがMapReduceの処理工程です。


開発者

MapReduceはGoogle LLC(Limited Liability Company)が2004年に開発しました。

Limited Liability Companyという経営形態は、日本の会社法では「合同会社」に該当します。

社員が出資者となる経営の自由度の高い会社ですが有限責任です。

2003年と2004年の2度に亘り論文を発表しています。高速分散処理システムに関するものとして注目を集めました。

その後の「分散処理システムを実現するソフトウェア」誕生の引き金となるものです。


クラスターというハード

ここでクラスターについても簡単に触れておきましょう。直訳すると集団群れという意味になります。

コンピューターのクラスターという時には複数のコンピューターが連結状態にあり、相互に機能し合うこと、又その結合体を指す言葉です。

ブドウの房のような塊と表現され、1台ずつ単独で稼働する場合よりもはるかに強力な処理能力を発揮するものです。

MapReduceは電子デバイスが同じハードウェアで結ばれる場合、異なるハードウェアで構成される場合、どちらの環境下に於いても機能します。

前者は「ノード」、後者は「グリッド」と呼ばれるものです。


MapReduceを取り巻く環境と背景

Google LLCはビッグデータの分散処理を高速で行うためのプログラミングモデルを2本の論文によって公表しました。

2003年10月の「Googleファイルシステム」、2004年12月の「大規模クラスターでのデータ処理の簡素化」の2本です。

その中でMapReduceの仕組みについての解説があり、多くの関係者の称賛を得ることとなりました。

その仕組みに触発され、ソフトウェア開発に至らしめたのがDoug Cutting氏という当時Yahooに所属していたエンジニアです。

そこで生み出されたのが「Hadoop」というソフトウェアでした。

MapReduceのプログラミングモデルを具現化したものでビッグデータの分散処理を実現しています。

「Hadoop」は米国の「Apacheソフトウェア財団」のプロジェクトとして位置付けられたもので、オープンソースという点に特徴があります。

この財団はオープンソースのソフトウェアをサポートする団体として知られており、Doug Cutting氏もその後、Apacheコミュニティの議長に就任しました。

「Hadoop」というソフトについては後ほど詳しく解説します。


Google LLCの論文

Google LLCが公表し、その後のHadoopの開発の火付け役となった論文とはどんなものだったのでしょうか。その内容の主要部分を紹介します。


Googleファイルシステム

原題は「The Google File System」とされています。このファイルシステムが提供する特性は、高い集約パフォーマンスと耐障害性です。

コストパフォーマンスに優れる汎用ハードウェアがそれを支えています。

ビッグデータを処理するクラスターは数千台のマシンとディスク、数百TBのストレージ、数百のクライアントの同時アクセスを可能としています。


大規模クラスターでの処理の簡素化

こちらの原題は「MapReduce:Simplified Data Processing on Large Clusters」です。

キーと値のペアを対象にマップ関数・リデュース関数を駆使して自動的な並列化を行います。

数千台のマシーンで構成される大規模クラスターの上に実装された数百のMapReduceプログラムが処理を実行するものです。

経験の浅いプログラマーであっても分散システムのリソースを簡単に利用できる点が強調されています。


MapReduceの便利な機能

MapReduceの特徴から読み取ることのできる便利な機能、優れている点は凡そ次の通りです。

  • Mapステップに於けるMapの完全独立と並行処理
  • Reducerステップでの並行処理
  • サーバーの数を増やすことによるビッグデータの処理時間短縮
  • サーバー障害に対するリカバリーが簡単
  • サーバー数で勝負できることによるハードウェアコスト負担軽減

いずれも最大の特徴である「分散処理・並行処理」から派生するものと考えて良いでしょう。


Hadoopとは

再三に亘りHadoopはビッグデータの分散処理ソフトであると紹介してきました。

ただHadoopには4つのモジュールにより構成されていたり、ファイルシステムの実行をサポートしたりといった特徴があります。

その実態を踏まえてみると「ミドルウェア」と呼ぶべきかもしれません。

Hadoopは分散処理をするためにリソースが不足する場合、サーバーの増加により簡単に対応することができます。

その際、クラスターを停止する必要がありません。運用上の大きなメリットでしょう。

又、分散ファイルシステムにデータを格納する時にデータベースの構造定義であるスキーマ定義が不要となります。設計の手間を省くことが可能です。

更にクラスターを構成するサーバーに特別なスペックを求めませんので基盤構築コストを抑制することができます。

サーバーの故障を前提として設計されているので、システム全体の作動が維持できるのは大きな強みです。

尚、Hadoopというのは象のぬいぐるみの名前です。開発者であるDoug Cutting氏のお子さんが所有していたものといわれています。


Hadoopの各コンポーネント

Hadoopにはフレームワークの基盤となる主要コンポーネントと機能を領域毎に追加する補助的コンポーネントとが存在します。

それぞれ個別に紹介しましょう。


主要-HDFS

Hadoop Distributed File System」を略してHDFSと呼びます。

Hadoop分散ファイルシステムのことで、役割はサーバーへの格納やデータの複製などです。

HDFSはNameNodeDataNodeという2つのNodeに分かれていて、DataNodeにはデータが格納されます。

NameNodeはデータに関する情報が集められていてアプリケーションとの交信を行います。


主要-YARN


Yet Another Resource Negotiator」が元の呼び名で主な役目はリソースの管理とスケジューリングです。

各ノードで実行すべき仕事をAllocateします。


主要-MapReduce

Google LLCが開発したプログラミングモデルを実際に遂行します。

Map関数Reduce関数によりデータのグループ化やフィルタリング・集約・出力までを担っているコンポーネントです。


補助-Hive

SQLの構文に似たHQLを駆使してデータセットのクエリーの実行をサポートします。データウェアハウジングシステムという呼び方もあります。


補助-Pig

Pigの役目は「Pig Latin」という言語を用いてHDFSのクエリーの実行を支援するものです。MapReduceの関数を減らします。


補助-Flum

ビッグデータの取り込みツールがFlumです。データを集めてHDFSへ送っています。データ収集はバッチでもリアルタイムでも対応可能です。


補助-Zookeeper


分散サーバーのクラスターを管理するツールです。主な機能は次の通りです。

  • データ共有の維持
  • サーバーへの名前のAllocation
  • デッドロックや競合の処理
  • サーバーの中のリーダー選出


補助-Kafka

データ転送の高速化のために機能します。

Hadoopはこれらのコンポーネントの組み合わせによって分散データの処理と格納を遂行しています。


MapReduceとHadoopの関係

ここまでMapReduceとHadoopについて説明を加えてきました。

目指す着地点が似通っているので全体として一つのモデルと理解している方が多いかもしれません。

両者の違いをここで整理しておきましょう。

MapReduceの分散処理というアプローチはGoogle LLCにより提唱されたものです。それをソフトウェアという形で具現化したものがHadoopとなります。

MapReduceはHadoopの中核を成すものですが、Hadoopには独自の要素も多々含まれています。

補助的コンポーネントの数々がその例でしょう。

まとめるとMapReduceは分散処理方法でHadoopの中核、Hadoopは多機能のソフトウェアとの認識で宜しいのではないでしょうか。

一時期、この両者には特許権侵害問題が取り沙汰されたことがあります。

MapReduceに関してGoogle LLCは10本の特許を保有しているといわれています。

しかしながら2013年の時点でGoogle LLCはMapReduceの特許について「他者への訴訟を起こさず」と宣言しました。

このことによりHadoopは権利の問題無く利用できるものとして決着し、現在に至っています。

因みにHadoop自体はJavaで記述されたもの、MapReduceの言語はJava以外にもC++やPython、Rubyなどで記述することができます。


MapReduceの処理を実装するソフト

逆に、MapReduceの分散処理モデルを実装したソフトはHadoop以外にもあります。例えば次のようなソフトです。

  • Skynet:Ruby言語で実装されたソフトウェア
  • Disco:Python言語で実装されたソフトウェア
  • ddd:インターネット接続事業者ITJ(日本国際通信株式会社)が運用

出典元:https://www.gixo.jp/blog/12488/


MapReduceの使い方

MapReduceの優れた機能は認識できました。

ただ実際に使うとなると複数台のサーバーの設置やソフトウェアであるHadoopの実装など手間もかかります。

そんな悩みを解決してくれるのがElastic MapReduce (EMR)です。

米国のAmazon.com, Inc.が提供するWebサービスで、1回毎に料金の掛かるシステムとなります。

EMRの中では13種類の処理パターンが紹介されています。

  1. EMPTY:レコード並列:データ出力
  2. EDIT:レコード並列:データ編集出力
  3. LIMIT:レコード並列:データ絞り込み
  4. SAMPLE:レコード並列:条件に基づく絞り込み
  5. FILTER:レコード並列:条件に基づく絞り込み
  6. SPLIT:レコード並列:条件に基づく絞り込み
  7. MERGE:レコード並列:複数データを1つに集約
  8. DISTINCT:重複レコードの除去
  9. UNION:キー並列:複数データを重複除去した1つのデータに集約
  10. GROUP:キー並列:キーでグループ化
  11. JOIN:キー並列:複数データをキーで結合
  12. SORT:キーに関連あり:キーの順序で並び替え
  13. CROSS:その他:複数のデータレコードの組み合わせを全て出力

この13種類は大きく3つのパターンに類型化されているので、目的に沿ったパターンを選択して実行することが合理的でしょう。

類型化された3つのパターンを要約します。


レコード並列

レコードが独立していて個別処理可能のパターンです。Mapステップだけの処理で完結します。レコード同士の同期は不要だからです。


キー並列

キー同士は独立しているので並列処理はできますが同期が必要です。ShuffleとReduceフェーズが共に必要です。


キー同士の関係を考慮するパターン

キーの順序を制御しながら並列処理を実行します。Shuffleフェーズで並べ替えを自動化するパターンです。

以上の3類型以外のパターンが一つだけ存在します。CROSSというパターンで、全ての複数のデータレコードの組み合わせを出力するものです。


Hadoopの活用事例

Hadoopを活用している企業とそこでの使い方の実例をいくつかご紹介します。

  • Yahoo!Japan:アクセスログ解析、地図検索インデックスの作成
  • クックパッド:料理レシピサイトのログや検索クエリの分析
  • 国立国会図書館:蔵書検索サービスのインデックス生成
  • 楽天:商品の売上ランキング集計、ユーザーの行動解析
  • サイバーエージェント:Amebaサービスのログ解析

出典元:https://it.impressbm.co.jp/articles/-/9905

日本国内の様々なビジネス・シーンにあってもHadoopは広く利用されていることが窺えます。


MapReduceのNew Version

MapReduceには新バージョンがあります。MapReduce Version2(MRv2)と名付けられました。

MapReduceの課題として認識されていたテーマが1つあって、それはリソース管理についてでした。

タスクがサーバー上で並列的に処理される時、処理の制限数をスロットと呼びます。

MapReduceにはMapとReduceという2つのステップがあることを説明しました。

運用上それぞれのステップでは、MapスロットとReduceスロットをスレーブサーバー毎に定義しなければなりません。

例えばMapスロットに余裕があっても、Reduceロードが過大である時はリソースが有効利用されないという問題が発生します。

MapReduce Version2(MRv2)ではこの問題に対処するため、リソースの再割り当て機能が構築されました。

クラスター内の様々なアプリケーションに対して同時並列処理ができるよう、リソースを割り当て直すことになります。


MapReduceとHadoopの新天地

MapReduceとHadoopのコンビのこれからの活躍の舞台は、現状のビッグデータ分散処理だけではありません。

クラウドサービスやSAP、SugarCRMといったパッケージアプリとのデータフローの構築などの分野に於いても大きな可能性を秘めています。

これからもIT業界に新風を吹き込み続けて欲しい名コンビといえるでしょう。