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

所要時間2分
0

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) インスタンスにステップログをダウンロードし、警告とエラーを検索します。

次の手順を実行します。

  1. 次の sync コマンドを実行してステップログをダウンロードします。

    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 filename\;

    注: filename は、実際のファイル名に置き換えます。

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

    grep "Client: Application report for" * | tail -n 1
  5. 次のコマンドを実行してクライアントモードログのエラーと警告を検索します。

    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 アプリケーションのレポートをログに記録します。

ドライバーログを取得するには、次の手順を実行します。

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

    19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)
  2. アプリケーションのプライマリコンテナログを特定します。
    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 です。

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

    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 アプリケーションのコンテナログを取得できます。

    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
  8. クラスターモードで送信する 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 をノードのアドレスに置き換えます。

関連情報

Amazon EMR クラスターのトラブルシューティング

Spark を設定する

AWS公式更新しました 4ヶ月前
コメントはありません

関連するコンテンツ