Ir para o conteúdo

Como faço para publicar e monitorar o status de uma aplicação Amazon EMR com integração com o CloudWatch?

7 minuto de leitura
0

Quero integrar o Amazon CloudWatch com o Amazon EMR para publicar e monitorar o status das aplicações que eu instalei no meu cluster. Quero que o CloudWatch me avise quando as aplicações estiverem inativas.

Breve descrição

Ao integrar o CloudWatch com o Amazon EMR, é possível rastrear os status críticos das aplicações que instalou, como o HiveServer2 e o YARN ResourceManager. Em seguida, é possível publicar os status nas métricas personalizadas do CloudWatch e configurar alertas para indisponibilidade do serviço. Para rastrear outras aplicações, é possível modificar a lista de aplicações conforme necessário.

Resolução

Pré-requisitos:

  • Amazon EMR versão 5.30.0 ou posterior
  • Função de perfil de instância do Amazon EMR ou perfil de usuário do AWS Identity and Access Management (AWS IAM) com permissões cloudwatch:PutMetricData

Crie um script para monitorar suas aplicações do Amazon EMR

É possível criar um script para monitorar suas aplicações do Amazon EMR. O script de exemplo a seguir, chamado check_process.sh, monitora o YARN ResourceManager e o HiveServer2 em um nó primário. O script também monitora o YARN NodeManager nos nós de processamento principais e de tarefas. Para monitorar outras aplicações, é possível modificar aplicações na seção # Monitorar serviços específicos no script.

Para configurar o script a seguir para incluir outras aplicações, consulte Como criar ações de bootstrap para instalar softwares adicionais com um cluster do Amazon EMR.

Exemplo 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 executar o script em um ambiente de produção, é uma prática recomendada testar o script em um ambiente de teste.

O script anterior publica métricas personalizadas no CloudWatch. A AWS rateia todas as cobranças de métricas personalizadas por hora e as mede somente quando o script envia as métricas para o CloudWatch. Para mais informações, consulte os preços do Amazon CloudWatch.

Configure o monitoramento de serviços em seu cluster do Amazon EMR

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Para implementar o monitoramento automatizado de serviços, use um script de ação de bootstrap.

Conclua as etapas a seguir:

  1. Para preparar o script, execute o seguinte comando cp AWS CLI para carregar o script em um bucket do Amazon Simple Storage Service (Amazon S3) que seu cluster do Amazon EMR possa acessar:

    aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh
  2. Para copiar o script em cada nó do cluster e usar o crontab para programar o script, crie um script de ação de bootstrap semelhante ao exemplo a seguir:

    #!/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 -  

    Observação: Modifique a duração do crontab para atender às suas necessidades.

  3. Adicione o script de ação de bootstrap ao arquivo de configuração do cluster do Amazon EMR.
    Observação: A instância do EC2 do Amazon EMR deve ter as permissões mínimas necessárias para acessar os scripts.

  4. Inicie o cluster.

Depois de iniciar o cluster, execute o seguinte comando nos nós do cluster para confirmar se o Amazon EMR copiou corretamente o script:

ls -l /home/hadoop/check_process.sh

Para confirmar se você configurou corretamente o crontab, execute o seguinte comando nos nós do cluster:

 crontab -l

Revise os logs

O script gera logs detalhados e logs de status nos nós do cluster. Para verificar se o script funciona corretamente, revise os dois logs.

Logs detalhados

O arquivo /var/log/hadoop/service-monitor-detailed.log fornece logs abrangentes com data e hora, ID do cluster, ID da instância, endereço IP do host, tipo de nó e status do serviço.

Arquivo de exemplo:

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.

Logs de status

O arquivo /var/log/hadoop/service-monitor-status.log contém registros do status do serviço sem os metadados adicionais.

Arquivo de exemplo:

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

Use o CloudWatch para monitorar as métricas da aplicação

O script envia métricas para o CloudWatch quando uma aplicação está inativa.

Para monitorar as métricas, conclua as seguintes etapas:

  1. Abra o console do CloudWatch.
  2. No painel de navegação, em Métricas, escolha Todas as métricas.
  3. Em Métricas, escolha EMR/ServiceStatus e selecione a métrica ServiceStatus.
  4. Filtre as métricas pelas dimensões disponíveis: ClusterID, InstanceID, NodeServiceName e NodeType.

Informações relacionadas

Criar um alarme do CloudWatch com base em um limite estático

Visualizar e reiniciar processos do Amazon EMR e de aplicações (daemons)

AWS OFICIALAtualizada há 4 meses