Comment publier et surveiller l'état d'une application Amazon EMR grâce à l'intégration de CloudWatch ?
Je souhaite intégrer Amazon CloudWatch à Amazon EMR pour publier et surveiller l'état des applications que j'ai installées sur mon cluster. Je souhaite que CloudWatch m'alerte lorsque des applications sont indisponibles.
Brève description
Lorsque vous intégrez CloudWatch à Amazon EMR, vous pouvez suivre les états critiques des applications que vous avez installées, telles que HiveServer2 et YARN ResourceManager. Puis, vous pouvez publier les états dans les métriques personnalisées de CloudWatch et configurer des alertes en cas d'indisponibilité du service. Pour suivre les applications supplémentaires, vous pouvez modifier la liste d’applications selon vos besoins.
Résolution
Prérequis :
- Amazon EMR version 5.30.0 ou ultérieure
- Rôle de profil d'instance Amazon EMR ou rôle d'utilisateur Gestion des identités et des accès AWS (AWS IAM) doté des autorisations cloudwatch:PutMetricData.
Créer un script pour surveiller vos applications Amazon EMR
Vous pouvez créer un script pour surveiller vos applications Amazon EMR. L'exemple de script suivant, nommé check_process.sh surveille YARN ResourceManager et HiveServer2 sur un nœud principal. Le script surveille également YARN NodeManager sur les nœuds principaux et de composants master. Pour surveiller des applications supplémentaires, vous pouvez modifier les applications dans la section # Surveiller des services spécifiques du script.
Pour configurer le script suivant afin d'inclure des applications supplémentaires, consultez la section Créer des actions de démarrage pour installer des logiciels supplémentaires avec un cluster Amazon EMR.
Exemple de script :
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
Important : Avant d'exécuter le script dans un environnement de production, il est recommandé de le tester dans un environnement de test.
Le script précédent publie des métriques personnalisées sur CloudWatch. AWS calcule au prorata de l’heure tous les frais liés aux métriques personnalisées et ne les comptabilise que lorsque le script envoie les métriques à CloudWatch. Pour plus d’informations, consultez la section Tarification Amazon CloudWatch.
Configurer la surveillance des services sur votre cluster Amazon EMR
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.
Pour implémenter la surveillance automatique des services, utilisez un script d'action de démarrage.
Procédez comme suit :
-
Pour préparer le script, exécutez la commande cp de l’AWS CLI suivante pour charger le script vers un compartiment Amazon Simple Storage Service (Amazon S3) auquel votre cluster Amazon EMR peut accéder :
aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh -
Pour copier le script sur chaque nœud du cluster et utiliser crontab pour planifier le script, créez un script d'action de démarrage similaire à l'exemple suivant :
#!/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 -Remarque : Modifiez la durée de crontab selon vos besoins.
-
Ajoutez le script d'action de démarrage au fichier de configuration du cluster Amazon EMR.
Remarque : L'instance EC2 Amazon EMR doit disposer des autorisations minimales requises pour accéder aux scripts.
Après avoir lancé le cluster, exécutez la commande suivante sur les nœuds de votre cluster pour vérifier qu'Amazon EMR a correctement copié le script :
ls -l /home/hadoop/check_process.sh
Pour vérifier que vous avez correctement configuré crontab, exécutez la commande suivante sur les nœuds du cluster :
crontab -l
Examiner les journaux
Le script génère des journaux détaillés et des journaux d'état sur les nœuds de cluster. Pour vérifier que le script fonctionne correctement, consultez les deux journaux.
Journaux détaillés
Le fichier /var/log/hadoop/service-monitor-detailed.log fournit des journaux complets avec les horodatages, l’ID de cluster, l’ID d'instance, l’adresse IP de l'hôte, le type de nœud et l’état du service.
Exemple de fichier :
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.
Journaux d'état
Le fichier /var/log/hadoop/service-monitor-status.log contient des enregistrements de l'état de service sans les métadonnées supplémentaires.
Exemple de fichier :
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
Utiliser CloudWatch pour surveiller les métriques d’application
Le script envoie des métriques à CloudWatch lorsqu'une application est en panne.
Pour surveiller les métriques, procédez comme suit :
- Ouvrez la console CloudWatch.
- Dans le volet de navigation, sous Métriques, sélectionnez Toutes les métriques.
- Sous Métriques, choisissez EMR/ServiceStatus, puis sélectionnez la métrique ServiceStatus.
- Filtrez les métriques selon les dimensions disponibles : ClusterId, InstanceId, NodeServiceName et NodeType.
Informations connexes
Créer une alarme CloudWatch basée sur un seuil statique
Afficher et redémarrer Amazon EMR et les processus d’application (démons)
- Sujets
- Analytics
- Balises
- Amazon EMR
- Langue
- Français

Contenus pertinents
- demandé il y a 2 ans
- demandé il y a 2 ans
AWS OFFICIELA mis à jour il y a 2 ans