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

第5回 デバッグモードを使いこなす

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

すべてのJobが終了し,Stepsの画面まで戻ると,⁠COMPLETED」として図6の画面のようにログファイルも確認できるようになっています。

図6 Job終了後の画面

図6 Job終了後の画面

「Log Files」のところにある「controller」⁠stderr」⁠stdout」⁠syslog」の4つの役割は以下のとおりです。

controller
→このJobで使用した起動パラメータなどのログを確認することができます。
stderr
→このJobを実行中にエラーが発生した場合,標準エラー出力に出力されるようになっているエラーはここに出力されます。Jobがエラーで終了する場合は,このログを確認してみてください。
stdout
→stderr同様,標準出力に出力されるようになっているエラーがここに出力されます。
syslog
図7のように,オンプレミスのHadoopでおなじみのログが出力されます。

図7 ログの例

図7 ログの例

Amazon Elastic MapReduce Ruby Clientでデバッグするには

次はAmazon Elastic MapReduce Ruby Clientを使ってデバッグする方法です。本連載の第3回もあわせて確認してみてください。コマンドはelastic-mapreduceを使います。

$ ./elastic-mapreduce --create \
 --name exsample \
 --master-instance-type m2.xlarge \
 --slave-instance-type m2.xlarge \
 --num-instance 20 \
 --jar s3://emrjar/examplejar \
 --args wordCount,s3://input/,s3://output
 --enable-debugging \
 --log-uri s3://emr-log/

ここで注目していただきたいのは,第3回では出てこなかった以下の2つのオプションが追加されている点です。

  • --enable-debugging
  • --log-uri

--enable-debuggingでデバッグモードをオンし,--log-uriでWeb Consoleの時と同様にS3のログ出力先パスを指定します。こうしておけば,起動後Web Consoleの画面でデバッグモードで起動し,タスクの確認までできます。

ちなみに,--describe,--jobflow{JobフローID} などを利用すると,JSON形式で詳細なステータスを確認することもできます。

Java SDKでデバッグするには

最後に,Java SDKでのデバッグ方法を紹介します。連載の4回目と重なる部分もありますが,復習の意味でも,もう1度確認してみてください。

まず,RunJobFlowRequestに渡すパラメータとして,デバッグ用のステップコンフィグを定義します。ここで定義したものが,先ほどWeb Consoleのところで触れたSetup Hadoop Debuggingの部分に表示されます。

今回はwithNameを"Debugging"としているので,この名前でリストに表示されます。

StepConfig enableDebugging =
    new StepConfig()
            .withName("Debugging")
            .withActionOnFailure("TERMINATE_JOB_FLOW")
            .withHadoopJarStep(new StepFactory().newEnableDebuggingStep());

次に,このステップコンフィグをRunJobFlowRequestに設定します。

RunJobFlowRequest runJobFlowRequest =
    new RunJobFlowRequest()
            .withName("EMR Job")
            .withSteps(enableDebugging, stepConfig)
            .withLogUri("s3://emr-log/")
            .withInstances(new JobFlowInstancesConfig()
                                    .withEc2KeyName("cluster-key")
                                    .withHadoopVersion("0.20")
                                    .withInstanceCount(10)
                                    .withKeepJobFlowAliveWhenNoSteps(true)
                                    .withMasterInstanceType("m1.large")
                                    .withSlaveInstanceType("m1.large")
                                    .withPlacement(new PlacementType()
                                                          .withAvailabilityZone("us-east-1a")));

ポイントは以下の2点です。

  • RunJobFlowRequest#withSteps
  • RunJobFlowRequest#withLogUri

RunJobFlowRequest#withStepsには,定義したステップコンフィグを設定します。

RunJobFlowRequest#withLogUriは,今まで出てきたS3パスです。ここに設定したパスにログが出力されます。

今まで同様,Web Consoleをデバッグモードで起動できていることを確認してみてください。

以上,デバッグモードを使ってデバッグする方法を解説してきました。EMRでも思ったより簡単にデバッグできることが確認できたのではないでしょうか。オンプレミスのHadoop同様,さらに細かくログを確認したい場合は,S3のパスに出力されているMapReduceのログを確認してみてください。

最後に忘れてはいけないのがログの削除です。MapReduceを使ったことがある方はわかると思いますが,1回の実行でかなりの量のログが出力されます。このログを削除し忘れるとコストもかさんでいくので,使用しなくなったり,確認が終わったログは,S3やSimpleDBから削除しておくようにしましょう。

著者プロフィール

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

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

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

URLhttp://twitter.com/ryu_kobayashi/

コメント

コメントの記入