VPC環境で利用できます。
Cloud Hadoopクラスタ内で発生した Alertsをユーザーの設定に応じて通知できます。本ガイドでは、Cloud Hadoopクラスタ内の Oozieワークフローと Ambariで発生した Alertsをユーザーの設定に応じてメール、メッセージなどに通知する2つの方法について説明します。
- ローカル SMTPサーバを直接構築して Oozieワークフロー内の Alertsをメール通知する方法
- NAVERクラウド SENSサービスを利用して Ambari内の Alertsをメッセージ通知する方法
SMTPサーバを使用したメール Alerts
本ガイドでは Oozieワークフロー内の Alertsをメール通知するために Cloud Hadoopクラスタのエッジノードに SMTPサーバの sendmailをインストールして利用します。クラスタ外部に別途 STMPサーバを構築して利用する場合にクラスタと SMTPサーバが通信できるように ACGを設定します。
a.SMTPサーバの構築
- Cloud Hadoop(VPC)エッジノードに sshでアクセスします。エッジノードにアクセスする方法は、SSHによるクラスタノードアクセスガイドをご参照ください。
- 以下のコマンドを実行して sendmailのインストール有無を確認します。
rpm -qa |grep sendmail - インストールされて以内場合、以下のコマンドを実行して sendmailをダウンロードします。
sudo yum install -y sendmail sendmail-cf - sendmail関連の設定変更するために以下のコマンドを実行して sendmai.mcファイルを読み込みます。
cd /etc/mail sudo vi sendmail.mc - sendmail.mcファイル内容を以下のように変更します。
- 56、57番列の dnlを削除
- 121番列の127.0.0.1を0.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
- 以下のコマンドを実行して sendmail.mcで sendmail.cfファイルを作成します。
sudo sh -c "sudo m4 sendmail.mc > sendmail.cf"
- 以下のコマンドを実行して /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
- 以下のコマンドを実行して access ipを適用します。
sudo makemap hash access < access
- 正常に動作しているか確認するために sendmailを実行してテストを行います。その後、送信したメールを確認します。
sudo systemctl start sendmail
sudo yum -y install mailx
mail test123@navercorp.com
Subject: test
test
test
.
EOT
b.Ambariで Oozie Email Notificationを設定
- 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アドレスを指す)

c.Hueで Oozie Email Notificationのテスト
本ガイドでは Oozieワークフローの失敗状況を再現するために、Hueにアクセスして以下のような単純なワークフローを実行しました。Shell Actionを実行した後に移行ステータスをすべて KILLステータスに任意設定しました。Hue Oozie Workflowで Sqoop、Hiveを使用するガイドを参照して、複雑なワークフローにも同様に適用できます。
- [Hue] にアクセスして左側メニューの [Oozieエディタ] > [Workflow] ボタンをクリックします。その後、以下のように任意の Shell Scriptをワークフローに追加して [設定] ボタンをクリックします。

- Oozieワークフローの失敗状況を再現するために、以下のステータスように移行ステータスをすべて KILLステータスに設定します。

- ワークフロー内のエラーメッセージの設定でエラー発生時に EMAILにチェックして受信する Eメールアドレス、件名と内容を入力します。

- ワークフローを提出すると、しばらくして失敗します。その後、メールが正常に送信されたかを確認します。
SENSサービスを使用したメッセージ Alerts
本ガイドでは Ambari内の Alertsについてのメッセージ Alerts機能を具現するために NAVERクラウドの SENSサービスを利用します。SENSサービスについての説明は、 Simple & Easy Notification Serviceのご紹介
ガイドをご参照ください。
a.SENSプロジェクトの作成
- SENSサービスを利用するために SENSプロジェクトを作成して Key値を照会します。サービスについての説明は、共通ガイドをご参照ください。
- SENS SMSサービスを利用するために発信番号を登録します。これについての説明は、Calling Number ご利用ガイドをご参照ください。
b.Ambari Alert Notificationsの設定
- Ambariにアクセスした後 [Alerts] > [ACTIONS] > [Manage Notifications] > [+] ボタンをクリックして以下のように Alert targetを登録します。

- Cloud Hadoop(VPC)エッジノードに sshでアクセスします。エッジノードにアクセスする方法は、SSHによるクラスタノードアクセスをご参照ください。
- 以下のコマンドを実行して 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()
- 以下のコマンドを実行して Ambari Alertsに対するログを記録するファイルを /var/log/ambari-server/ パスに作成します。
sudo vi /var/log/ambari-server/custom_notification.log
- 以下のコマンドを実行して alert.pyと custom_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
- 以下のコマンドを実行して ambari.propertiesファイルに Alert Scriptファイルのパスを追加します。
sudo vi /etc/ambari-server/conf/ambari.properties
notification.dispatch.alert.script=/var/lib/ambari-server/resources/scripts/alert.py
- 以下のコマンドを実行して ambari-serverを再起動します。
sudo ambari-server restart
- SENSサービスコンソールにアクセスしてメッセージ送信が正常に処理されたか確認します。

