Como faço para publicar e monitorar o status de uma aplicação Amazon EMR com integração com o CloudWatch?
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:
-
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 -
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.
-
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.
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:
- Abra o console do CloudWatch.
- No painel de navegação, em Métricas, escolha Todas as métricas.
- Em Métricas, escolha EMR/ServiceStatus e selecione a métrica ServiceStatus.
- 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)
- Tópicos
- Analytics
- Tags
- Amazon EMR
- Idioma
- Português

Conteúdo relevante
- feita há 8 meses