CloudWatch 統合を使用して、Amazon EMR アプリケーションのステータスを発行および監視する方法を教えてください。
Amazon CloudWatch を Amazon EMR と統合し、クラスターにインストールしたアプリケーションのステータスを発行したり監視したりしたいと考えています。アプリケーションがダウンした際、CloudWatch からアラートを受信したいです。
簡単な説明
CloudWatch を Amazon EMR と統合すると、HiveServer2 や YARN ResourceManager など、インストールしたアプリケーションに関する重要なステータスを追跡できます。この方法では、ステータスを CloudWatch カスタムメトリクスに発行し、サービスが使用できない際のアラートを設定できます。必要に応じてアプリケーションリストを変更すると、他のアプリケーションも追跡できます。
解決策
前提条件:
- Amazon EMR バージョン 5.30.0 以降
- cloudwatch:PutMetricData アクセス許可を含む、Amazon EMR インスタンスプロファイルロールまたは AWS Identity and Access Management (IAM) ユーザーロール
Amazon EMR アプリケーションを監視するためのスクリプトを作成する
Amazon EMR アプリケーションを監視するためのスクリプトを作成します。次の、check_process.sh というスクリプト例では、プライマリノードの YARN ResourceManager および HiveServer2 を監視します。このスクリプトは、コアノードとタスクワーカーノードの YARN NodeManager も監視します。スクリプトの # Monitor specific services セクションでアプリケーションを変更すると、他のアプリケーションも監視できます。
次のスクリプトにおいて、追加のアプリケーションを含める設定を行う場合は、「Create bootstrap actions to install additional software with an Amazon EMR cluster」(ブートストラップアクションを作成し、Amazon EMR クラスターで追加のソフトウェアをインストールする) を参照してください。
スクリプト例:
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #!/bin/bash # Set up logging LOG_FILE="/var/log/hadoop/service-monitor-detailed.log" LOG_STATUS_FILE="/var/log/hadoop/service-monitor-status.log" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') CLUSTERID=$(jq -r ".jobFlowId" < /emr/instance-controller/lib/info/extraInstanceData.json) INSTANCEID=$(ec2-metadata -i | cut -d " " -f 2) HOSTIP=$(hostname -i) NODETYPE=$(cat /mnt/var/lib/instance-controller/extraInstanceData.json | jq -r '.instanceRole' | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}') # Function to log messages log_message() { echo "$TIMESTAMP - $1" >> "$LOG_FILE" echo "$TIMESTAMP - $1" } log_status_message() { echo "$TIMESTAMP - $1" >> "$LOG_STATUS_FILE" } # Function to send metric to CloudWatch send_to_cloudwatch() { local host_ip=$1 local service_name=$2 local status=$3 aws cloudwatch put-metric-data \ --namespace "EMR/ServiceStatus" \ --metric-name "ServiceStatus" \ --value "$status" \ --unit "Count" \ --dimensions ClusterId=$CLUSTERID,NodeServiceName=$service_name,InstanceId=$INSTANCEID,NodeType=$NODETYPE \ --timestamp "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ --region "${AWS_REGION:-us-east-1}" || { log_message "ERROR: Failed to send metric for service $service_name" return 1 } log_message "Successfully sent metric for service: $service_name (Status: $status)" } # Create log file if it doesn't exist touch "$LOG_FILE" touch "$LOG_STATUS_FILE" log_message "Starting service monitoring..." # Monitor specific services services=( "hive-server2" "hadoop-yarn-resourcemanager" "hadoop-yarn-nodemanager" ) service_names=( "HiveServer2" "YARN-ResourceManager" "YARN-NodeManager" ) for i in "${!services[@]}"; do # Check if service is disabled as not all services are running on all nodes if systemctl is-enabled "${services[$i]}" 2>/dev/null | grep -q "disabled"; then log_message "$CLUSTERID $INSTANCEID $HOSTIP $NODETYPE ${service_names[$i]}-Status DISABLED (ignored)" continue fi # Get service status status_output=$(systemctl status "${services[$i]}" 2>/dev/null) # Extract the process status process_status=$(echo "$status_output" | grep "Active:" | sed -E 's/Active: ([^ ]+) .*/\1/' | xargs) # Log message log_message "$CLUSTERID $INSTANCEID $HOSTIP $NODETYPE ${service_names[$i]}-Status $process_status" log_status_message "$CLUSTERID $INSTANCEID $HOSTIP $NODETYPE ${service_names[$i]}-Status $process_status" # Convert status to numeric value for CloudWatch status_value=0 if [ "$process_status" != "active" ]; then status_value=1 # Send to CloudWatch send_to_cloudwatch "$HOSTIP" "${service_names[$i]}" "$status_value" fi done log_message "Service monitoring completed." exit 0
重要: スクリプトを本番環境で実行する前に、そのスクリプトをテスト環境でテストすることをおすすめします。
上記のスクリプトは、カスタムメトリクスを CloudWatch に発行します。AWS はすべてのカスタムメトリクスに対する料金を時間単位で比例計算します。スクリプトがメトリクスを CloudWatch に送信したときにのみ計測されます。詳細については、「Amazon CloudWatch 料金」を参照してください。
Amazon EMR クラスターでサービス監視を構成する
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
自動サービス監視を実装するには、ブートストラップアクションスクリプトを使用します。
次の手順を実行します。
-
スクリプトの準備には、次の AWS CLI コマンド cp を実行し、スクリプトを Amazon EMR クラスターからアクセスできる Amazon Simple Storage Service (Amazon S3) バケットにアップロードします。
aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh -
スクリプトを各クラスターノードにコピーし、crontab を実行してスクリプトをスケジュールするには、ブートストラップアクションスクリプトを作成します。次の例を参照してください。
#!/bin/bash # Copy monitoring script from S3 aws s3 cp s3://your-bucket/monitoring/check_process.sh /home/hadoop/ chmod +x /home/hadoop/check_process.sh # Add to crontab (crontab -l 2>/dev/null; echo "*/5 * * * * /home/hadoop/check_process.sh") | crontab -注: 要件に合わせて crontab の期間を変更してください。
-
ブートストラップアクションスクリプトを Amazon EMR クラスターの構成ファイルに追加します。
注: Amazon EMR EC2 インスタンスには、スクリプトにアクセスするために必要最低限の権限が必要です。
クラスターを起動した後、クラスターノードで次のコマンドを実行し、Amazon EMR がスクリプトを正しくコピーしたことを確認します。
ls -l /home/hadoop/check_process.sh
crontab が正しく設定されていることを確認するには、クラスターノードで次のコマンドを実行します。
crontab -l
ログを確認する
このスクリプトは、クラスターノードに詳細ログとステータスログを生成します。スクリプトが正しく動作することを確認するには、両方のログを確認してください。
詳細ログ
/var/log/hadoop/service-monitor-detailed.log ファイルでは、タイムスタンプ、クラスター ID、インスタンス ID、ホスト IP アドレス、ノードタイプ、サービスステータスを含む包括的なログを取得できます。
ファイル例:
2025-05-06 23:07:01 - Starting service monitoring... 2025-05-06 23:07:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master HiveServer2-Status inactive 2025-05-06 23:07:01 - Successfully sent metric for service: HiveServer2 (Status: 1) 2025-05-06 23:07:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master YARN-ResourceManager-Status active 2025-05-06 23:07:01 - Service monitoring completed.
ステータスログ
/var/log/hadoop/service-monitor-status.log ファイルには、サービスステータスのレコードが含まれ、追加のメタデータは含まれません。
ファイル例:
2025-05-06 23:07:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master HiveServer2-Status inactive 2025-05-06 23:07:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master YARN-ResourceManager-Status active 2025-05-06 23:08:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master HiveServer2-Status inactive 2025-05-06 23:08:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master YARN-ResourceManager-Status failed 2025-05-06 23:09:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master HiveServer2-Status inactive 2025-05-06 23:09:01 - j-1O1234567890 i-0a6871234567890 111.xx.xx.92 Master YARN-ResourceManager-Status failed
CloudWatch を使用してアプリケーションメトリクスを監視する
このスクリプトは、アプリケーションがダウンした際に CloudWatch にメトリクスを送信します。
メトリクスを監視するには、次の手順を実行します。
- CloudWatch コンソールを開きます。
- ナビゲーションペインの [メトリクス] で [すべてのメトリクス] を選択します。
- [メトリクス] で [EMR/ServiceStatus] を選択し、[ServiceStatus] メトリクスを選択します。
- 次の使用可能なディメンションでメトリクスをフィルターします: ClusterId、InstanceId、NodeServiceName、NodeType。
関連情報
静的しきい値に基づいて CloudWatch アラームを作成する
View and restart Amazon EMR and application processes (daemons) (Amazon EMR とアプリケーションプロセス (デーモン) の確認および再起動)

