Elastic MapReduceを使ってみる(1)
Amazon Web ServicesのElastic MapReduce(EMR)を使ってみました。
そもそも、MapReduce とは?
- 多数のコンピュータの集合に対して、並列処理をさせるためのフレームワークのこと。
- MapReduceは、その名の通り Map と Reduce の 2 つの処理がある。
- Map 処理では、マスターノードが入力データを受け取って、それをワーカーノードに配置する。各ワーカーで処理を行い、その結果をマスターノードに返す。
- Reduce 処理では、マスターが各ワーカーの処理結果を集めて、問題の答えを出力する
AWS マイスターの資料にある果物を切って、ミキサーにかけて、それを集めるみたいな図がイメージしやすかったです。
けど、文章や図だけではやっぱり理解不足なので、早速 EMR を使ってみました。
EMR の Getting Startup Guide を参考にしてます。
事前準備
EMR の Ruby 用のクライアントを今回使用するので、rubyを事前にインストールします。(今回は、Amazon Linux 上でコマンドを実行してます。)
$ sudo yum install ruby
ruby のインストールが成功しているか確認。
$ ruby -v ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]
EMR 用のコマンドを配置するディレクトリを作成。
mkdir elastic-mapreduce-cli cd elastic-mapreduce-cli
コマンドをダウンロード、展開
wget http://elasticmapreduce.s3.amazonaws.com/elastic-mapreduce-ruby.zip unzip elastic-mapreduce-ruby.zip
コマンドの実行に必要なcredentialsを設定する。
cat > credentials.json { "access-id": "<insert your AWS access id here>", "private-key": "<insert your AWS secret access key here>", "key-pair": "<insert the name of your Amazon ec2 key-pair here>", "key-pair-file": "<insert the path to the .pem file for your Amazon ec2 key pair here>", "log_uri": "[A path to a bucket you own on Amazon S3, such as, s3n://mylog-uri/]", "region": "<The region where you wish to launch your job flows. Should be on e of us-east-1, us-west-1, us-west-2, eu-west-1, ap-southeast-1, or ap-northeast -1, sa-east-1>" }
コマンドを実行してみる。list オプションを実行。
$ elastic-mapreduce --list
$
ジョブが登録されていないので、何も表示されない。
EMRの出力先となる S3 の bucket を作成する。
S3 bucket の ACL 設定を設定する。Authenticated Userを追加して、List権限を追加する。
job flow を作成する。今回は--aliveオプションをつけている。--aliveにより、すべてのjobのstepが完了しても、そのままrunning しつづける。
$ ./elastic-mapreduce --create --alive Created job flow j-3KVHQ7Q3UCZ0D
作成したjob flowを表示する。
$ ./elastic-mapreduce --list j-3KVHQ7Q3UCZ0D STARTING Development Job Flow (requires manual termination) Development Job Flow (requires manual termination)
job flow の詳細を json 形式で表示
$ ./elastic-mapreduce --describe --jobflow j-3KVHQ7Q3UCZ0D { "JobFlows": [ { "Steps": [], "SupportedProducts": [], "Name": "Development Job Flow (requires manual termination)", "BootstrapActions": [], "JobFlowId": "j-3KVHQ7Q3UCZ0D", "LogUri": "s3n:\/\/funa-1\/", "Instances": { "Placement": { "AvailabilityZone": "ap-northeast-1a" }, "TerminationProtected": false, "InstanceGroups": [ { "InstanceRequestCount": 1, "Name": "Master Instance Group", "InstanceType": "m1.small", "EndDateTime": null, "InstanceRole": "MASTER", "CreationDateTime": 1345180061.0, "LastStateChangeReason": "", "InstanceGroupId": "ig-3TFJLC9K3LI92", "StartDateTime": null, "Market": "ON_DEMAND", "LaunchGroup": null, "State": "PROVISIONING", "InstanceRunningCount": 0, "BidPrice": null, "ReadyDateTime": null } ], "InstanceCount": 1, "Ec2KeyName": "ap-northeast", "MasterInstanceId": null, "MasterInstanceType": "m1.small", "KeepJobFlowAliveWhenNoSteps": true, "HadoopVersion": "1.0.3", "NormalizedInstanceHours": 0, "MasterPublicDnsName": null, "Ec2SubnetId": null, "SlaveInstanceType": null }, "AmiVersion": "latest", "ExecutionStatusDetail": { "EndDateTime": null, "CreationDateTime": 1345180061.0, "LastStateChangeReason": "Starting instances", "StartDateTime": null, "State": "STARTING", "ReadyDateTime": null } } ] }
EMR の Management Console を見てみると、job flow が作成されているのを確認できる。
status が COMPLETE になったら、
ログ出力先に指定したS3 のバケットの中身を見てみる。すると、ログファイルが格納されたディレクトリが作成されている。
この中身を見れば、ログファイルを確認できる。
ここで、Startup Guide の手順にあった下記コマンドを実行してみたが、成功しない。原因は不明だが、ドキュメントが古く、最新のバージョンではオプション等が変更されているのかもしれない。
$ elastic-mapreduce -j j-3KVHQ7Q3UCZ0D --streaming Error: invalid option: --streaming $ elastic-mapreduce -j j-3KVHQ7Q3UCZ0D --stream Error: Missing arguments for --stream option
job flowをterminate させる。
elastic-mapreduce --terminate j-3KVHQ7Q3UCZ0D
Terminated job flow j-3KVHQ7Q3UCZ0D
とりあえず、続きはまた今度。