Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Amazon EMR クラスター上の Spark ドライバーログにアクセスする方法を教えてください。
Amazon EMR クラスター上の Apache Spark ドライバーログにアクセスし、Spark アプリケーションをトラブルシューティングしたいです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon EMR では、Spark は YARN アプリケーションとして実行され、クライアントモードとクラスターモードでのデプロイをサポートします。
クライアントモードのジョブ
クライアントモードがデフォルトのデプロイモードです。クライアントモードでは、Spark ドライバーは spark-submit コマンドを実行したホスト上で実行されます。プライマリノードで --deploy-mode client を指定して spark-submit コマンドを実行すると、ターミナルウィンドウにドライバーログが表示されます。Amazon EMR はデフォルトではこれらのログをアーカイブしません。ログをキャプチャするには、spark-submit コマンドの出力をファイルに保存します。
コマンド例
spark-submit [--deploy-mode client] ... 1>output.log 2>error.log
Amazon EMR ステップを使用して Spark アプリケーションを送信すると、Amazon EMR はドライバーログを Amazon Simple Storage Service (Amazon S3) で stderr.gz ファイルにアーカイブします。ファイルパスは次の形式です。
s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz
詳細については、「Amazon S3 にアーカイブされたログファイルを表示する」を参照してください。
Spark ドライバーログにアクセスするには、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにステップログをダウンロードし、警告とエラーを検索します。
次の手順を実行します。
-
次の sync コマンドを実行してステップログをダウンロードします。
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
-
次のコマンドを実行してステップログのフォルダを開きます。
cd s-2M809TD67U2IA/
-
次のコマンドを実行してログファイルを解凍します。
find . -type f -exec gunzip filename\;
注: filename は、実際のファイル名に置き換えます。
-
次のコマンドを実行してクラスターモードログから YARN アプリケーション ID を取得します。
grep "Client: Application report for" * | tail -n 1
-
次のコマンドを実行してクライアントモードログのエラーと警告を検索します。
egrep "WARN|ERROR" *
JupyterHub、Apache Livy、Apache Zeppelin などのアプリケーションをクライアントとして使用しても、Spark アプリケーションをクラスターに送信できます。アプリケーションは、そのアプリケーションのログ内のドライバーログをプライマリノードの /mnt/var/log/ フォルダに保存します。
圧縮されたログは、Amazon S3 パス s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/ にもあります。
Zeppelin を使用している場合は、Spark ドライバーログの場所は /mnt/var/log/zeppelin/zeppelin-interpreter-spark-##########.log です。
Jupyter のドライバーログは、Livy ログ /mnt/var/log/livy/livy-livy-server.out にあります。
クラスターモードのジョブ
Spark アプリケーションをクラスターモードで送信する際、ドライバープロセスはアプリケーションのプライマリコンテナで実行されます。アプリケーションのプライマリとは、Spark アプリケーションの実行時に最初に実行されるコンテナです。クライアントは YARN アプリケーションのレポートをログに記録します。
ドライバーログを取得するには、次の手順を実行します。
-
クライアントログからアプリケーション ID を取得します。
アプリケーション ID application_1572839353552_0008 での出力例。19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)
-
アプリケーションのプライマリコンテナログを特定します。
Spark アプリケーションログのリスト例`s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stdout.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stderr.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stdout.gz`
注: リストの最初のコンテナが、常にプライマリコンテナになります。上記のリストでは、プライマリコンテナは container_1572839353552_0008_01_000001 です。
-
次の sync コマンドを実行し、アプリケーションのプライマリコンテナログをインスタンスにダウンロードします。
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
-
次のコマンドを実行して Spark アプリケーションログのフォルダを開きます。
cd application_1572839353552_0008/
-
次のコマンドを実行してログファイルを解凍します。
find . -type f -exec gunzip {} \;
-
次のコマンドを実行してすべてのコンテナログからエラーと警告を検索します。
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
-
次のコマンドを実行してアプリケーションのプライマリコンテナが実行されたノードのアドレスを取得します。実行中のクラスターで YARN CLI を使用すると、YARN アプリケーションのコンテナログを取得できます。
yarn logs -applicationId application_1585844683621_0001 | grep 'Container: container_1585844683621_0001_01_000001'
想定される出力
20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-###-##-##-##.us-west-2.compute.internal/###.##.##.##:8032 Container: container_1585844683621_0001_01_000001 on ip-###-##-##-##.us-west-2.compute.internal_8041
-
クラスターモードで送信する Spark アプリケーションの場合、次のコマンドを実行してアプリケーションのプライマリコンテナーログを取得します。
yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-###-##-##-##.us-west-2.compute.internal
注: 実際のものでそれぞれ、applicationId をアプリケーションの ID に、containerId をコンテナの ID に、nodeAddress ip をノードのアドレスに置き換えます。
関連情報
