Custom Alerts 설정
    • PDF

    Custom Alerts 설정

    • PDF

    Article Summary

    Cloud Hadoop 클러스터 내에서 발생한 Alerts를 사용자의 설정에 따라 전달 받을 수 있습니다. 이 가이드에서는 Cloud Hadoop 클러스터 내 Oozie 워크플로 및 Ambari에서 발생한 Alerts를 사용자의 설정에 따라 메일, 메시지 등으로 전달받기 위한 방법 두 가지에 대하여 설명합니다.

    1. 로컬 SMTP 서버를 직접 구축하여 Oozie 워크플로 내 Alerts를 메일로 전달받는 방법
    2. 네이버클라우드 SENS 서비스를 사용하여 Ambari 내 Alerts를 메시지로 전달받는 방법

    SMTP 서버를 사용한 메일 Alerts

    이 가이드에서는 Oozie 워크플로 내 Alerts를 메일로 전달받기 위해 Cloud Hadoop 클러스터의 엣지 노드에 SMTP 서버로 sendmail을 설치하여 사용합니다. 클러스터 외부에 별도의 STMP 서버를 구축하여 사용하실 경우에는 클러스터와 SMTP 서버가 통신할 수 있도록 ACG를 설정해야 합니다.

    a. SMTP 서버 구축

    1. Cloud Hadoop 엣지 노드에 ssh로 접속해 주십시오. 엣지 노드에 접속하는 방법은 SSH로 클러스터 노드 접속 가이드를 참고해 주십시오.
    2. 아래 명령어를 수행해 sendmail 설치 여부를 확인해 주십시오.
      rpm -qa |grep sendmail
      
    3. 설치가 되어있지 않다면, 아래 명령어를 수행해 sendmail을 다운로드해 주십시오.
      sudo yum install -y sendmail sendmail-cf
      
    4. sendmail 관련 설정을 변경하기 위해 아래 명령어를 수행해 sendmai.mc 파일을 읽어 주십시오.
      cd /etc/mail
      sudo vi sendmail.mc
      
    5. sendmail.mc 파일 내용을 아래와 같이 변경해 주십시오.
    • 52, 53번 줄의 dnl을 제거
    • 118번 줄의 127.0.0.10.0.0.0으로 변경

    <변경 전>

    [52] dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    [53] dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    [118] DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
    

    <변경 후>

    [52] TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    [53] define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    [118] DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
    
    1. 아래 명령어를 수행해 sendmail.mcsendmail.cf 파일을 생성해 주십시오.
    sudo sh -c "sudo m4 sendmail.mc > sendmail.cf" 
    
    1. 아래 명령어를 수행해 /etc/mail/access 파일에 Oozie가 동작중인 m-001 노드, m-002 노드의 IP를 추가해 주십시오.
    sudo vi /etc/mail/access
    

    <변경 전>

    # By default we allow relaying from localhost...
    Connect:localhost.localdomain       RELAY
    Connect:localhost                            RELAY
    Connect:127.0.0.1                           RELAY
    

    <변경 후>

    # By default we allow relaying from localhost...
    Connect:localhost.localdomain       RELAY
    Connect:localhost                            RELAY
    Connect:127.0.0.1                           RELAY
    Connect:10.0.3.16                           RELAY
    Connect:10.0.3.17                           RELAY
    
    1. 아래 명령어를 수행해 access ip를 적용해 주십시오.
    sudo makemap hash access < access
    
    1. 정상적으로 동작하는지 확인하기 위해 sendmail을 실행하여 테스트를 진행해 주십시오. 그 후 전송한 메일을 확인해 주십시오.
    sudo systemctl start sendmail
    sudo yum -y install mailx
    mail test123@navercorp.com
    Subject: test
    test
    test
    .
    EOT
    

    b. Ambari에서 Oozie Email Notification 설정

    1. Ambari에 접속 후 [Oozie] > [CONFIGS] > [ADVANCED] > [Custom oozie-site] > [Add Property ...] 버튼을 클릭하여 아래 2개의 설정을 추가한 뒤 [SAVE] 버튼을 눌러 저장하고 [RESTART] 버튼을 눌러 재시작해 주십시오.
    • Key: "oozie.email.from.address", Value: "발송인으로 사용할 주소 (예시: oozie@localhost.com")
    • Key: "oozie.email.smtp.host", Value: "SMTP 서버가 설치되어 있는 서버의 IP (이 가이드에서는 엣지노드에 SMTP 서버를 설치했으므로, 엣지노드의 IP)
      hadoop-vpc-29_1.png

    c. Hue에서 Oozie Email Notification 테스트

    이 가이드에서는 Oozie 워크플로의 실패 상황을 재현하기 위해 Hue에 접속하여 아래와 같은 단순한 워크플로를 실행하였습니다. Shell Action을 수행한 뒤 전환 상태를 모두 KILL 상태로 임의 설정하였습니다. Hue Oozie Workflow에서 Sqoop, Hive 사용 가이드를 참고하여 복잡한 워크플로에도 동일하게 적용해볼 수 있습니다.

    1. [Hue] 에 접속하여 좌측 메뉴 [Oozie 편집기] > [Workflow] 버튼을 클릭해 주십시오. 그 후 아래와 같이 임의의 Shell Script를 워크플로에 추가하고 [설정] 버튼을 클릭해 주십시오.
      hadoop-vpc-29_2.png
    2. Oozie 워크플로의 실패 상황을 재현하기 위해 아래와 같이 전환 상태를 모두 KILL 상태로 설정해 주십시오.
      hadoop-vpc-29_3_ko.png
    3. 워크플로 내 오류 메시지 설정에서 오류 발생 시 EMAIL에 체크한 뒤 수신할 메일 주소, 제목 및 내용을 입력해 주십시오.
      hadoop-vpc-29_4_ko.png
    4. 워크플로를 제출하면 잠시 뒤 실패합니다. 그 후 메일이 정상적으로 발송되었는지 확인해 주십시오.

    SENS 서비스를 사용한 메시지 Alerts

    이 가이드에서는 Ambari 내 Alerts에 대한 메시지 Alerts 기능을 구현하기 위해 네이버클라우드의 SENS 서비스를 사용합니다. SENS 서비스에 대한 설명은 Simple & Easy Notification Service 소개
    가이드를 참고해 주십시오.

    a. SENS 프로젝트 생성

    1. SENS 서비스를 사용하기 위해 SENS 프로젝트를 생성하고 Key 값들을 조회해 주십시오. 이에 대한 설명은 공통 가이드를 참고해 주십시오.
    2. SENS SMS 서비스를 사용하기 위해 발신번호를 등록해 주십시오. 이에 대한 설명은 웹 콘솔 사용 가이드를 참고해 주십시오.

    b. Ambari Alert Notifications 설정

    1. Ambari에 접속 후 [Alerts] > [ACTIONS] > [Manage Notifications] > [+] 버튼을 클릭하여 아래와 같이 Alert target을 등록해 주십시오.
      hadoop-vpc-29_5.png
    2. Cloud Hadoop 엣지 노드에 ssh로 접속해 주십시오. 엣지 노드에 접속하는 방법은 SSH로 클러스터 노드 접속를 참고해 주십시오.
    3. 아래 명령어를 수행해 Custom Alerts 파일을 /var/lib/ambari-server/resources/scripts 경로에 생성해 주십시오. 이 가이드에서는 SENS 서비스에 메시지 전송 요청을 보내는 API를 활용합니다. SENS 서비스 API에 대한 설명은 SMS API 가이드를 참고해 주십시오. Ncloud API Signature 생성에 대한 설명은 Ncloud API 가이드를 참고해 주십시오.
    sudo vi /var/lib/ambari-server/resources/scripts/alert.py
    
    #!/usr/bin/env python
    
    import sys
    import urllib2
    import json
    import logging
    from datetime import datetime
    
    import hashlib
    import hmac
    import base64
    import time
    
    SENS_API_ENDPOINT = "https://sens.apigw.fin-ntruss.com/sms/v2/services/{SENS 콘솔에서 발급받은 serviceId}/messages"
    LOG_PATH_FILE      = "/var/log/ambari-server/custom_notification.log"
    TIMESTAMP = int(time.time() * 1000)
    TIMESTAMP = str(TIMESTAMP)
    
    def test_notification():
        definition_name = sys.argv[1]
        definition_label = sys.argv[2]
        service_name = sys.argv[3]
        alert_state = sys.argv[4]
        alert_text = sys.argv[5]
        send_message_from_sens(definition_name, definition_label, service_name, alert_state, alert_text)
    
    def send_message_from_sens(definition_name, definition_label, service_name, alert_state, alert_text):
        try:
            log_data = str(TIMESTAMP + " -- " + 'Alert Dispatcher' + " -- " + definition_name + " -- " + definition_label + " -- " + service_name + " -- " + alert_state + " -- " + alert_text + " -- ")
            request_body = { "type":"SMS", "from":{발신 번호}, "content":log_data, "messages":[ { "to":{수신 번호} } ] }
    
            headers={"Content-Type": "application/json; charset=utf-8", "x-ncp-apigw-timestamp": TIMESTAMP, "x-ncp-iam-access-key": {포탈 또는 Sub Account에서 발급받은 Access Key ID}, "x-ncp-apigw-signature-v2": make_signature()}
            data = json.dumps(request_body, ensure_ascii=False)
            req = urllib2.Request(SENS_API_ENDPOINT, data, headers)
            f = urllib2.urlopen(req)
            response = f.read()
            f.close()
    
            file = open(LOG_PATH_FILE, "a+")
            file.write(log_data)
            file.write(response)
            file.close()
        except Exception as err:
            logging.warning(err)
    
    def make_signature():
        access_key = {포탈 또는 Sub Account에서 발급받은 Access Key ID}
        secret_key = {포탈 또는 Sub Account에서 발급받은 Secret Key}
        secret_key = bytes(secret_key)
    
        method = "POST"
        uri = "/sms/v2/services/{SENS 콘솔에서 발급받은 serviceId}/messages"
    
        message = method + " " + uri + "\n" + TIMESTAMP +  "\n" + access_key
        message = bytes(message)
        signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
        return signingKey
    
    if __name__ == '__main__':
        test_notification()
    
    1. 아래 명령어를 수행해 Ambari alerts에 대한 로그를 기록할 파일을 /var/log/ambari-server/ 경로에 생성해 주십시오.
    sudo vi /var/log/ambari-server/custom_notification.log
    
    1. 아래 명령어를 수행해 alert.pycustom_notification.log 파일에 대한 권한을 설정해 주십시오.
    sudo chmod -R 700 /var/lib/ambari-server/resources/scripts/alert.py
    sudo chmod -R 766 /var/log/ambari-server/custom_notification.log
    
    1. 아래 명령어를 수행해 ambari.properties 파일에 Alert Script 파일의 경로를 추가해 주십시오.
    sudo vi /etc/ambari-server/conf/ambari.properties
    
    notification.dispatch.alert.script=/var/lib/ambari-server/resources/scripts/alert.py
    
    1. 아래 명령어를 수행해 ambari-server를 재시작해 주십시오.
    sudo ambari-server restart
    
    1. SENS 서비스 콘솔에 접속해 메시지 전송이 정상적으로 처리되었는지 확인해 주십시오.
      hadoop-vpc-29_7_ko.png

    hadoop-vpc-29_6_ko.png


    이 문서가 도움이 되었습니까?

    What's Next
    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.