Wie veröffentliche und überwache ich den Status einer Amazon EMR-Anwendung mit der CloudWatch-Integration?
Ich möchte Amazon CloudWatch in Amazon EMR integrieren, um den Status der Anwendungen, die ich auf meinem Cluster installiert habe, zu veröffentlichen und zu überwachen. Ich möchte, dass CloudWatch mich benachrichtigt, wenn Anwendungen ausgefallen sind.
Kurzbeschreibung
Wenn du CloudWatch in Amazon EMR integrierst, kannst du den kritischen Status von Anwendungen verfolgen, die du installiert hast, wie z. B. HiveServer2 und YARN ResourceManager. Anschließend kannst du den Status in benutzerdefinierten CloudWatch-Metriken veröffentlichen und Warnungen für die Nichtverfügbarkeit von Services konfigurieren. Um zusätzliche Anwendungen zu verfolgen, kannst du die Anwendungsliste nach Bedarf ändern.
Lösung
Voraussetzungen:
- Amazon EMR Version 5.30.0 oder höher
- Amazon EMR-Instance-Profilrolle oder eine AWS Identity and Access Management (IAM)-Benutzerrolle mit cloudwatch:PutMetricData-Berechtigungen
Ein Skript zur Überwachung serAmazon EMR-Anwendungen erstellen
Du kannst ein Skript zur Überwachung der Amazon EMR-Anwendungen erstellen. Das folgende Beispielskript mit dem Namen check_process.sh überwacht YARN ResourceManager und HiveServer2 auf einem Primärknoten. Das Skript überwacht auch YARN NodeManager auf Core- und Task-Worker-Knoten. Um zusätzliche Anwendungen zu überwachen, kannst du Anwendungen im Abschnitt**# Monitor specific services** im Skript ändern.
Wie du das folgende Skript so konfigurierst, dass es zusätzliche Anwendungen einschließt, findest du unter Erstellen von Bootstrap-Aktionen, um zusätzliche Software mit einem Amazon EMR-Cluster zu installieren.
Beispielskript:
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
Wichtig: Bevor du das Skript in einer Produktionsumgebung ausführst, empfiehlt es sich, das Skript in einer Testumgebung zu testen.
Das vorhergehende Skript veröffentlicht benutzerdefinierte Metriken in CloudWatch. AWS teilt alle Gebühren für benutzerdefinierte Metriken pro Stunde auf und berechnet sie nur, wenn das Skript die Metriken an CloudWatch sendet. Weitere Informationen findest du unter Amazon CloudWatch-Preise.
Die Service-Überwachung auf dem Amazon EMR-Cluster konfigurieren
Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.
Verwende ein Bootstrap-Aktionsskript, um die automatische Service-Überwachung zu implementieren.
Führe die folgenden Schritte aus:
-
Um das Skript vorzubereiten, führe den folgenden AWS CLI-Befehl cp aus, um das Skript in einen Amazon Simple Storage Service (Amazon S3)-Bucket hochzuladen, auf den der Amazon EMR-Cluster zugreifen kann:
aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh -
Um das Skript auf jeden Cluster-Knoten zu kopieren und crontab zum Planen des Skripts zu verwenden, erstelle ein Bootstrap-Aktionsskript, das dem folgenden Beispiel ähnelt:
#!/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 -Hinweis: Passe die crontab-Dauer an die Anforderungen an.
-
Füge das Bootstrap-Aktionsskript zur Amazon EMR-Cluster-Konfigurationsdatei hinzu.
Hinweis: Die Amazon EMR EC2-Instance muss über die erforderlichen Mindestberechtigungen für den Zugriff auf die Skripts verfügen.
Nachdem du den Cluster gestartet hast, führe den folgenden Befehl auf den Cluster-Knoten aus, um zu bestätigen, dass Amazon EMR das Skript korrekt kopiert hat:
ls -l /home/hadoop/check_process.sh
Um zu bestätigen, dass du crontab richtig konfiguriert hast, führe den folgenden Befehl auf den Cluster-Knoten aus:
crontab -l
Protokolle überprüfen
Das Skript generiert detaillierte Protokolle und Statusprotokolle auf Cluster-Knoten. Überprüfe beide Protokolle, um zu überprüfen, ob das Skript ordnungsgemäß funktioniert.
Detaillierte Protokolle
Die Datei /var/log/hadoop/service-monitor-detailed.log enthält umfassende Protokolle mit Zeitstempeln, Cluster-ID, Instance-ID, Host-IP-Adresse, Knotentyp und Servicestatus.
Beispieldatei:
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.
Statusprotokolle
Die Datei /var/log/hadoop/service-monitor-status.log enthält Aufzeichnungen über den Servicestatus ohne die zusätzlichen Metadaten.
Beispieldatei:
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 verwenden, um Anwendungsmetriken zu überwachen
Das Skript sendet Metriken an CloudWatch, wenn eine Anwendung ausgefallen ist.
Gehe wie folgt vor, um die Metriken zu überwachen:
- Öffne die CloudWatch-Konsole.
- Wähle im Navigationsbereich unter Metriken die Option Alle Metriken.
- Wähle unter Metriken die Option EMR/ServiceStatus und wähle dann die ServiceStatus-Metrik aus.
- Filtere die Metriken nach den verfügbaren Dimensionen: ClusterId, InstanceId, NodeServiceName und NodeType.
Ähnliche Informationen
Erstellen eines CloudWatch-Alarms auf der Grundlage eines statischen Schwellenwerts
Amazon EMR und Anwendungsprozesse (Daemons) anzeigen und neu starten
- Themen
- Analytics
- Tags
- Amazon EMR
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 2 Monaten