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

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

前回はJava SDKを使ってAmazon Elastic MapReduceを起動する方法を説明しました。今回は、前回まで何度か出てきたデバッグモードについて説明します。

ここでは、連載の2回目から4回目までで取り上げたWeb Console、Amazon Elastic MapReduce Ruby Client、Java SDKのそれぞれでデバッグする方法を紹介します。

Web Consoleでデバッグモードを使用するには

Web Consoleでは、Jobを作成する際にデバッグモードを使用するように設定しておく必要があります。具体的な設定個所は以下のとおりです。

図1 デバッグモードでの設定個所
図1 デバッグモードでの設定個所

まずは次の2点を設定してください。

  • 「Enable Debugging」をYesにする
  • 「Amazon S3 Log Path」にログを保存したS3のパスを記入する

また「Enable Hadoop Debugging」をYesにすると、リアルタイムでMapReduceのJobを監視することができます。なお、Enable Hadoop DebuggingはSimpleDBを使用しますので、サインアップしてない場合はサインアップしておく必要があります。

では、両方をYesにして実行してみましょう。

図2のように、EMRのメイン画面の「Debug」ボタンをクリックすると、デバッグ画面が表示されます。なお、⁠Enable Hadoop Debugging」をYesにしていない場合、Jobが完了するまでログを確認することはできません。MapReduceのログは起動したJobのIDで保存されますので、指定したS3パスのJob IDで確認してください(図2の左下部⁠。

図2 ⁠Debug」ボタンをクリック
図2 「Debug」ボタンをクリック

Debugをクリックすると、図3のようなウィンドウが起動します。今回はEnable Hadoop DebuggingをYesにしてあるので、指定したJobよりも前にSetup Hadoop Debuggingが起動しています。このステップで、SimpleDBにログを出力するように設定されます。

図3 デバッグ設定のウィンドウ
図3 デバッグ設定のウィンドウ

「View Jobs」をクリックすると、図4の画面に切り替わります。

図4 Jobの確認
図4 Jobの確認

この画面ではJobが1つ起動しているのがわかると思います。多段MapReduceなど、複数のJobを起動している場合は、ここに複数のJobが表示されます。

それでは、⁠View Tasks」をクリックして、MapReduceのタスクを確認してみましょう。

図5 タスク確認
図5 タスク確認

画面上部の「Task Summary」のところで、タスクの状態を確認することができます。それぞれの意味は以下のとおりです。

Total Tasks
→このJobで実行されるタスクの数(ここでは360)
Completed
→すでに終了しているタスク(ここでは29)
Running
→現在実行されているJobの数(ここでは108)
Failed
→失敗したタスク(ここでは0)
Pending
→現在の待ちタスクの数(ここでは223)
Cancelled
→キャンセルしたタスクの数(ここでは0)

状態は「Refresh List」をクリックするごとに変化するので、随時確認してみてください。

すべての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から削除しておくようにしましょう。

おすすめ記事

記事・ニュース一覧