Amazon EC2上でHadoop Streamingによる分散処理をPHPでやってみた

あいかわらずHadoopStreamingが楽しくてやっているんですが、そろそろ自宅サーバ1台だけで処理するのは限界っぽいので、AmazonEC2上でHadoopStreamingにチャレンジしてみました。

AmazonEC2の導入に関しては、以下のまとめ記事からのリンクを参照しまくりさせてもらいました。多謝。m(_ _)m
Amazon EC2/S3を使ってみた - まとめ (Amazon Web Services関連エントリ目次) - 元RX-7乗りの適当な日々

そして、AmazonEC2上でのHadoopStreamingの動かし方に関しては、以下の記事を参考にさせてもらいました。
hadoop-ec2でアクセス解析してみたよ! - soffritto::journal

階層的クラスタリングをEC2上で動かしてみる

とりあえずテストという事で、前回の記事で作成した階層的クラスタリングMapReduceを、EC2上で動かしてみようと思います。

EC2のセットアップに関しては上で紹介した記事が非常によくまとまっているので、ここでは手順等は省略。

今回はEC2への接続周りはセットアップ済みという前提で、自宅のサーバ上からどうやってEC2上のHadoopを動かすかという辺りの手順を書いてみたいと思います。ただ、やっている事は上で紹介したもう一つの記事とほとんど同じなので、手順もほとんど同じになっています。

Hadoop用のマシンイメージにPHPが含まれているか心配だったんですが、ちゃんと入っていました。*1

以下、"[local]$"のプロンプトは自宅サーバ上、"[EC2]$"のプロンプトはEC2上でのコマンドを表します。

EC2上でHadoopを起動する

[local]$ hadoop-ec2 launch-cluster hadoop-test 2

これだけです…。たったこれだけで、EC2上に仮想のマシンが用意されて、Hadoopが使えるようになります。素晴らしい〜。

EC2上に必要なファイルをアップロードする

[local]$ hadoop-ec2 push hadoop-test reduce.php
[local]$ hadoop-ec2 push hadoop-test reduce2.php
[local]$ hadoop-ec2 push hadoop-test Reducer.php
[local]$ hadoop-ec2 push hadoop-test Iterator.php
[local]$ hadoop-ec2 push hadoop-test words.txt
[local]$ hadoop-ec2 push hadoop-test hcluster.sh

前回はMapperで形態素解析して入力データを作っていたんですが、残念ながらEC2上のマシンイメージにMeCabが入ってなかったので、今回は事前にMapper処理済みのデータを用意する事にしました。

あと、拙作のPHP-Hadoop-Streaming-Frontendディレクトリ階層を付けずにフラットな状態でアップロードするようにしました。ファイルアップした後にディレクトリ階層化してもいいんですが、面倒なので…。

れっつ HadoopStreaming on EC2!

これで準備OK! 早速動かしてみましょう。

[local]$ hadoop-ec2 login hadoop-test
[EC2]$ mkdir inputs
[EC2]$ mkdir outputs
[EC2]$ cp -i words.txt inputs
[EC2]$ ./hcluster.sh

非常にサクサク動きますねぇ。処理時間はだいたい30分ぐらいでした。今回のお題はデータ量も計算量もそんなに大きくないので、自宅サーバでやった場合とあんまり違いは出なかったですね。(^^;ゞ

EC2上のインスタンスを停止する

最後に忘れずにEC2上のインスタンスを停止しておきます。これを忘れると、延々と課金され続けてしまうので注意…。

[EC2]$ exit
[local]$ hadoop-ec2 terminate-cluster hadoop-test

感想

実はやってみるまでは「EC2って面白そうだけどお金も掛かるし、何か設定とか面倒臭そうだよなぁ…。」と思っていたんですが、正直なところそこまで面倒でもないし、何より安い!

1台/h=0.10$≒9.88337616円(執筆時点)なので、1台を24時間ずっと使っていたとしても1日240円もしないという…。今、利用状況を見てみたら、何だかんだで色々遊ぶのに使って6h…その他、データ転送代などがちょこちょこ入って、占めて0.65$=63.8695097円也…。

膨大な量のデータを処理したい時は、事前にMapReduceを作っておいて、EC2上で計算させる…っていう使い方をすれば、そんなにコストも掛からないし、かなり使えそうです。

問題は、いかにデータ処理の計算をMapReduceできる形に落とすか…ですね…。この辺り、自分自身は専門分野ではないし、ネット上でもなかなか情報がなくてつらいところなんですが…やっていて楽しいところではあるので、集合知プログラミングシリーズの記事の中で、また少しずつやっていこうと思っています。

*1:バージョンは確認し忘れた…。