Amazon EMR クラスターで Spark ドライバーのログにアクセスする方法を教えてください。
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
詳細については、「Simple Storage Service (Amazon S3) にアーカイブされたログファイルを表示する」を参照してください。
ステップログを 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 に保存されます。
アプリケーション固有のログへのアクセスについては、「Simple Storage Service (Amazon S3) にアーカイブされたログファイルを表示する」を参照してください。
クラスターモードのジョブ
クラスターモードで 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
関連情報
関連するコンテンツ
- 質問済み 7年前lg...
- 質問済み 2年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前