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-
に記録され、2 番目のステップの場合はstepId1
//mnt/var/log/hadoop/steps/s-
に記録される、といった具合です。13 文字のステップ識別子(stepId1、stepId2 など)は、クラスターに固有です。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) へのログ記録を手動で有効にする必要があります。
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 ロールを追加する必要があります。
-
https://console.aws.amazon.com/kms
で AWS Key Management Service (AWS KMS) コンソールを開きます。 -
AWS リージョンを変更するには、ページの右上隅にあるリージョンセレクターを使用します。
-
変更する KMS キーのエイリアスを選択します。
-
[Key Users] のキーの詳細ページで、[Add] を選択します。
-
[キーユーザーの追加] ダイアログボックスで、Amazon EC2 インスタンスプロファイルと Amazon EMR ロールを選択します。
-
[追加] を選択します。
-
詳細については、「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" } } ]次のコマンドを入力し、
を EC2 キーペアの名前に置き換えます。さらに、赤色のテキストはいずれも独自の設定に置き換えることができます。myKey
aws emr create-cluster --name "
Test cluster
" \ --release-labelemr-7.3.0
\ --applications Name=Hadoop
\ --use-default-roles \ --ec2-attributes KeyName=myKey
\ --instance-typem5.xlarge
\ --instance-count3
\ --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
コンテナとstdout
、directory.info
、prelaunch.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 コンテナのログを提供してください。
-