내용으로 건너뛰기

CloudWatch 통합을 통해 Amazon EMR 애플리케이션 상태를 게시하고 모니터링하려면 어떻게 해야 합니까?

6분 분량
0

Amazon CloudWatch를 Amazon EMR과 통합하여 클러스터에 설치한 애플리케이션의 상태를 게시하고 모니터링하려고 합니다. 애플리케이션이 다운되면 CloudWatch에서 알림을 받고 싶습니다.

간략한 설명

CloudWatch를 Amazon EMR과 통합하면 HiveServer2 및 YARN ResourceManager와 같이 설치한 애플리케이션의 중요 상태를 추적할 수 있습니다. 그런 다음, 상태를 CloudWatch 사용자 지정 지표에 게시하고 이용할 수 없는 서비스에 대한 알림을 구성할 수 있습니다. 추가 애플리케이션을 추적하기 위해 필요에 따라 애플리케이션 목록을 수정할 수 있습니다.

해결 방법

사전 요구 사항:

  • Amazon EMR 버전 5.30.0 이상
  • cloudwatch:PutMetricData 권한이 있는 Amazon EMR 인스턴스 프로파일 역할 또는 AWS Identity and Access Management(IAM) 사용자 역할

Amazon EMR 애플리케이션을 모니터링하는 스크립트 생성

Amazon EMR 애플리케이션을 모니터링하는 스크립트를 생성할 수 있습니다. check_process.sh라는 이름의 다음 예제 스크립트는 프라이머리 노드에서 YARN ResourceManager와 HiveServer2를 모니터링합니다. 또한 이 스크립트는 코어 및 작업 워커 노드에서 YARN NodeManager를 모니터링합니다. 추가 애플리케이션을 모니터링하려면 스크립트의 # 특정 서비스 모니터링 섹션에서 애플리케이션을 수정할 수 있습니다.

추가 애플리케이션을 포함하도록 다음 스크립트를 구성하려면 Amazon EMR 클러스터에 추가 소프트웨어를 설치하기 위한 부트스트랩 작업 생성을 참조하십시오.

예제 스크립트:

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

중요: 프로덕션 환경에서 스크립트를 실행하기 전에 테스트 환경에서 스크립트를 테스트하는 것이 좋습니다.

위 스크립트는 CloudWatch에 사용자 지정 지표를 게시합니다. AWS는 모든 사용자 지정 지표 요금을 시간 단위로 비례 계산하고 스크립트가 지표를 CloudWatch에 전송할 때만 요금을 측정합니다. 자세한 내용은 Amazon CloudWatch 요금을 참조하십시오.

Amazon EMR 클러스터에서 서비스 모니터링 구성

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

자동화된 서비스 모니터링을 구현하려면 부트스트랩 작업 스크립트를 사용합니다.

다음 단계를 완료하십시오.

  1. 스크립트를 준비하려면 다음 cp AWS CLI 명령을 실행하여 Amazon EMR 클러스터가 액세스할 수 있는 Amazon Simple Storage Service(Amazon S3) 버킷에 스크립트를 업로드합니다.

    aws s3 cp check_process.sh s3://your-bucket/monitoring/check_process.sh
  2. 스크립트를 각 클러스터 노드에 복사하고 crontab을 사용하여 스크립트를 예약하려면 다음 예와 유사한 부트스트랩 작업 스크립트를 생성합니다.

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

    참고: 요구 사항에 맞게 crontab 기간을 수정하십시오.

  3. Amazon EMR 클러스터 구성 파일에 부트스트랩 작업 스크립트를 추가합니다.
    참고: Amazon EMR EC2 인스턴스에는 스크립트에 액세스하는 데 필요한 최소 권한이 있어야 합니다.

  4. 클러스터를 시작합니다.

클러스터를 시작한 후 클러스터 노드에서 다음 명령을 실행하여 Amazon EMR이 스크립트를 올바르게 복사했는지 확인합니다.

ls -l /home/hadoop/check_process.sh

crontab을 올바르게 구성했는지 확인하려면 클러스터 노드에서 다음 명령을 실행합니다.

 crontab -l

로그 검토

스크립트는 클러스터 노드에 상세 로그 및 상태 로그를 생성합니다. 스크립트가 제대로 작동하는지 확인하려면 두 로그를 모두 검토하십시오.

상세 로그

/var/log/hadoop/service-monitor-detailed.log 파일은 타임스탬프, 클러스터 ID, 인스턴스 ID, 호스트 IP 주소, 노드 유형 및 서비스 상태가 포함된 포괄적인 로그를 제공합니다.

예시 파일:

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.

상태 로그

/var/log/hadoop/service-monitor-status.log 파일에는 추가 메타데이터가 없는 서비스 상태 기록이 포함되어 있습니다.

예시 파일:

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

CloudWatch를 사용하여 애플리케이션 지표 모니터링

스크립트는 애플리케이션이 다운되면 CloudWatch에 지표를 전송합니다.

지표를 모니터링하려면 다음 단계를 완료하십시오.

  1. CloudWatch 콘솔을 엽니다.
  2. 탐색 창의 지표에서 모든 지표를 선택합니다.
  3. 지표에서 EMR/ServiceStatus를 선택한 다음, ServiceStatus 지표를 선택합니다.
  4. 다음의 사용 가능한 차원을 기준으로 지표를 필터링합니다. ClusterId, InstanceId, NodeServiceName, NodeType.

관련 정보

정적 임계값을 기반으로 CloudWatch 경보 생성

Amazon EMR 및 애플리케이션 프로세스(대몬) 보기 및 재시작

AWS 공식업데이트됨 8달 전