¿Cómo publico y superviso el estado de una aplicación de Amazon EMR con la integración de CloudWatch?
Quiero integrar Amazon CloudWatch con Amazon EMR para publicar y supervisar los estados de las aplicaciones que he instalado en mi clúster. Quiero que CloudWatch me avise cuando las aplicaciones estén inactivas.
Descripción corta
Al integrar CloudWatch con Amazon EMR, puedes realizar un seguimiento de los estados críticos de las aplicaciones que has instalado, como HiveServer2 y YARN ResourceManager. A continuación, puedes publicar los estados en las métricas personalizadas de CloudWatch y configurar alertas para detectar la falta de disponibilidad del servicio. Para realizar un seguimiento de las aplicaciones adicionales, puedes modificar la lista de aplicaciones según sea necesario.
Resolución
Requisitos previos:
- versión 5.30.0 o posterior de Amazon EMR
- Rol del perfil de instancia de Amazon EMR o rol de usuario de AWS Identity and Access Management (IAM) con permisos cloudwatch:PutMetricData
Creación de un script para supervisar las aplicaciones de Amazon EMR
Puedes crear un script para supervisar las aplicaciones de Amazon EMR. El siguiente script de ejemplo denominado check_process.sh supervisa YARN ResourceManager y HiveServer2 en un nodo principal. El script también supervisa YARN NodeManager en los nodos centrales y de trabajo de tareas. Para supervisar aplicaciones adicionales, puedes modificarlas en la sección # Monitor specific services (Supervisar servicios específicos) del script.
Para configurar el siguiente script para incluir aplicaciones adicionales, consulta Create bootstrap actions to install additional software with an Amazon EMR cluster (Creación de acciones de arranque para instalar software adicional con un clúster de Amazon EMR).
Ejemplo 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
Importante: Antes de ejecutar el script en un entorno de producción, se recomienda probar el script en un entorno de prueba.
El script anterior publica métricas personalizadas en CloudWatch. AWS prorratea todos los cargos de métricas personalizadas por hora y los calcula solo cuando el script envía las métricas a CloudWatch. Para obtener más información, consulta Precios de Amazon CloudWatch.
Configuración de la supervisión de servicios en el clúster de Amazon EMR
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Para implementar la supervisión automatizada del servicio, utiliza un script de acción de arranque.
Sigue estos pasos:
-
Para preparar el script, ejecuta el siguiente comando cp de la AWS CLI para cargar el script en un bucket de Amazon Simple Storage Service (Amazon S3) al que pueda acceder el clúster de Amazon EMR:
aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh -
Para copiar el script en cada nodo del clúster y usar crontab para programar el script, crea un script de acción de arranque similar al siguiente ejemplo:
#!/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 -Nota: Modifica la duración de crontab para adaptarlo a tus necesidades.
-
Agrega el script de acción de arranque al archivo de configuración del clúster de Amazon EMR.
Nota: La instancia de EC2 de Amazon EMR debe tener los permisos mínimos necesarios para acceder a los scripts.
Tras iniciar el clúster, ejecuta el siguiente comando en los nodos del clúster para confirmar que Amazon EMR haya copiado correctamente el script:
ls -l /home/hadoop/check_process.sh
Para confirmar que hayas configurado crontab correctamente, ejecuta el siguiente comando en los nodos del clúster:
crontab -l
Revisión de los registros
El script genera registros detallados y registros de estado en los nodos del clúster. Para comprobar que el script funcione correctamente, revisa ambos registros.
Registros detallados
El /var/log/hadoop/service-monitor-detailed.log proporciona registros completos con marcas de tiempo, ID de clúster, ID de instancia, dirección IP del host, tipo de nodo y estado del servicio.
Archivo de ejemplo:
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.
Registros de estado
El archivo /var/log/hadoop/service-monitor-status.log contiene registros del estado del servicio sin los metadatos adicionales.
Archivo de ejemplo:
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
Uso de CloudWatch para supervisar las métricas de las aplicaciones
El script envía métricas a CloudWatch cuando una aplicación está inactiva.
Para supervisar las métricas, sigue estos pasos:
- Abre la consola de CloudWatch.
- En el panel de navegación, en Métricas, elige Todas las métricas.
- En Métricas, elige EMR/ServiceStatus y, a continuación, selecciona la métrica ServiceStatus.
- Filtra las métricas por las dimensiones disponibles: ClusterId, InstanceId, NodeServiceName y NodeType.
Información relacionada
Creación de una alarma de CloudWatch basada en un umbral estático
Ver y reiniciar Amazon EMR y procesos de aplicaciones (daemons)
- Temas
- Analytics
- Etiquetas
- Amazon EMR
- Idioma
- Español
Vídeos relacionados


Contenido relevante
preguntada hace 10 meses
preguntada hace 10 meses
preguntada hace 10 meses
OFICIAL DE AWSActualizada hace 4 años