Amazon EMR クラスターで Spark ドライバーのログにアクセスする方法を教えてください。

最終更新日: 2020 年 4 月 13 日

Apache Spark アプリケーションのトラブルシューティングが必要です。Amazon EMR クラスターで Spark ドライバーのログにアクセスする方法を教えてください。

説明

Amazon EMR では、Spark は YARN アプリケーションとして実行され、2 つのデプロイモードをサポートします。

  • クライアントモード: デフォルトのデプロイモード。クライアントモードでは、spark ドライバーは、spark-submit コマンドが実行されるホスト上で実行されます。
  • クラスターモード: Spark ドライバーはアプリケーションマスターで実行されます。アプリケーションマスターは、Spark ジョブの実行時に実行される最初のコンテナです。

解決方法

クライアントモードのジョブ

マスターノードで --deploy-mode client を指定して spark-submit を実行し、Spark アプリケーションを送信すると、ターミナルウィンドウにドライバーログが表示されます。Amazon EMR は、デフォルトではこれらのログをアーカイブしません。ログをキャプチャするには、spark-submit コマンドの出力をファイルに保存します。例:

$ spark-submit [--deploy-mode client] ... 1>output.log 2>error.log

Amazon EMR ステップを使用して Spark アプリケーションを送信すると、ドライバーログは Amazon Simple Storage Service (Amazon S3) の stderr.gz ファイルにアーカイブされます。ファイルパスは次のようになります。

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz

詳細については、ログファイルを表示するを参照してください。

ステップログを Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにダウンロードし、警告とエラーを検索します。

1.    ステップログをダウンロードします。

aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/

2.    ステップログフォルダを開きます。

cd s-2M809TD67U2IA/

3.    ログファイルを解凍します。

find . -type f -exec gunzip {} \;

4.    クラスターモードのログから YARN アプリケーション ID を取得します。

grep "Client: Application report for" * | tail -n 1

5.    クライアントモードのログでエラーと警告を見つけます。

egrep "WARN|ERROR" *

JupyterHub、Apache Livy、Apache Zeppelin などのアプリケーションを使用して Spark アプリケーションを送信することもできます。これらのアプリケーションは、Spark アプリケーションをクラスターに送信するクライアントになります。このシナリオでは、ドライバーログは、マスターノードの /mnt/var/log/ フォルダ内にある、対応するアプリケーションのログに保存されます。次の Amazon S3 パスで圧縮ログを見つけることもできます。

s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/

たとえば、Zeppelin を使用している場合、Spark ドライバーのログは /mnt/var/log/zeppelin/zeppelin-interpreter-spark-xxxxxxxxxx.log にあります。

注: Jupyter の場合、ドライバーログは Livy ログ: /mnt/var/log/livy/livy-livy-server.out に保存されます。

アプリケーション固有のログへのアクセスについては、ログファイルを表示するを参照してください。

クラスターモードのジョブ

クラスターモードで Spark アプリケーションを送信すると、ドライバープロセスがアプリケーションマスターコンテナで実行されます。アプリケーションマスターは、Spark アプリケーションの実行時に実行される最初のコンテナです。クライアントは YARN アプリケーションレポートを記録します。ドライバーログの取得方法:

1.    クライアントログからアプリケーション ID を取得します。次の例では、application_1572839353552_0008 がアプリケーション ID です。

19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)

2.    アプリケーションマスターコンテナのログを特定します。以下は、Spark アプリケーションログのリストの例です。このリストでは、container_1572839353552_0008_01_000001 が最初のコンテナです。つまり、アプリケーションマスターコンテナです。

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

3.    アプリケーションマスターコンテナのログを EC2 インスタンスにダウンロードします。

aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/

4.    Spark アプリケーションログフォルダを開きます。

cd application_1572839353552_0008/

5.    ログファイルを解凍します。

find . -type f -exec gunzip {} \;

6.    すべてのコンテナログでエラーと警告を検索します。

egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

7.    前のコマンドの出力で返されたコンテナログを開きます。

実行中のクラスターでは、YARN CLI を使用して YARN アプリケーションコンテナログを取得できます。クラスターモードで送信された Spark アプリケーションの場合、次のようにアプリケーションマスターコンテナのログを取得することで、Spark ドライバーのログにアクセスできます。

# 1. Get the address of the node that the application master container ran on
$ 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-xxx-xx-xx-xx.us-west-2.compute.internal/xxx.xx.xx.xx:8032
Container: container_1585844683621_0001_01_000001 on ip-xxx-xx-xx-xx.us-west-2.compute.internal_8041

# 2. Use the node address to pull the container logs
$ yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-xxx-xx-xx-xx.us-west-2.compute.internal

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合