Amazon Elastic MapReduceの使い方─Hadoopより手軽にはじめる大規模計算

第3回 Amazon Elastic MapReduce Ruby ClientでEMRを起動する

この記事を読むのに必要な時間:およそ 2 分

前回は,Web ConsoleからAmazon Elastic MapReduceを起動する方法を説明しました。今回はAPIでの起動方法を紹介していきます。

Web ConsoleとAPIはどこが違うのか

使用前に,まずWeb ConsoleとAPIの違いをおさえておきましょう。

Webコンソールは,1回の操作でJobを1つしか実行できません。これだと,毎回EC2のインスタンスが起動,ターミネートが走り,あまり効率的とはいえません。

一方APIを使用すると,1回の起動で複数のJobを実行できます。たとえば,3つのJobを実行したい場合は,以下のような操作が可能になります。

APIでEMRを起動する

3つのJobを投入する

すべてのJobが終了したら,EMRをターミネートする

また,「最近EMRで加わった新機能を利用中にインスタンス数を変更」といったこともできます。

EMRではどのようなAPIを使用できるか

EMRで使用できるAPIは言語ごとにいくつか用意されています。代表的なものは以下のとおりです。

今回はCLIから操作できるAmazon Elastic MapReduce Ruby Clientを紹介していきます。このAPI自体は名前のとおりRubyを使用していますので,実行前にRubyをインストールしておいてください。その後,上記のAPIのリンクからAPIをダウンロードし,解凍してください。

認証関係の設定をする

それでは実際に使用してみましょう。

まず,使用前に認証関係の設定をする必要があります。認証の設定は,credentials.jsonというファイルにJSON形式で値を指定していきます。credentials.jsonは,以下のいずれかの形で置いてください。

  • 解凍したディレクトリに置く
  • ホームディレクトリに「.credentials.json」などと「.」ファイルとして置く

以下が実例になります。

リスト1 credentials.jsonファイルの例

{
  "access-id":     "",
  "private-key":   "",
  "key-pair":      "",
  "key-pair-file": "",
  "log-uri":       ""
}
access-id
AWSのサイトではAccess Key IDとなっています。
private-key
AWSのサイトではSecret Access Keyとなっています。
key-pair
実際に使用しているキーペア名を入力してください。
key-pair-file
実際に使用しているキーペアーファイルを指定します。
log-uri
ログのURIを指定します。前回のWeb Consoleによる起動の説明で出てきたS3上のログのパスを指定します。

elastic-mapreduceコマンドでEMRを起動する

準備ができたところで,実際にEMRを実行してみましょう。起動するにはelastic-mapreduceコマンドを使います。

$ ./elastic-mapreduce 

特にオプションを付けずに実行すると,ヘルプが表示されます。このオプションを組み合わせることによって,Web Consoleではできない詳細な設定を行うことができます。

現在,起動しているJobを確認するには以下のようなオプションを付加します。

$ ./elastic-mapreduce --list
$ ./elastic-mapreduce --list --all

では,実際にJobを1つ起動するコマンドを入力してみましょう。

$ ./elastic-mapreduce --create \
 --name wordcount \
 --master-instance-type m1.large \
 --slave-instance-type m1.small \
 --num-instances 10 \
 --jar s3://emrjar/custome.jar \
 --args wordCount,s3://input/,s3://output

実行すると,「j-XXXXXXXXXXX」のようなJobフローのIDが返却されます。複数のJobを実行する場合は,JobフローIDを使って実行します。Webコンソールもしくは--listオプションを使ってEMRが起動していることを確認してみてください。

今回使用したオプションは以下の6つになります。

--name
Jobの名前を指定します。
--master-instance-type
マスタで使用するインスタンスのタイプを指定します。
--slave-instance-type
スレーブで使用するインスタンスのタイプを指定します。
--num-instances
起動するインスタンスの数を指定します。
--jar
起動するMapReduceのJarファイルのパスを指定します。
--args
Jarファイルに渡すパラメータを指定します。

ここではカンマ区切りで複数のパラメータを渡していますが,--argを複数設定して1つずつ指定することもできます。

複数のJobを起動してターミネートさせる

EMRを起動したら,複数のJobを起動し,最後にEMRをターミネートさせてみましょう。

全体の流れは以下のようになります。

EMRの起動→wordcount Jobを実行→grep Jobを実行→EMRをターミネート

EMRを起動する

$ ./elastic-mapreduce --create --alive \
 --name jobs \
 --master-instance-type m1.large \
 --slave-instance-type m1.small \
 --num-instances 10

wordcount Jobを実行する

$ ./elastic-mapreduce --jobflow j-XXXXXXXXXXX \
 --step-name wordCount \
 --jar s3://emrjar/custome.jar \
 --args wordCount,s3://input/,s3://output/wordcount

grep Jobを実行する

$ ./elastic-mapreduce --jobflow j-XXXXXXXXXXX \
 --step-name grep \
 --jar s3://emrjar/custome.jar \
 --args grep,s3://input/,s3://output/grep

EMRをターミネートさせる

$ ./elastic-mapreduce --terminate --jobflow j-XXXXXXXXXXX

上記の実行例では,前述した6つのオプションに加え,以下の3つのオプションを指定しています。

--alive
--terminateのターミネートが実行されるまでEMRを起動し続けます。
--jobflow
EMRの起動時に返却されたJobフローIDを指定します。
--step-name
それぞれのJobに対して名前を付けます。ただし任意なのでなくてもかまいません。

以上,APIを使ってEMRを起動する方法を説明してきました。実際には今回説明しなかったデバッグモードの指定など,複数のオプションで挙動を細かく制御できますので,ヘルプを見て実際にためしてみてください。

次回は,Java SDKを使ってEMRを起動する方法を説明します。

著者プロフィール

小林隆(こばやしりゅう)

クラウド,Hadoopを使ったMapReduce,NoSQL(主にCassandra)を使った開発を行っている。CassndraのGUIをオープンソースで公開。

bloghttp://beter-max.blogspot.com/

URLhttp://twitter.com/ryu_kobayashi/

コメント

コメントの記入