CDHの操作とメンテナンスoozie障害スケジューリングDingdingアラーム
序文
CDH統合ビッグデータアーキテクチャを使用すると、oozieは一般的にスケジューリングツールとして使用され、タスクを監視する必要があります。これは、電子メールや通知に役立ちます。毎日メールが多すぎるので無視しやすいので、いつも使っているオフィスソフトの丁丁を通知に使っています
目次
- Dingdingグループカスタムインターフェイスアプリケーション
- スクリプト開発
カスタムインターフェースアプリケーション
前のブログを参照してください:https://blog.csdn.net/dbc_zt/article/details/109781554
スクリプト開発
oozieアーキテクチャ
oozieによってスケジュールされたジョブは、WF_JOBSテーブルに保存されます
/*
*安装oozie默认的WF_JOBS 建表语句如下
*/
CREATE TABLE `WF_JOBS` (
`id` varchar(255) NOT NULL,
`app_name` varchar(255) DEFAULT NULL, -- 应用名称
`app_path` varchar(255) DEFAULT NULL, -- 应用路径
`conf` mediumblob,
`created_time` datetime DEFAULT NULL,
`end_time` datetime DEFAULT NULL,
`external_id` varchar(255) DEFAULT NULL,
`group_name` varchar(255) DEFAULT NULL,
`last_modified_time` datetime DEFAULT NULL,
`log_token` varchar(255) DEFAULT NULL,
`parent_id` varchar(255) DEFAULT NULL,
`proto_action_conf` mediumblob,
`run` int(11) DEFAULT NULL,
`sla_xml` mediumblob,
`start_time` datetime DEFAULT NULL, -- 开始时间
`status` varchar(255) DEFAULT NULL, -- 执行状态
`user_name` varchar(255) DEFAULT NULL, -- 用户名称
`wf_instance` mediumblob,
PRIMARY KEY (`id`),
KEY `I_WF_JOBS_CREATED_TIME` (`created_time`),
KEY `I_WF_JOBS_END_TIME` (`end_time`),
KEY `I_WF_JOBS_EXTERNAL_ID` (`external_id`),
KEY `I_WF_JOBS_LAST_MODIFIED_TIME` (`last_modified_time`),
KEY `I_WF_JOBS_PARENT_ID` (`parent_id`),
KEY `I_WF_JOBS_STATUS` (`status`),
KEY `I_WF_JOBS_USER_NAME` (`user_name`),
KEY `I_WF_JOBS_STATUS_CREATED_TIME` (`status`,`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Pythonスクリプト
#!/home/user/nlpconda/bin/python
# -*- coding: UTF-8 -*-
import datetime
import json
import urllib.request
import time
import hmac
import hashlib
import base64
import urllib.parse
import sys
import pymysql
# 发送钉钉消息
def send_request(url, datas):
# 传入url和内容发送请求
# 构建一下请求头部
header = {
"Content-Type": "application/json",
"Charset": "UTF-8"
}
sendData = json.dumps(datas) # 将字典类型数据转化为json格式
sendDatas = sendData.encode("utf-8") # python3的Request要求data为byte类型
# 发送请求
request = urllib.request.Request(url=url, data=sendDatas, headers=header)
# 将请求发回的数据构建成为文件格式
opener = urllib.request.urlopen(request)
# 打印返回的结果
print(opener.read())
# 获取钉钉发送数据类型
def get_ddmodel_datas(type):
# 返回钉钉模型数据,1:文本;2:markdown所有人;3:markdown带图片,@接收人;4:link类型
if type == 1:
my_data = {
"msgtype": "text",
"text": {
"content": "test】我就是我, 是不一样的烟火"
},
"at": {
"atMobiles": [
"13000000000"
],
"isAtAll": True
}
}
elif type == 3:
my_data = {
"msgtype": "markdown",
"markdown": {
"title": " ",
"text": " "
},
"at": {
"atMobiles": [
"13000000000"
],
"isAtAll": True
}
}
return my_data
# 获取签名
def get_sign(timestamp, secret):
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return sign
# 获取钉钉markdown字符串
def sg_md_deal(head, data):
sig = '|'
cols_list = head
sig_cols = sig + sig.join(('**' + i + '**' for i in cols_list)) + sig + ' \n '
sig_tab = sig + sig.join([':---' for i in range(len(cols_list))]) + sig + ' \n '
sig_md_str = '### {} 调度异常哈 \n'.format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))
sig_md_str = sig_md_str + sig_cols + sig_tab
for value in data:
sig_val = sig + sig.join([' ' + str(i) for i in value]) + sig + ' \n '
sig_md_str = sig_md_str + sig_val
return sig_md_str
## 获取 wf_jobs 表执行失败调度
def dms_sendnum_mysql(ptt_day):
conn1 = pymysql.connect(host="oozie数据库ip",port=3306,
user="oozie_dingding_only_read", password="012345",
database="oozie", charset="utf8")
cursor1 = conn1.cursor()
## 失败调度的SQL,其中user_name 和status是索引字段
sql1 = """
select start_time, app_name from wf_jobs where user_name = 'hue上执行workflow的用户名' and status != 'SUCCEEDED' and start_time >= '{}' order by start_time;
""".format(ptt_day)
cursor1.execute(sql1)
res= cursor1.fetchall()
cursor1.close()
conn1.close()
return res
if __name__ == "__main__":
# 钉钉api信息
my_url = "https://oapi.dingtalk.com/robot/send?" \
"access_token=【我的access_token AAAA】"
secret = '【我的签名BBBB】'
timestamp = str(round(time.time() * 1000))
sign = get_sign(timestamp=timestamp, secret=secret)
# 表头
head = [' 开始时间', ' 任务名']
# print('Main! The time is: %s' % datetime.now())
# 3.Markdown(带图片@对象)
my_data = get_ddmodel_datas(3)
my_data["markdown"]["title"] = "oozie失败调度"
ptt_day = str(datetime.date.today())
mysql_data = dms_sendnum_mysql(ptt_day)
if not mysql_data:
sys.exit()
my_data["markdown"]["text"] = sg_md_deal(head, mysql_data)
my_url = my_url + '×tamp=' + timestamp + '&sign=' + sign
print(my_url)
send_request(my_url, my_data)
crontabスケジューリング
crontab -e
# 编辑如下
# oozie failure schedule
30 8 * * * ${PYTHON_HOME}/python ${DINGDING_REPORT_DIR}/dingding_oozie_fail_schedule.py