Amazon Athena を使用して Amazon EMR Spark ジョブの失敗をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 3 月 11 日

Amazon EMR で Spark ジョブが失敗しました。Amazon Athena を使用して Spark ログを照会して、失敗のトラブルシューティングを行います。

解決方法

Amazon EMR アプリケーションを Amazon EMR で実行すると、ログファイルが生成されます。EMR ログファイルの基本テーブルを作成し、Athena を使用してこれらの EMR ログを照会することができます。EMR ログを照会することで、アプリケーションとクラスターのイベントや傾向を特定できます。

次のようなコマンドを実行し、Amazon S3 ログの場所に保存された EMR ログファイルに基づいて、基本テーブル myemrlogs を作成します。

CREATE EXTERNAL TABLE `myemrlogs`(
  `data` string COMMENT 'from deserializer')
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://aws-logs-111122223333-us-west-2/elasticmapreduce/j-1ABCDEEXAMPLE/containers/application_1111222233334_5555/'

上記の照会では、以下を置き換えます。

  • myemrlogs をテーブルの名前に
  • 111122223333 を AWS アカウント番号に
  • j-1ABCDEEXAMPLE をクラスター ID に
  • us-west-2 を希望するリージョンに
  • application_1111222233334_5555 をアプリケーション ID に

注意: 例に示されている S3 バケットは、Amazon EMR で使用されるデフォルトのバケットです。ログバケットのパスを確認するには、Amazon EMR コンソールを開き、クラスターを選択してから、[Summary] タブの [Log URI] フィールドにチェックを入れます。

次に、次のようなコマンドを実行して、myemrlogs で FAIL、ERROR、WARN、EXCEPTION、FATAL、CAUSE が発生しているか確認します。

SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'FAIL|ERROR|WARN|EXCEPTION|FATAL|CAUSE') limit 100;

注意: myemrlogs を EMR ログファイルから作成したテーブルの名前に置き換えます。

EMR ログをさまざまな方法で照会して、Spark アプリケーションがどのステップで失敗したかを知ることができます。ここでは、ログを照会して、アプリケーションがジョブ、ステージ、タスク、またはエグゼキュータのレベルで失敗した場合のトラブルシューティングを行う方法をいくつか紹介します。

次のようなコマンドを実行して、アプリケーションの終了コードを取得します。

SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'exitCode');

次のようなコマンドを実行して、Spark エグゼキュータが実行されているホストを確認します。

SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'executor ID');

次のようなコマンドを実行して、タスクからステージへのマッピングを追跡します。

SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'TID');

次のようなコマンドを実行して、コンテナのヒープメモリの詳細を確認します。

SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'space');

次のようなコマンドを実行して、Directed Acyclic Graph (DAG) スケジューラで各ジョブ/ステージの進行状況を追跡します。

SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'DAGScheduler');

Amazon EMR ログに基づいてパーティションテーブルを作成し、Athena を使用してこれらのログを照会することもできます。詳細については、Amazon EMR ログに基づくパーティションテーブルの作成と照会を参照してください。