Amazon EMR クラスターのログ記録とデバッグを設定する - Amazon EMR

Amazon EMR クラスターのログ記録とデバッグを設定する

クラスターの計画時に決定すべき事項の 1 つは、どの程度のデバッグサポートを必要とするかです。データ処理アプリケーションを初めて導入するお客様に対しては、小規模で典型的なデータサブセットを処理するアプリケーションをクラスターでテストすることをお勧めします。これを行う場合は、Amazon EMR が提供するあらゆるデバッグツール (Simple Storage Service (Amazon S3) へのログファイルのアーカイブなど) を利用する可能性があります。

導入を終了し、データ処理アプリケーションをフル稼働状態に移行させたら、デバッグの規模を縮小してもかまいません。デバッグの規模を縮小すると、Simple Storage Service (Amazon S3) にログファイルアーカイブを格納するのにかかるコストを節約できるほか、Simple Storage Service (Amazon S3) への状態の書き込みが必要でなくなるので、クラスターでの処理負荷を軽減することができます。もちろん、その反面、何かうまくいかないことがあっても問題を調査するのに使用できるツールは少なくなります。

デフォルトログファイル

デフォルトで各クラスターはプライマリノードにログファイルを書き込みます。その書き込み先は、/mnt/var/log/ ディレクトリです。書き込まれたログファイルにアクセスするには、SSH を使用してプライマリノードに接続します (「SSH を使用して Amazon EMR クラスタープライマリノードに接続する」を参照)。Amazon EMR は、Amazon EMR デーモンやその他の Amazon EMR プロセスによって生成された特定のシステムログとアプリケーションログを収集して、効果的なサービスオペレーションを確保します。

注記

Amazon EMR リリース 6.8.0 以前を使用している場合、ログファイルはクラスターの終了時に Amazon S3 に保存されるため、プライマリノードが終了するとログファイルにアクセスできなくなります。Amazon EMR リリース 6.9.0 以降は、クラスターのスケールダウン中にログを Amazon S3 にアーカイブするため、クラスターで生成されたログファイルは、ノードが終了した後も保持されます。

何かの設定を有効にしなくても、ログファイルはプライマリノードに書き込まれます。これは、Amazon EMR および Hadoop のデフォルト動作です。

クラスターでは、以下のような数種類のログファイルが生成されます。

  • ステップログ — これは Amazon EMR サービスによって生成されるログファイルであり、クラスターに関する情報と各ステップの結果を含みます。このログファイルは、プライマリノードの /mnt/var/log/hadoop/steps/ ディレクトリに格納されます。各ステップは個別に番号が振られたサブディレクトリにそれぞれの結果を記録します。すなわち、1 番目のステップの場合は /mnt/var/log/hadoop/steps/s-stepId1/ に記録され、2 番目のステップの場合は /mnt/var/log/hadoop/steps/s-stepId2/ に記録される、といった具合です。13 文字のステップ識別子(stepId1、stepId2 など)は、クラスターに固有です。

  • Hadoop および YARN コンポーネントログ — Apache YARN と MapReduce の両方に関連付けられたコンポーネントのログは、例えば /mnt/var/log 内の個別のフォルダに保存されます。/mnt/var/log にある Hadoop コンポーネントのログファイルの場所は、hadoop-hdfs、hadoop-mapreduce、hadoop-httpfs、hadoop-yarn です。hadoop-state-pusher ディレクトリは、Hadoop の状態プッシャープロセスの出力に使用されます。

  • ブートストラップアクションログ — ブートストラップアクションがジョブで使用された場合に、そのアクションの結果がログに記録されます。このログファイルは、プライマリノードの /mnt/var/log/bootstrap-actions/ ディレクトリに格納されます。各ブートストラップアクションは個別に番号が振られたサブディレクトリにそれぞれの結果を記録します。すなわち、1 番目のブートストラップアクションの場合は /mnt/var/log/bootstrap-actions/1/ に記録され、2 番目のブートストラップアクションの場合は /mnt/var/log/bootstrap-actions/2/ に記録される、といった具合です。

  • インスタンス状態ログ — このログは、CPU に関する情報、メモリの状態、およびノードのガベージコレクタースレッドです。このログファイルは、プライマリノードの /mnt/var/log/instance-state/ に格納されます。

Simple Storage Service (Amazon S3) にログファイルをアーカイブする

注記

現在、yarn logs ユーティリティを使って Simple Storage Service (Amazon S3) にログを集計することはできません。

Amazon EMR リリース 6.9.0 以降は、クラスターのスケールダウン中にログを Amazon S3 にアーカイブするため、クラスターで生成されたログファイルは、ノードが終了した後も保持されます。この動作は自動的に有効になるため、有効にするために何もする必要はありません。Amazon EMR リリース 6.8.0 以前は、クラスターを設定することにより、プライマリノードに格納されているログファイルを Simple Storage Service (Amazon S3) に定期的にアーカイブすることができます。こうすれば、クラスターの終了の理由が通常のシャットダウンかエラーのいずれであっても、クラスターの終了後にログファイルを確実に利用できます。Amazon EMR は、5 分間隔でログファイルを Simple Storage Service (Amazon S3) にアーカイブします。

Amazon EMR リリース 6.8.0 以前でログファイルが Simple Storage Service (Amazon S3) にアーカイブされるようにするには、クラスターの起動時に、この機能を有効にする必要があります。これは、コンソール、CLI または API を使用すれば可能です。デフォルトでは、コンソールを使用して起動したクラスターは、ログのアーカイブが有効になってます。CLI または API を使用して起動したクラスターは、Simple Storage Service (Amazon S3) へのログ記録を手動で有効にする必要があります。

Console
新しいコンソールを使用して Simple Storage Service (Amazon S3) にログファイルをアーカイブするには
  1. AWS Management Consoleにサインインし、Amazon EMR コンソール (https://console.aws.amazon.com/emr) を開きます。

  2. 左側のナビゲーションペインの [EMR on EC2] で、[クラスター] を選択し、[クラスターの作成] を選択します

  3. [クラスターログ] で、[クラスター固有のログを Amazon S3 に公開] チェックボックスを選択します。

  4. [Amazon S3 のロケーション] フィールドに、ログを格納する Simple Storage Service (Amazon S3) のパスを入力 (または参照) します。バケットに存在しないフォルダの名前を入力した場合、Amazon S3 によりそのフォルダが作成されます。

    この値が設定されると、Amazon EMR はクラスターの EC2 インスタンスからのログファイルを Simple Storage Service (Amazon S3) にコピーします。これにより、クラスターの終了時およびクラスターをホストしているインスタンスを EC2 が終了してもログファイルが失われるのを回避できます。これらのログは、トラブルシューティングに役立ちます。詳細については、「ログファイルを表示する」を参照してください。

  5. オプションで、[クラスター固有のログを暗号化] チェックボックスを選択します。次に、リストから AWS KMS キーを選択するか、キーの ARN を入力するか、または新しいキーを作成します。このオプションは、Amazon EMR バージョン 5.30.0 以降 (バージョン 6.0.0 は除く) でのみ使用できます。このオプションを使用するには、EC2 インスタンスプロファイルと Amazon EMR ロールに AWS KMS へのアクセス許可を追加します。詳細については、「AWS KMS カスタマーマネージドキーを使用して Simple Storage Service (Amazon S3) に格納されたログファイルを暗号化するには」を参照してください。

  6. クラスターに適用するその他のオプションを選択します。

  7. クラスターを起動するには、[クラスターの作成] を選択します。

CLI
AWS CLI を使用して Simple Storage Service (Amazon S3) にログファイルをアーカイブするには

AWS CLI を使用して Simple Storage Service (Amazon S3) にログファイルをアーカイブするには、create-cluster コマンドを入力し、--log-uri パラメータを使用して Simple Storage Service (Amazon S3) のログのパスを指定します。

  1. Simple Storage Service (Amazon S3) にログファイルをアーカイブするには、次のコマンドを入力し、myKey を EC2 キーペアの名前に置き換えます。

    aws emr create-cluster --name "Test cluster" --release-label emr-7.3.0 --log-uri s3://DOC-EXAMPLE-BUCKET/logs --applications Name=Hadoop Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3
  2. --instance-groups パラメータを使用せずにインスタンス数を指定すると、1 つのプライマリノードが起動され、残りのインスタンスはコアノードとして起動されます。すべてのノードで、コマンドで指定したインスタンスタイプが使用されます。

    注記

    以前にデフォルトの Amazon EMR サービスロールと EC2 インスタンスプロファイルを作成していない場合は、「aws emr create-default-roles」と入力してそれらを作成してから、create-cluster サブコマンドを入力します。

AWS KMS カスタマーマネージドキーを使用して Simple Storage Service (Amazon S3) に格納されたログファイルを暗号化するには

Amazon EMR バージョン 5.30.0 以降 (Amazon EMR 6.0.0 を除く) では、AWS KMS カスタマーマネージドキーを使用して Simple Storage Service (Amazon S3) に格納されたログファイルを暗号化することができます。コンソールでこのオプションを有効にするには、「Simple Storage Service (Amazon S3) にログファイルをアーカイブする」の手順に従います。Amazon EC2 インスタンスプロファイルと Amazon EMR ロールは、以下の前提条件を満たしている必要があります。

  • クラスターで使用する Amazon EC2 インスタンスプロファイルには、kms:GenerateDataKey を使用するアクセス許可が必要です。

  • クラスターで使用する Amazon EMR ロールには、kms:DescribeKey を使用するアクセス許可が必要です。

  • 次の手順に示すように、指定した AWS KMS カスタマーマネージドキーのキーユーザーのリストに Amazon EC2 インスタンスプロファイルと Amazon EMR ロールを追加する必要があります。

    1. https://console.aws.amazon.com/kms で AWS Key Management Service (AWS KMS) コンソールを開きます。

    2. AWS リージョンを変更するには、ページの右上隅にあるリージョンセレクターを使用します。

    3. 変更する KMS キーのエイリアスを選択します。

    4. [Key Users] のキーの詳細ページで、[Add] を選択します。

    5. [キーユーザーの追加] ダイアログボックスで、Amazon EC2 インスタンスプロファイルと Amazon EMR ロールを選択します。

    6. [追加] を選択します。

詳細については、「Amazon EMR で使用する IAM サービスロール」と「AWS Key Management Service デベロッパーガイド」の「キーポリシーの使用」を参照してください。

AWS CLI を使用して Simple Storage Service (Amazon S3) でログを集計するには

注記

現在、yarn logs ユーティリティを使ってログを集計することはできません。この手順でサポートされる集計のみ使用できます。

ログ集計(Hadoop 2.x)では、個々のアプリケーションのすべてのコンテナのログが 1 つのファイルにコンパイルされます。AWS CLI を使用して Simple Storage Service (Amazon S3) へのログの集計を有効にするには、クラスターの起動時にブートストラップアクションを使用してログの集計を有効にし、ログを格納するバケットを指定します。

  • ログ集計を有効にするには、次の内容が含まれる myConfig.json と呼ばれる設定ファイルを作成します。

    [ { "Classification": "yarn-site", "Properties": { "yarn.log-aggregation-enable": "true", "yarn.log-aggregation.retain-seconds": "-1", "yarn.nodemanager.remote-app-log-dir": "s3:\/\/DOC-EXAMPLE-BUCKET\/logs" } } ]

    次のコマンドを入力し、myKey を EC2 キーペアの名前に置き換えます。さらに、赤色のテキストはいずれも独自の設定に置き換えることができます。

    aws emr create-cluster --name "Test cluster" \ --release-label emr-7.3.0 \ --applications Name=Hadoop \ --use-default-roles \ --ec2-attributes KeyName=myKey \ --instance-type m5.xlarge \ --instance-count 3 \ --configurations file://./myConfig.json

    --instance-groups パラメータを使用せずにインスタンス数を指定すると、1 つのプライマリノードが起動され、残りのインスタンスはコアノードとして起動されます。すべてのノードで、コマンドで指定したインスタンスタイプが使用されます。

    注記

    以前にデフォルトの EMR サービスロールと EC2 インスタンスプロファイルを作成していない場合は、「aws emr create-default-roles」を実行してそれらを作成してから、create-cluster サブコマンドを入力します。

AWS CLI での Amazon EMR コマンドの使用の詳細については、「AWS CLI コマンドリファレンス」を参照してください。

ログの場所

次のリストに、Amazon S3 のすべてのログタイプとそれらの場所を示します。Amazon EMR の問題のトラブルシューティングにこれらを使用できます。

ステップログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/steps/<step-id>/

アプリケーションログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/containers/

この場所には、stderr コンテナと stdoutdirectory.infoprelaunch.out、および launch_container.sh ログが含まれます。

リソースマネージャーログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hadoop-yarn/

Hadoop HDFS

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-hdfs/

この場所には、NameNode、DataNode、および YARN TimelineServer のログが含まれます。

ノードマネージャーログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-yarn/

インスタンス状態ログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/daemons/instance-state/

Amazon EMR プロビジョニングログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/provision-node/*

Hive ログ

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hive/*

  • クラスター上の Hive ログを見つけるには、アスタリスク (*) を削除して、/var/log/hive/ を上記のリンクに追加します。

  • HiveServer2 ログを見つけるには、アスタリスク (*) を削除して、var/log/hive/hiveserver2.log を上記のリンクに追加します。

  • HiveCLI ログを見つけるには、アスタリスク (*) を削除して、/var/log/hive/user/hadoop/hive.log を上記のリンクに追加します。

  • Hive メタストアサーバーログを見つけるには、アスタリスク (*) を削除して、/var/log/hive/user/hive/hive.log を上記のリンクに追加します。

Tez アプリケーションのプライマリノードまたはタスクノードで障害が発生している場合は、適切な Hadoop コンテナのログを提供してください。