Custom Alerts の設定

Prev Next

最新のコンテンツが反映されていません。早急にアップデート内容をご提供できるよう努めております。最新のコンテンツ内容は韓国語ページをご参照ください。

VPC環境で利用できます。

Cloud Hadoopクラスタ内で発生した Alertsをユーザーの設定に応じて通知できます。本ガイドでは、Cloud Hadoopクラスタ内の Oozieワークフローと Ambariで発生した Alertsをユーザーの設定に応じてメール、メッセージなどに通知する2つの方法について説明します。

  1. ローカル SMTPサーバを直接構築して Oozieワークフロー内の Alertsをメール通知する方法
  2. NAVERクラウド SENSサービスを利用して Ambari内の Alertsをメッセージ通知する方法

SMTPサーバを使用したメール Alerts

本ガイドでは Oozieワークフロー内の Alertsをメール通知するために Cloud Hadoopクラスタのエッジノードに SMTPサーバの sendmailをインストールして利用します。クラスタ外部に別途 STMPサーバを構築して利用する場合にクラスタと SMTPサーバが通信できるように ACGを設定します。

a. SMTPサーバの構築

  1. Cloud Hadoop(VPC)エッジノードに 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_ja.png
  3. ワークフロー内のエラーメッセージの設定で エラー発生時に EMAIL にチェックして受信する Eメールアドレス、件名と内容を入力します。
    hadoop-vpc-29_4_ja.png
  4. ワークフローを提出すると、しばらくして失敗します。その後、メールが正常に送信されたかを確認します。

SENSサービスを使用したメッセージ Alerts

本ガイドでは Ambari内の Alertsについてのメッセージ Alerts機能を具現するために NAVERクラウドの SENSサービスを利用します。SENSサービスについての説明は Simple & Easy Notification Serviceのご紹介ガイドを参考にしてください。

a. SENSプロジェクトの作成

  1. SENSサービスを利用するために SENSプロジェクトを作成して Key値を照会します。サービスについての説明はご利用ガイドをご参考ください。
  2. SENS SMSサービスを利用するために発信番号を登録します。サービスについての説明はCalling Number
    をご参考ください。

b. Ambari Alert Notificationsの設定

  1. Ambariにアクセスした後 [Alerts] > [ACTIONS] > [Manage Notifications] > [+] ボタンをクリックして以下のとおりに Alert targetを登録します。
    hadoop-vpc-29_5.png
  2. Cloud Hadoop(VPC)エッジノードに 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.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が発行された Access Key ID
    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_ja.png

hadoop-vpc-29_6_ja.png