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ファイル内容を以下のように変更します。
  • 56、57番列の dnlを削除
  • 121番列の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

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
  2. Oozieワークフローの失敗状況を再現するために、以下のステータスように移行ステータスをすべて KILLステータスに設定します。
    hadoop-vpc-29_3_ko
  3. ワークフロー内のエラーメッセージの設定でエラー発生時に EMAILにチェックして受信する Eメールアドレス、件名と内容を入力します。
    hadoop-vpc-29_4_ko
  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
  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が発行された 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

hadoop-vpc-29_6_ko