Salta al contenuto

Come posso pubblicare e monitorare lo stato di un'applicazione Amazon EMR con l'integrazione di CloudWatch?

7 minuti di lettura
0

Desidero integrare Amazon CloudWatch in Amazon EMR per pubblicare e monitorare lo stato delle applicazioni che ho installato nel mio cluster. Desidero che CloudWatch mi avvisi quando le applicazioni sono inattive.

Breve descrizione

Quando integri CloudWatch in Amazon EMR, puoi monitorare gli stati critici delle applicazioni installate, come HiveServer2 e YARN ResourceManager. Quindi puoi pubblicarli nelle metriche personalizzate di CloudWatch e configurare gli avvisi per l'indisponibilità del servizio. Per monitorare applicazioni aggiuntive, puoi modificarne l'elenco in base alle esigenze.

Risoluzione

Prerequisiti:

  • Amazon EMR versione 5.30.0 o successive
  • Ruolo del profilo dell'istanza Amazon EMR o ruolo utente AWS Identity and Access Management (AWS IAM) con autorizzazioni cloudwatch:PutMetricData

Crea uno script per monitorare le applicazioni Amazon EMR

Puoi creare uno script per monitorare le applicazioni Amazon EMR. Il seguente esempio di script denominato check_process.sh monitora YARN ResourceManager e HiveServer2 su un nodo primario. Lo script monitora anche YARN NodeManager sui nodi worker principali e di task. Per monitorare applicazioni aggiuntive, puoi modificarle nella sezione # Monitor specific services dello script.

Per configurare il seguente script includendovi applicazioni aggiuntive, consulta Crea azioni di bootstrap per installare software aggiuntivo con un cluster Amazon EMR.

Esempio di 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: prima di eseguire lo script in un ambiente di produzione, è consigliabile verificarlo in un ambiente di test.

Lo script precedente pubblica metriche personalizzate su CloudWatch. AWS addebita all'ora le metriche personalizzate e le calcola solo quando lo script invia i parametri a CloudWatch. Per ulteriori informazioni, consulta Prezzi di Amazon CloudWatch.

Configura il monitoraggio del servizio sul cluster Amazon EMR

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Per implementare il monitoraggio automatico del servizio, utilizza lo script di un'azione di bootstrap.

Completa i seguenti passaggi:

  1. Per preparare lo script, esegui questo comando AWS CLI cp per caricare lo script in un bucket Amazon Simple Storage Service (Amazon S3) a cui può accedere il cluster Amazon EMR:

    aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh
  2. Per copiare lo script in ogni nodo del cluster e utilizzare crontab per pianificarlo, crea lo script di un'azione di bootstrap simile all'esempio seguente:

    #!/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 durata di crontab per soddisfare le esigenze del caso.

  3. Aggiungi lo script dell'azione di bootstrap al file di configurazione del cluster Amazon EMR.
    Nota: l'istanza Amazon EMR EC2 deve disporre delle autorizzazioni minime richieste per accedere agli script.

  4. Avvia il cluster.

Dopo aver avviato il cluster, esegui questo comando sui suoi nodi per confermare che Amazon EMR abbia copiato correttamente lo script:

ls -l /home/hadoop/check_process.sh

Per verificare di aver configurato correttamente crontab, esegui questo comando sui nodi del cluster:

 crontab -l

Esamina i log

Lo script genera log dettagliati e log di stato sui nodi del cluster. Per verificare che lo script funzioni correttamente, esamina entrambi i log.

Log dettagliati

Il file /var/log/hadoop/service-monitor-detailed.log fornisce log completi con timestamp, ID del cluster, ID dell'istanza, indirizzo IP dell'host, tipo di nodo e stato di servizio.

Esempio di file:

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.

Log di stato

Il file /var/log/hadoop/service-monitor-status.log contiene i record dello stato di servizio senza metadati aggiuntivi.

Esempio di file:

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

Utilizza CloudWatch per monitorare le metriche delle applicazioni

Lo script invia metriche a CloudWatch quando un'applicazione è inattiva.

Per monitorare le metriche, completa i seguenti passaggi:

  1. Apri la console CloudWatch.
  2. Nel pannello di navigazione, in Metriche, scegli Tutte le metriche.
  3. In Metriche, scegli EMR/ServiceStatus, quindi seleziona la metrica ServiceStatus.
  4. Filtra le metriche in base alle dimensioni disponibili: ClusterId, InstanceId, NodeServiceName e NodeType.

Informazioni correlate

Crea un allarme CloudWatch basato su una soglia statica

Visualizzazione e riavvio di Amazon EMR e dei processi applicativi (daemon)

AWS UFFICIALEAggiornata 4 mesi fa