概要
諸事情でYARNやSparkのWebUIがすぐに見れない、でもEMRのStepがなんか失敗しているのでログを見たい!というときにS3から見る方法。
というかEMRのログで作られる各中身の確認
前提
- emr-4.7
- Spark 1.6
- Hadoop 2.7
- ログ出力先にS3の任意のフォルダを指定。
ログディレクトリの構成
.
├──
└── [cluster-id]
├── containers
├── em
├── node
└── steps
cluster
EMR clusterはそれぞれIDを持ちます。(例: j-2540JQ2HFN027
)
containers
各Hadoopアプリケーションにおいて、分散環境上に複数のコンテナが立てられます。
各アプリケーションはIDを持ちます。(例: application_10000032000_0001
)
各コンテナはIDを持ちます。applicationのIDにコンテナ用の通し番号が付いた文字列になります。(例: container_10000032000_0001_02_000001
)
物理マシン : コンテナ = 1 : N
アプリケーション : コンテナ = 1 : N
の関係です。
このコンテナの中に各コンテナ上での実行ログが残されます。
em
EMRでチェックしているクラスタのメトリクスを保持しているっぽい。
が、ちゃんと調べてない。。。
node
各物理ノードのHadoop関係のプロセスのログが出ている。
- bootstrap-action
- yarn/hdfs
など。
steps
EMRでStep実行をした際のjarのプロセスログが表示される。
※ここでのログはあくまで実行するときのjarのログなので、Masterノードで動くプロセスのはず。たぶん。。。
stepはIDを持つ(例: s-10BFSXA1JCMAD
)
Sparkのログの追い方
- まずEMRのコンソール画面から、あるstepの実行がFailしていることを見つけます。
- 該当stepの実行ログ(上記stepsフォルダか、画面上のstderrなど)を確認する。
- applicationの起動以前であれば、ここで何かエラになっているはず。
- Application自体は立ち上がっている場合、applicationのIDが見つかる。
- そのApplicationのIDを元に、上記containersの該当Applicationを探す。
- 各containerのログを漁り、問題を特定する。
という流れになります。
(※S3上にログが置かれるのは5分間隔のようで、実行して直ぐだとまだログがS3に届いていない場合があります。)
localのファイルを読む場合
まだ実行中のStepや、今すぐにlogを見たい場合はS3でなくローカルに吐かれるファイルを見る必要がある。
MasterNode
sshログイン。
-
/mnt/var/log/hadoop/
- どうやってspark-submitされているかとかわかる。
Driver/ExecutorNode
SparkUIからDriver/ExecutorNodeのIPを探る。
sshで入った後、以下を調べる
-
/mnt/var/log/hadoop-yarn/containers/<対象のコンテナID>
- Sparkアプリのログが吐かれる。