読者です 読者をやめる 読者になる 読者になる

/home/by-natures/dev*

ソフトウェア開発者として働く人の技術的なメモ

(追記) Hadoopもとい、AmazonEMRを使ってみた

前の日記から一転、最近は楽しく過ごしています。

仕事ももちろん、11月12月はプライベートや勉強会も充実しています。あとMacBook Air が届いたので、大学院時代に使っていたAirと久々のご対面…という感じで、この3連休はずっとAirをいじってます。LeopardとMountain Lionではずいぶんジェスチャーが変わってしまっているので、数日触ってようやく慣れてきたところです。

少し自分に距離を置いて見てみると、何かに対する批判・否定に敏感すぎるのだと思います。感情ではなく頭で理解するのと、そこから良い方向にもっていく流れが遅いというか。自分が悲観的だと周りの行動も悲観的に見えるし、ポジティブでれば周りの行動やリアクションもポジティブになるし、「見方」次第のところが大きいと思うんですが、常に後者でいるのは中々難しいです。

 

[caption id="" align="alignright" width="234" caption="「パターンでわかるHadoop MapReduce」。環境構築はWindowsを元にしているため、「ちょっと使ってみたい」というモチベーションだと億劫になってしまいます。"]パターンでわかるHadoop MapReduce[/caption]

さて、この流れでタイトルの Hadoop へと話を…

先日、別部署の先輩と話し込んで、その中で「元々は技術を学びたかったけれど、今は勉強に割く時間もないし、どう勉強していいか分からない」といった話がありました。その「技術」の一つに、Hadoop が挙がったんです。

何か新しいことを学ぶのって、エネルギーが必要ですよね…。かくいう僕もHadoopは、本を買って開くのを躊躇していたので、話題がホットなうちにHadoopを少し勉強してみることにしました。

とはいえ、Hadoopは分散データ処理技術なので、環境構築の壁が大きいことが分かりました。僕が買った本「パターンでわかる Hadoop MapReduce ビッグデータのデータ処理入門」ではWindows環境を念頭に、Cygwin+Eclipse+Hadoop+Pig をインストールしなければならなかったので、ズボラな僕はその時点でやる気減退。。少し触りたいだけなのに、MacHadoopをソースから入れるのも面倒だったし、どちらにせよHadoop用のファイルシステムHDFSなんて到底用意できません。

そんなとき、こちらのブログを発見。「my lifelog yuu-koma.jp:Amazon Elastic MapReduceをMacのコマンドラインから試してみる

自分で環境構築するのが面倒なら、既にある環境を使えばいい!…ということで、Amazon EC2にも自分で申し込んでみたかったので、これを機会にAmazon Elastic MapReduce を使ってみることにしました。

 

作業としては、上の方のブログや、Amazon EMR 入門AmazonHiveのチュートリアルを見ながら手を動かしています。Amazon Web Services への登録を行い、その後 EC2, S3, EMR を順次登録していきます。

EMRはコマンドラインインターフェースがあるので、Ruby環境さえあればどこからでもEMRを実行できるという素晴らしさです。一方Rubyは1.8系と1.9系で互換性が低いので、EMRが要求する1.8系と、僕がさくらインターネット(このブログが乗っています)にインストールしている1.9系では噛み合ず…。今回はコマンドラインインターフェースも Amazon EC2 上に設置しました。

コマンド一つ発行するだけで、EMRがEC2インスタンスを作ってくれるので、サンプルを動かすだけだと「これだけでいいの?」という気分でした。もちろん実際はMapper/Reducer, Shuffleのアルゴリズムなども実装する必要があったり、PigやHiveの使い方も学ばなければいけないので、考えることは多いと思いますが…。一連の動きが理解できるという目的としては十分です。

EC2, S3, EMR といっぺんに出てきたため、関係がよく分からなかったので、簡単に図にまとめました。外部からEMRをたたくと、自動的にEC2インスタンスが生成され、Mapper/ReducerおよびS3と連携するようですね。さすがAmazom様です。

AmazonEMR概要図

エラーなどはEMRの管理画面上のデバッグツールから確認できます。私の場合は、S3のストレージ名を大文字にしてしまって、少しハマりました。。S3のストレージ名として大文字は使えるけれど、EMRから大文字のストレージ名が指定できないようです。。

また、stdout, stderr, syslogなどの出力結果はすべて S3 上に出力されるので、S3の管理画面上からログを確認することができます。次のログはsyslogに出力された内容です。Mapper, Reducerのタスク数と、それぞれの進捗などが確認できました。

INFO org.apache.hadoop.mapred.JobClient (main): Default number of map tasks: null INFO org.apache.hadoop.mapred.JobClient (main): Setting default number of map tasks based on cluster size to : 4 INFO org.apache.hadoop.mapred.JobClient (main): Default number of reduce tasks: 1 INFO org.apache.hadoop.security.ShellBasedUnixGroupsMapping (main): add hadoop to shell userGroupsCache INFO org.apache.hadoop.mapred.JobClient (main): Setting group to hadoop INFO com.hadoop.compression.lzo.GPLNativeCodeLoader (main): Loaded native gpl library WARN com.hadoop.compression.lzo.LzoCodec (main): Could not find build properties file with revision hash INFO com.hadoop.compression.lzo.LzoCodec (main): Successfully loaded & initialized native-lzo library [hadoop-lzo rev UNKNOWN] WARN org.apache.hadoop.io.compress.snappy.LoadSnappy (main): Snappy native library is available INFO org.apache.hadoop.io.compress.snappy.LoadSnappy (main): Snappy native library loaded INFO org.apache.hadoop.mapred.FileInputFormat (main): Total input paths to process : 1 INFO org.apache.hadoop.streaming.StreamJob (main): getLocalDirs(): [/mnt/var/lib/hadoop/mapred] INFO org.apache.hadoop.streaming.StreamJob (main): Running job: job_201211241918_0001 INFO org.apache.hadoop.streaming.StreamJob (main): To kill this job, run: INFO org.apache.hadoop.streaming.StreamJob (main): /home/hadoop/bin/hadoop job -Dmapred.job.tracker=10.206.35.117:9001 -kill job_201211241918_0001 INFO org.apache.hadoop.streaming.StreamJob (main): Tracking URL: http://domU-12-31-39-14-20-87.compute-1.internal:9100/jobdetails.jsp?jobid=job_201211241918_0001 INFO org.apache.hadoop.streaming.StreamJob (main): map 0% reduce 0% INFO org.apache.hadoop.streaming.StreamJob (main): map 25% reduce 0% INFO org.apache.hadoop.streaming.StreamJob (main): map 75% reduce 0% INFO org.apache.hadoop.streaming.StreamJob (main): map 100% reduce 0% INFO org.apache.hadoop.streaming.StreamJob (main): map 100% reduce 100% INFO org.apache.hadoop.streaming.StreamJob (main): Job complete: job_201211241918_0001 INFO org.apache.hadoop.streaming.StreamJob (main): Output: s3n://testbucket-bynatures/out

 

HiveもPigも揃っているし、個人の勉強程度であればほとんどお金は掛からないと思います。本当にHadoop技術を身につけたいとなると、ここから更なるモチベーションが必要だと思いますが…とりあえず「少し触ってみたい」というモチベーションであれば、Amazon EMRを利用すると捗る、というご案内でした。

(2012/12/31 追記)Pig も触ってみた

前回は Hadoop ジョブフロー を動かしただけなのですが、Pig も使ってみたいな、ということで、Amazonチュートリアル Parsing Logs with Apache Pig and Elastic MapReduce を見ながら、AmazonEMR で Apache Pig を動かしてみました。

…といっても何か特筆すべきことはなく、すんなりと使えてしまいました。強いて言えば、チュートリアルのキャプチャと実際の設定画面が異なっていることぐらいでしょうか。AmazomAWSの管理画面は、割と頻繁に更新されているようです。この1ヶ月の間でも、AmazonS3 の管理画面がリニューアルされ、より分かりやすいインタフェースになっていました。

Pig をインタラクティブに利用するには、AWS の管理画面で Elastic MapReduce を選択し、Create a New Job Flow の SPECIFY PARAMETERS で Start an Interactive Pig Session を選択します。その後しばらくすると起動が完了するので、マスタサーバに接続すれば、Pig のインタラクティブセッションが利用できます。起動までには数分時間が掛かるようです。

AmazonEMR Create a New Job Flow

以下は Pig を利用している様子です。

Apache Pig を AmazonEMR で利用している様子 一番スペックが低いインスタンスを利用しているので、コマンドラインのインタラクションがかなり重いのですが…文句は言えませんね。Amazon での Hadoop の利用の仕方は一通り理解したので、ちょっとずつ勉強していきます。