Amazon Elastic MapReduceを使う(その2:コマンドラインツール)

2014/6/7 記事を更新しました。

                                                                                                                    • -

前回は、AWS Management ConsoleからMapReduceのサンプルを実行した。

参考にした「Hadoopファーストガイド」でruby製のコマンドラインツールを紹介しており、これを使ってみたところ、とても便利だったので、今回はこれを簡単に紹介する。

Hadoopファーストガイド

Hadoopファーストガイド

(注意:前回のログでは、リージョンをOregonにしていました。今回のログではN.Virginiaを使います。リージョンをまたぎますので、N.Virginiaのアクセスキーがない場合には再作成してください)

クライアントツールの実行環境は、Max OSX Lion。
(注意:rubyがインストールされていないと実行できませんので、実行環境にrubyが入っていることを確認してください。)

Amazon Elastic MapReduce Rubyのダウンロード

Amazon Elastic Map Reduce Ruby Clientを、開発ツールのページからダウンロードする。

ダウンロード後にホームディレクトリに解凍し、ターミナルを起動してパスを通した。
.bashrcに追記しておく。

export PATH=$HOME/elastic-mapreduce-ruby:$PATH


ホームディレクトリに.credentials.jsonを作成する。S3とEC2を同時に使うためのクレデンシャルの設定を行う

{
'access-id':'[your access id]',
'private-key':'[your private key]',
'keypair':'[your key pair file name]',
'key-pair-file':'[your key pair file name].pem',
'region':'us-east-1',
'log-uri':'s3n://[your bucket]/[log directory name]'
}


以下のようにelastic-mapreduceコマンドが動けばOK。

MacBook-Pro:~ tetsuya$ elastic-mapreduce --help
Usage: elastic-mapreduce [options]

  Creating Job Flows
        --create                     Create a new job flow
        --name NAME                  The name of the job flow being created

EMRのジョブフローを作成する。

Job Flowの作成、ステップの追加という手順で、前回実行したワードカウントプログラムを実行してみる。

マスターインスタンスグループ、コアインスタンスグループを各1台、タスクインスタンスグループを2台起動する。
ステップを追加するため、--aliveオプションをつけて勝手に終了しないようにする。

elastic-mapreduce --create --alive --name Spot-Cluster --instance-group master --instance-type m1.small --instance-count 1 --instance-group core --instance-type m1.small --instance-count 1 --instance-group task --instance-type m1.small --instance-count 1


上記のように入力すると。

Created job flow j-2H9XXXXXXXXX

とジョブフロー番号が帰ってくる。(Management Consoleと違い、コマンドラインツールでは、この番号が識別のためのキーになる)
マネージメントコンソールをみると、以下のようにWaitingというステータスになる。
(たくさん失敗しているが、これはコマンドラインツールからの指定する際に、参考書籍に従い、--name属性をダブルクォーテーションで囲んだため。囲まないのが正解のようだ)


コマンドラインツールから、上の図のようなJob Flowのリストを表示するには、

MacBook-Pro:~ tetsuya$ elastic-mapreduce --list

とする。アクティブなフローだけ表示するには、上のオプションに--activeを追加すればよい。

ジョブフローを終了するには、

MacBook-Pro:~ tetsuya$ elastic-mapreduce --terminate --jobflow j-2H9XXXXXXXXXX

とすると、

Terminated job flow j-2H9XXXXXXXXXX

と返ってくる。

WordCountのサンプルを実行してみる。

Waitingの状態になっているJobFlowに、ステップとしてWordCountを追加する。
python製のサンプルプログラムなので、Hadoop Streamを使用するという意味のオプション--streamをつける。

elastic-mapreduce --stream --step-name WordCount --input s3n://elasticmapreduce/samples/wordcount/input --output s3n://[your bucket]/[your directory] --mapper s3n://elasticmapreduce/samples/wordcount/wordSplitter.py --reducer aggregate --jobflow j- j-2H9XXXXXXXXXX

ジョブが追加されると、すぐに実行される。
ステータスがしばらくすると、ステータスがWaitingからRunningに変わり、処理が終了するとWaitingに戻る。
outputにしていたS3のフォルダーに結果が入っていれば、正常に動作したことが確認できる。
management consoleからも、以下のように、ステータスがステップ単位で確認できる。WordCountがCOMPLETEDになっていることが確認できる。