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 を作成する。
f:id:kenjifunasaki:20120817165312p:plain
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 が作成されているのを確認できる。
f:id:kenjifunasaki:20120817171823p:plain
status が COMPLETE になったら、
f:id:kenjifunasaki:20120817171849p:plain
ログ出力先に指定したS3 のバケットの中身を見てみる。すると、ログファイルが格納されたディレクトリが作成されている。
f:id:kenjifunasaki:20120817165828p:plain
この中身を見れば、ログファイルを確認できる。

ここで、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

とりあえず、続きはまた今度。