はじめに
こんにちは,adingoの岩川です。
ビッグデータという言葉が浸透して,実際に向き合う機会も増えてきていると感じます。
ビッグなデータを処理するには相応の計算パワーが必要です。分散処理システムを使って対処するのは一般的な方法ですが,分散処理システムを1から組むのは大変なので,Hadoop MapReduceベースのシステムが広く利用されています。
Hadoop MapReduceにおいては,ユーザはMapReduceと呼ばれる計算モデルに従って,Map処理,Reduce処理と呼ばれる計算内容のコア部分だけを書けばよく,タスク配分や通信などをケアする必要がありません。これによって,プログラミングのコストを大幅に減らすことが可能なのです。
しかしながら,実はHadoopクラスタの管理は決してラクなものではありません。
何台ものサーバをセットアップし,Hadoopをインストールしてやり,動作確認をする……非常に骨の折れる作業です。
そもそも,何台のクラスタが必要なのか。やってみないとわからないというのが正直なところではないでしょうか。
我々(cosmi開発チーム)もまた,データ分析システムを開発するにあたって,そういった問題を抱えていたのです。そこで,Amazon Elastic MapReduce(EMR)とよばれるPaaSスタイルのHadoop環境を利用することにしました。
「実例で学ぶAWS」第3回と第4回は,少し予定を変更して2回ともEMRについて解説していきます。特にcosmiのケースで起こった,下記のパターンでのMapReduceアプリケーション開発手順を追っていきます。
- Javaで実装する
- CloudFrontのログを解析する
- EMRクラスタとEC2インスタンスとが通信する
第3回は,EMRで実行する,Hadoop MapReduceプログラムのコンパイルから,ローカル環境で実行して動作確認するところまでを追っていきます。
CloudFront & EMR
今回はAWSが提供するContents Delivery Network(CDN)である,Amazon CloudFrontのログを解析するプログラムを作成します。
CloudFrontとEMRは相性がよく,CloudFrontのログをそのままEMRで処理することができるようになっています。
CloudFrontは静的コンテンツの配信だけではなく,情報を記録するために利用することができます。
すなわち,記録したい情報をGETパラメータに含めたリクエストを行うことで,情報をCloudFrontのログとして貯蔵しておくわけです。
cosmiでも,パートナー様から送信されるデータを記録するために,CloudFrontを利用しています。
EMRを使う,その前に
HadoopはMapReduceのJava実装ですので,ユーザプログラムもJavaで書くのが一般的です(もっとも,Hadoop Streamingなどのツールを使えば,Java以外の言語でもMapReduceの処理を書くことが可能です)。
ソースコードをコンパイルするにはJavaのコンパイラとHadoop Commonのライブラリが必要です。ダウンロードして,解凍しておきましょう。
執筆時点(2011年12月1日)での安定版は0.20.203.0です。
ローカル環境だけでの簡単な動作確認なら,それほど面倒な設定をせずとも実行可能です。
もし自前の分散実行環境を用意するのであれば,別途チュートリアル等をご参照ください(もっとも,分散環境を作るのは面倒だからEMRを使おうという,本記事の趣旨からは外れますが!)。
MapReduceとは
Hadoop MapReduceのプログラムを書く前に,MapReduceについて抑えておく必要があるでしょう。
MapReduceは分散コンピューティングのための計算モデルです。入力となるキーと値のペアを,1つ,あるいは複数の別のキーと値のペアにマップするMap処理,Map処理の結果をキーごとにまとめるShuffle処理,キーごとにまとまった複数の値を計算して結果を得るReduce処理からなります。
Map処理とReduce処理はそれぞれキーの種類ぶん複数回実施されます。それぞれの処理は入力に応じた出力さえ算出すればいいので,並列化しやすいのです。また,複数回のMapReduceを組み合わせることで,複雑な計算も可能です。
なお,Shuffle処理はHadoopに組み込まれており,ユーザが記述する必要はありません。

