Amazon Elastic MapReduceでPHPも使えるか試してみた

AmazonがEC2上でHadoopによるMapReduceを実行できるサービスを出してきたようですね。

Amazon EMR - Amazon Web Services
http://kzk9.net/blog/2009/04/reviewing_amazon_elastic_map_reduce.html

前回の記事では、EC2上でHadoop用のインスタンスを自分で動作させて、ファイルの転送も事前にやって…と色々下準備が必要だったんですが、このサービスを使えばローカルの環境からいきなりコマンド一発でMapReduceを実行する事ができるようになりました。

そんなのを聞いたらやってみたくなるよね、という事で、PHPのMapper/Reducerが使えるか試してみたかったので、早速使ってみる事にしました。

多段階のMapReduceは面倒なので、今回は以前の記事で使った単語カウントのMapper/Reducerを使う事にします。

事前準備

ほとんど準備は必要ないとはいえ、以下のような準備はしておく必要があります。

  • S3のSignUp
  • EC2のSignUp
  • ElasticMapReduceのSignUp
  • S3への必要なファイル(入力ファイル/Mapper/Reducer)のアップロード

この辺の手順については割愛させて頂きます。

実行するには、Webベースのコンソールから実行する方法もあるんですが、今回はコマンドベースのものを使用しました。コマンドラインツールとして、Rubyのクライアントが用意されていて、以下のURLからダウンロードできます。

http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2264&categoryID=266

ダウンロードしたZIPファイルを展開して、展開したディレクトリにパスを通せばOK!

ちなみに、"credentials.json"というファイルを作ってアクセスキーなどの設定を書いておけば、コマンド実行時にいちいちアクセスキーとかの設定を書かなくて済むようになるようですね。

れっつMapReduce!

ちょっと試行錯誤はあったんですが、結果的に以下のコマンドでいけました。

$ elastic-mapreduce --create --stream \
--input s3n://stellaqua/mapreduce/inputs \
--output s3n://stellaqua/mapreduce/outputs \
--mapper s3n://stellaqua/mapreduce/map.php \
--reducer s3n://stellaqua/mapreduce/reduce.php

アウトプットのディレクトリは自動で作られるようなので、事前に作っておかない状態で実行しました。inputsは事前に作って、中に空白区切りのテキストファイルを放り込んでおきました。

実行すると、"Created job flow j-1NID8F5O07YPY"というような簡素な1行だけの出力がされて、ジョブの実行が開始されます。ジョブの状態を確認するには以下のコマンドを実行します。

$ elastic-mapreduce --list

もっと詳細を確認したい場合は、以下のようにジョブIDを指定してdescribeオプションでコマンドを実行します。

$ elastic-mapreduce --describe --jobflow j-1NID8F5O07YPY

実行結果は、outputsで指定したS3のバケットに入るので、後は適当なS3クライアントでダウンロードしてくればOKですね。

ざっと見てみた感じでは、問題なく単語カウントができていたようでした。

感想

感覚としては、やっぱりどうしても起動のオーバーヘッドが大きいな〜、と思ってしまいますね。まぁ、実際の処理が一瞬で終わるようなものをわざわざMapReduceを使ってやっているからそう感じてしまうだけで、元から数時間掛かるような処理だったら、たかだか数分ぐらいの起動時間なんて大したことないんでしょうけどね。

使用感という意味では、前回やったようなEC2のインスタンスの起動・停止さえやらなくてよくて、ほとんどコマンド一発叩くだけ、という感じなのでものすごいお手軽ですね。

ちょっと複雑な事をやろうと思うとそれなりに知識が必要で難しいんですが、例えば単純なアクセスログ解析とか、簡単な処理でもデータ量が膨大になるような時にはかなり有用かもしれませんね。