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

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

前回は、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を起動する方法を説明します。

おすすめ記事

記事・ニュース一覧