概要
EMR(≒YARN)上で動かすSparkアプリケーションを運用していて、エラーが起きた時にどのようにログを追っていくかを記します。
環境
- Hadoop: 2.7
- Spark: 1.6
- EMR: 4.6
エラーの検知
リトライも成功しなかった場合、EMRのコンソールで失敗が表示されると思います。
(ちなみに経験上、実行時間が30s以内でエラーになったらだいたいstepの記載ミス、60s程度で終わってたらアプリのパラメータミスなどによる初期化の失敗などではと思います。)
Sparkアプリの実行においては、いくつかエラーとなりうるところがあるので、順番に確認していきます。
なお、全体像はこのようになっています。(clusterモードでの実行の場合)
from: https://aws.amazon.com/blogs/big-data/submitting-user-applications-with-spark-submit/
YARN Client
まず、上記EMRコンソールのcontrollerというところで、EMRのStepの実行をリクエストしているログは確認できます。ただ、ここのログはSparkの場合はほとんどstepの内容と同じなため、ほとんど参考になりません
次に、上記EMRコンソールのstdout, stderrでは、YARN Clientのログが確認できます。ここもほとんど情報はないのですが、YARNへのリクエストが通っている場合、ApplicationのID( application_1497410000000_0001
など)が出ていると思います。この後、YARNやSpark Historyを見に行く時にこのIDで識別するため、覚えておいてください。
YARN
YARNのWeb UIを表示するとこのようになっていると思います。
まず、先ほど取得したApplicationIDでアプリケーションを特定します。
ApplicationIDをクリックすると、YARN上でのアプリの状態やログが追えます。
どのくらいリソース(メモリ、CPU)を割り当てられていたのか、最終的に成功したのか失敗したのか、どのノード上で実行されたのか、その時のログは何か、などが確認できるのが分かるかと思います。
(ちなみに、YARNのWeb UIでLogを見るとき、量が多すぎることを懸念してデフォルトではサマリだけ出しています。フルで見たい場合は、データ量を確認してから「click here」みたいなやつを押しましょう。)
用途としては、後述するSpark HistoryにApplicationが上がってこない(≒Sparkが立ち上がる前に落ちている)場合の原因究明に使います。
アプリケーションコードの中で、Sparkのcontextが生成されるまえにエラーが出ているのがよくあるパターンです。
Spark History UI
Sparkジョブの過去の結果についてはHistory Serverというところから確認できます。
ここに並んでいるのは完了したものだけで、未完了のApplicationの一覧表示はリンクから飛べます。
さて、ここでもApplicationIDで識別できるようになっているので、該当のアプリケーションをクリックして詳細を見ましょう。
SparkのWeb UIの説明は省きますが、ここでログを確認したり、どのstage/jobで落ちているのかを確認していきましょう。ログとしては大きくExecutor/Driverは見ておくと良いでしょう。
Spark UI
実行中のSparkアプリのログを見るときは、DriverNode(ApplicationMaster)を見る必要があります。
起動直後や終了済みでなければ、YARN WebUIの「History」のリンクを押すと飛べます。
数分以内のログ
EMRにおいては、Web UIで確認できるログはS3にアップされます。が、デフォルトで5分毎に送られるため、直近のものを見たければ実際にマシンにSSHなどでログインしてログを漁ることになります。
詳しくは過去の記事をご参照ください。EMRのログをS3/Localから追う