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

第4回 Java SDKでEMRを起動する

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

前回は,Amazon Elastic MapReduce Rubyを使ってAmazon Elastic MapReduce(以下EMR)を起動する方法を説明しました。今回はJava SDKを使って起動する方法を紹介していきます。

Java SDKを使う準備をする

実際に使用するにはSDKをダウンロードしておく必要があります。下記サイトからダウンロードしておきましょう。

AWS SDK for Java
URL:http://aws.amazon.com/sdkforjava/
Java Library for Amazon Elastic MapReduce
URL:http://aws.amazon.com/code/Elastic-MapReduce/2305

AWS SDK for Javaは,EMRだけでなくEC2,S3などほかのAWSを操作することもできますし,AWSオフィシャルのものです。積極的に利用することをお勧めします。

また,mavenを使用しているのであれば,設定(pom.xml)に以下を追加してダウンロードすることもできます(執筆時点での最新バージョンは1.1.4です)⁠

リスト1 mavenの設定への追加

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.1.1</version>
</dependency>

Amazon Elastic MapReduce Clientのコンストラクタにプロパティファイルを渡す

では,実際にコードを見ていきましょう。ファイルが少し大きいので,一部抜粋しながら説明していきます。全体については,本記事の記事末にあるリンクからサンプルプログラムをダウンロードしてご確認ください。

リスト2 EMRManager.java(抜粋)

private static final String AWS_CREDENTIALS_PROPERTIES = "/example/emr/AWSCredentials.properties";

private AmazonElasticMapReduce emr;

public EMRManager() throws IOException {
  emr = new AmazonElasticMapReduceClient(
                new PropertiesCredentials(
                        EMRManager.class.getResourceAsStream(AWS_CREDENTIALS_PROPERTIES)));
}

SDKでEMRを操作するにはAmazonElasticMapReduceClientを使います。AmazonElasticMapReduceClientのコンストラクタに渡している「AWSCredentials.properties」は,AWSでの認証のためのプロパティファイルです。以下のように定義します。

リスト3 AWSCredentials.propertiesの内容

accessKey=YYYYYYYYYYYYYYYYY
secretKey=ZZZZZZZZZZZZZZZZZZ

これらは前回も出てきたアクセスキー,シークレットキーと同じものです。もしくはEMRManager.javaのプログラム中で,

public EMRManager() throws IOException {
  emr = new AmazonElasticMapReduceClient(new BasicAWSCredentials("accessKey", "secretKey"));
}

としてBasicAWSCredentialsを使って各キーを指定することもできます。

ステップを定義する

EMRを実行するにあたっては,まず「ステップ」を定義する作業が必要になります。ステップとは,MapReduceのそれぞれのJobのことです。このステップを複数定義して渡すことによって,EMRを一度起動するだけで複数のJobを実行することができます。

リスト4 EMRManager.java(ステップ定義部分 抜粋)

StepConfig stepConfig =
    new StepConfig()
            .withName("job")
            .withActionOnFailure(ACTION_ON_FAILURE)
            .withHadoopJarStep(new HadoopJarStepConfig()
                                        .withJar(MAPREDUCE_JAR)
                                        .withArgs(Arrays.asList(jobName, inputPath, outputPath)));

リスト4の3行目以降の意味は以下のとおりです。

StepConfig#withName
→Jobの名前を指定します。
StepConfig#withActionOnFailure
→Jobの実行に失敗した時の動作を指定します。CANCEL_AND_WAITはJobに失敗した場合,Job自体をキャンセルし,EMRを待機状態にします。
StepConfig#withHadoopJarStep
→実行するJarを定義します。
HadoopJarStepConfig#withJar
→Jarのパスを指定します。
HadoopJarStepConfig#withArgs
→Jarに渡すパラメータを指定します。

デバッグモードで起動するには

前回でも紹介しましたが,SDKでもデバッグモードで起動することができます。大まかには以下のようになります。

リスト5 EMRManager.java(デバッグモード部分 抜粋)

private static final String EMR_DEBUGGIN_NAME = "Debugging";

StepConfig enableDebugging =
    new StepConfig()
            .withName(EMR_DEBUGGIN_NAME)
            .withActionOnFailure(ACTION_ON_TERMINATE)
            .withHadoopJarStep(new StepFactory().newEnableDebuggingStep());

Jobと違うのは以下の2点です。

  • withActionOnFailureにTERMINATE_JOB_FLOWを指定している
    (実行に失敗した場合,EMR自体を終了させます)
  • withHadoopJarStepにデバッグ用のステップを指定している

著者プロフィール

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

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

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

URLhttp://twitter.com/ryu_kobayashi/

コメント

コメントの記入