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にはなっているので、接続自体はできているとは思うのですが…。その後も色々試してはみたんですが、現時点でお手上げ状態になっています…。

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

2010年04月04日

[][]Amazon Elastic MapReduceHadoop Streamingする時にライブラリをrequireする方法

ちょっと元データの件数が大量にある処理をしたいという要件があって、普通に逐次処理していくと恐ろしく時間が掛かるので、「こんな時こそHadoop!」って事で、久々にHadoopをいじくっていました。

ただ、自宅サーバでやろうとすると、いくら分散処理できるとは言っても結局処理するのは物理的には1台な訳で、メモリを使い切ってスワップしまくってウンともスンとも言わなくなってしまうという、とっても悲しい状況になってしまいました。

「そんな時はAmazon先生にお願い!」って事で、Amazon Elastic MapReduceを試していたんですが、ちょっとハマってしまったところがあったので、備忘録がてら記事にしようかと思います。

Mapper/Reducer以外のファイルが使えない!

以前にAmazon Elastic MapReduceを試した時は、MapperとReducerが1ファイルだけの簡単な処理でやってみただけでした。

ただ、今回はもうちょっと処理が複雑で、Mapperから別ファイルをrequireしたり、serializeしてファイルに書き出しておいたデータを使ったりするものでした。

CLIでAmazon Elastic 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

Mapper/ReducerはS3に置いたものを指定する事ができて、初期化時に勝手にS3から読み込んできてHadoopの実行ノードに転送して実行してくれます。

しかし、Mapper/Reducer以外のファイルは例えS3上に置いておいても、勝手に読み込んだりはしれくれないので、Mapperとかでrequireしようとしても、読み込む事ができません。

で、どうすればいいか途方に暮れつつ調べていたら、以下のサイトさんで解決方法を見い出す事ができました。

Soffritto::Journal

"--cache-archive"というオプションを使う事で、Hadoop初期化時に各ノードに転送する事ができるようです。

まずMapper/Reducer以外の、ライブラリなどのファイルを一つのディレクトリにまとめておいて、jarコマンドでアーカイブします。

$ jar cvf lib.jar -C lib/ .

Mapper/Reducerでrequireしたりする時は、相対パスで書いておきます。

<?php
require 'lib/Hogeclass.php';
?>

後はElastic MapReduceを実行する時に、"--cache-archive"オプションを使ってjarファイルを指定してやればオッケーです。

$ elastic-mapreduce --create --stream \
--input s3n://stellaqua/inputs/input.dat \
--output s3n://stellaqua/outputs \
--mapper s3n://stellaqua/map.php \
--reducer s3n://stellaqua/reduce.php \
--cache-archive s3n://stellaqua/lib.jar#lib \
--num-instances 4 \
--log-uri s3n://stellaqua/logs

ついでながら、上記では、起動インスタンス数とログ出力先の指定もしています。

うまく使えば、ローカルにPEARを展開したものをアーカイブして、Hadoop Streamingから利用するとかできそうですね。

という訳で実際にElastic MapReduce上で処理させてみたんですが、またしても問題が…。

処理が成功しようが失敗しようが料金が掛かる
1回分の料金が安いとは言え、何度も失敗しているとその分料金がかさんでいくのは微妙に痛いです…。
どこまで処理が進んだか分かりづらい
一応、AWS Management Console上にデバッグコンソールというのもあってsyslogが見れるんですが、ちゃんと処理が進んでいるのかどうか微妙に分かりづらいです…。

…という事で、何回もの失敗を乗り越えてやっとまともに動くようになったので、1時間ほど動かしてみたんですが、ちゃんと処理が進んでいるのかどうかよく分からなかったので止めてしまいました。Elastic MapReduceを使いこなすには、もうちょっと研究が必要そうですね…。

2010年03月09日

[][]Hadoop Hack Nightに行ってきました

米国Yahoo!のHadoopチームアーキテクトのOwen O'Malleyさん来日に合わせて、技術評論社・Yahoo! JAPAN主催で行われたHadoop Hack Nightというイベントに行ってきました。

定員100名と結構大規模なイベントでしたが、申し込み開始からたった1日で申し込み多数により予定を切り上げて申し込み終了になったようで、かなり注目度の高いイベントだったみたいですね。

Ustream中継もあったので細かい内容に関しては略。思った事をつらつら書いてみたいと思います。

  • Yahoo!は2007年からHadoopを利用しているとの事で、その頃から数年経って、ある程度の規模の企業ではもはやHadoopを使うのが当たり前な感じになってきた印象でした。
  • HDFS・Hadoop自体が不安定という発言がチラホラ出ていて、重要なデータをHadoopだけに置いて処理させるような使い方はまだ若干恐さが残る印象でした。
  • 今回のイベントのページで見て"Hadoop papyrus"というプロジェクトを初めて知ったんですが、作者の藤川さんが「本家に取り込んでもらう事を目標にする。」とおっしゃっていて、そういったLLとHadoopの組み合わせでもっと使い易くなると面白いなと思いました。
  • 英語の通訳をして頂いたのは非常に助かってよかったんですが、通訳だけで結構な時間が取られてしまっていたので、ちょっともったいないなぁという印象でした。*1

という訳で、なかなかに楽しいイベントでございました。関係者の皆様ありがとうございます。

自分の場合は、Hadoopに関しては完全に個人の興味だけで実際に使う機会は今のところ無いんですが、Webの世界の将来(あるいは既に現在)を担う技術の一つとして今後もHadoop周りには注目していきたいと思っています。

*1:自分もまずは英語のプレゼンを聞き取れるようになる努力が必要だなと痛感はしましたが…。

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人ぐらい参加者が増えてたなんて状態でしたが、参加枠に入り込めてよかったです。