Stellaqua - TOMの技術日記 このページをアンテナに追加 RSSフィード

2010年08月08日

[]Amazon EC2上のHadoopMeCabを使えるようにしてみた…い

最近すっかり"Webサービスを作ってみた"系の記事ばっかりでしたが、今回は久々にEC2上でのHadoopのお話。

以前の記事EC2上でHadoopを動かした時は、MeCabデフォルトで入っていなかったので、事前に自宅サーバ上で分かち書きしたデータを使っていました。

ただ、日本語処理するならMeCabはほぼ必須だろうし、せっかくならMeCabが使える状態でMapReduceしたいのが人情ってもんです。

という訳で、EC2上のHadoopを使って、MeCabを利用した日本語文章の単語カウントMapReduceに挑戦してみました。

基本的な方向性としては以下の通りです。

  1. EC2上でインスタンス起動。
  2. 起動したインスタンスMeCabインストール
  3. AMIとして保存。
  4. Hadoopを起動する時にこのAMIが使われるようにする。

で、実際にやってみた訳なんですが、結論から言うとうまくいきませんでした…。

AMIを保存して、そのAMIが使われるようにするところまではできたんですが、そのインスタンスログインできない状態になってしまって、実際にMeCabを利用したMapReduceを動かすところまでできていません。

という事で途中までではありますが、やってみた手順を書き残しておきたいと思います。

以下、"[local]$"がローカルのサーバ上、"[ec2]$"がEC2上でのプロンプトを表す事とします。

EC2上でHadoopを起動してログインする

まずはEC2上にインスタンスを1つ起動させてログインします。

[local]$ hadoop-ec2 launch-master hadoop-test 1
[local]$ scp -i stellaqua.id *.pem root@ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com:/mnt
[local]$ hadoop-ec2 login hadoop-test

タイムゾーンを変更する

今回(というか毎度)参考にさせて頂いているid:rx7さんの記事によるとタイムゾーンの設定をしておいた方がよいとの事なので、ついでにここでタイムゾーンの変更をしておきます。

[ec2]$ cp /usr/share/zoneinfo/Japan /etc/localtime
cp: `/etc/localtime' を上書きしてもよろしいですか(yes/no)? y

MeCabインストールする

続いて本命のMeCabインストールします。

[ec2]$ yum -y update
[ec2]$ yum -y install mecab mecab-devel mecab-ipadic
[ec2]$ echo 'こんにちは' | mecab
こんにちは      感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
EOS

ちゃんとMeCabが使えるようになりましたね!

EC2root権限が与えられるので、yumで必要なものをガシガシ入れてしまうとよいですね。

AMIを作成してS3にアップロードする

AMI作成の手順については、毎度お世話になっているid:rx7さんの記事を参考にさせて頂きました。

Amazon EC2/S3を使ってみた - 3.EC2起動後〜AMI作成 - 元RX-7乗りの適当な日々

[ec2]$ cd /mnt/
[ec2]$ ec2-bundle-vol -d /mnt --privatekey pk-XXXX.pem --cert cert-XXXX.pem --user XXXX-XXXX-XXXX -p hadoop-0.17.0-i386 -r i386
[ec2]$ ec2-upload-bundle --bucket stellaqua/ec2_images/hadoop_mecab --manifest hadoop-0.17.0-i386.manifest.xml --access-key XXXX --secret-key XXXX
[ec2]$ exit
[local]$ hadoop-ec2 terminate-cluster hadoop-test
[local]$ ec2-register stellaqua/ec2_images/hadoop_mecab/hadoop-0.17.0-i386.manifest.xml
IMAGE   ami-XXXX
[local]$ vi hadoop-ec2-env.sh
→"S3_BUCKET=hadoop-ec2-images"となっているところを、上記で指定したバケットに変える

ポイントは、manifestファイルをHadoopのバージョンとアーキテクチャの名前を付けて保存する事と、設定ファイルでAMIを保存したバケットを設定しておく事ですね。

これで、hadoop-ec2コマンドでHadoopを起動する時に、登録したAMIが使われるようになるはずです。

早速、クラスタを起動してログインしてみます。

[local]$ hadoop-ec2 launch-cluster hadoop-test 1
[local]$ hadoop-ec2 login hadoop-test

これでログインできるはずなんですが、なぜかログインしに行ったままウンともスンとも言わない状態になってしまいます。

"Permission denied"とも言われないし、netstatで見るとESTABLISHEDにはなっているので、接続自体はできているとは思うのですが…。その後も色々試してはみたんですが、現時点でお手上げ状態になっています…。

また折を見て試してみて、うまくいったら記事にしようかなと思います。

2009年04月23日

[]自律型クラウド管理ソフト Wakame がスゴそう

以前参加した、Tokyo Cloud Developers Meetupで株式会社あくしゅの方がWakameというソフトについてプレゼンされていて、二次会でもお話を伺って、素直に「スゲー!」と思っておりました。そのWakameがついにリリースされたようですね。

no title

本家サイトは以下。

no title

どうスゴイのかは、以下の記事を見て頂くと伝わるんではないかと。

"Wakame" は三年後、「あれはイノベーションだった」と言われても不思議じゃないソフトウェアだ - 刺身☆ブーメランのはてなダイアリー*1

Wakameのスゴそうなところ

Wakameのスゴさは何と言っても、"自律型"っていうところにあるように思います。*2

1日のサーバ負荷の上下に合わせてサーバ台数を自動的にシステム側でスケールできるので、コストパフォーマンスが非常に良くなることが想像できます。

しかも、それがAmazonEC2上で行われるので、自前でサーバを持つ必要も無いし、スモールスタートにはうってつけですね。

何となく、もう何年もしない内に「自前でサーバ持つのが許されるのは小学生までだよね〜。」っていう時代が来そうな予感…。これは、早いトコ、AmazonEC2なんかのクラウド側でのサーバ運用に慣れておくのが得策なようですな。( ̄ー ̄)

Wakameも近い内に触ってみて、また感想なぞを記事にしたいと思います。

*1:こちらの記事のブコメで「それ、RightScaleで(ry」みたいな意見もありましたが、RightScaleって負荷状況に従って自動的にスケールする機能ってあるんですかね?

*2:本家サイトでは"自動で"という表現でしたが、負荷状況に従って自ら構成を変化させる事ができるので、"自律的"と言ってもよいのではないかと。

2009年04月10日

[][]Tokyo Cloud Developers Meetupに行ってきました

最近、分散処理とかクラウド辺りにアンテナを張っていたところ、偶然、Tokyo Cloud Developers Meetupというのが開催される事を知りまして、運良く参加枠に滑り込めたので行って参りました。*1

途中、メモとかは取ってなかったので、全体の印象ぐらいでさらりと感想を並べるに留めさせて頂こうかと思います。

  • Amazonジャパン初潜入でしたが、やっぱりオシャレな感じでしたね。
  • 受付の方に「あちらです」と案内されて部屋に入ってみたら、机の上に食べ物が盛られた皿がちらほらと…。「どこのパーティに紛れ込んでしまったんだ?!」と思ったら、米国だと勉強会みたいのでもそういうスタイルが多いんだとか…。
  • Jeffさん来日という事もあってか、外国人の方の割合がとても多かったです。「自分は英語話せないけど、どうしよう…。」とか思っていたら、皆さん、日本語がペラペラだったので色々とお話もさせて頂く事ができました。
  • Jeffさんの基調講演は、AWSに関する紹介な感じでした。当然英語な訳ですが、英語できないとやっぱりなかなか聞き取れないっ。(>_<) せっかくの講演も聞き取れないんじゃもったいないですよね…。英語はせめて聞き取れるようになるように勉強しようと思った瞬間でありました…。
  • ライトニングトークは、日本でのEC2を利用した様々な事例の紹介でしたが、個別のプレゼンに関する感想については割愛させて頂くとして(すみません。(^^;)、自分的に一番印象に残ったのは、皆さん口を揃えて「日本からだとEC2へ繋ぐのにネットワークが重たい。」と言っていた事でした。
  • 二次会は"Airじゃない"すき焼きを突っつきながら色々と楽しいお話をさせて頂きました。内容は割愛。(オイ)

その他、個別に書きたい話もちょこちょこありますが、それはまた後日…。

帰ってきて「寝る前に」と思って勢いで書いているので内容が適当で申し訳ないですが(^^;、色々と貴重なお話を聞く事ができてなかなかに楽しい時間でございました。関係者の皆様、どうもありがとうございました。

*1:最終的に、参加枠38人に対して補欠が26人という素晴らしい人気ぶりでした。申し込みする時も、1回リロードしてみたら2人ぐらい参加者が増えてたなんて状態でしたが、参加枠に入り込めてよかったです。

2009年04月04日

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

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

Amazon EMR ? Amazon Web Services

no title

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

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

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

事前準備

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

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

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

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

404 Not Found

ダウンロードした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インスタンスの起動・停止さえやらなくてよくて、ほとんどコマンド一発叩くだけ、という感じなのでものすごいお手軽ですね。

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

2009年03月27日

[][]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:バージョンは確認し忘れた…。