hive元数据监控脚本

表配置类

#!/usr/bin/python3

# 以下是所有要进行元数据监控的表,直接添加即可
compare_table_names = [
    't_dpay_loan_order',
]

处理逻辑类

#!/usr/bin/python3

import pymysql
import need_compared_table
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 打开数据库连接
# 以下是生产MySQL和存储hive元数据的MySQL
loan_mysql_db = pymysql.connect(host="10.148.XXX.XXX", port=3306, user="XXX", passwd="XXX", db="test_db")
hive_mysql_db = pymysql.connect(host="10.148.XXX.XXX", port=3306, user="XXX", passwd="XXX", db="hive")


# 使用 cursor() 方法创建一个游标对象 cursor
mysql_cursor = loan_mysql_db.cursor()
hive_mysql_cursor = hive_mysql_db.cursor()

# 记录所有元数据不一致的表的列表,用于最后发邮件用
different_table_names = []


# 用循环去对比所有需要进行元数据监控的表,表在另外一个need_compared_table包里
for table_name in need_compared_table.compare_table_names:

    mysql_cursor.execute("""
    SELECT
        TABLE_NAME,
        COLUMN_NAME
    FROM
        information_schema.COLUMNS
    WHERE
        TABLE_SCHEMA = 'dfpay'
    and TABLE_NAME = '%s'
    ORDER BY
	    2
    """ % table_name)

    mysql_metal_data = mysql_cursor.fetchall()

    hive_mysql_cursor.execute("""
    SELECT
        tb2.TBL_NAME,
        tb4.COLUMN_NAME
    FROM
        DBS tb1
    LEFT JOIN TBLS tb2 on tb1.DB_ID = tb2.DB_ID
    LEFT JOIN SDS tb3 on tb2.SD_ID = tb3.SD_ID
    LEFT JOIN COLUMNS_V2 tb4 on tb3.CD_ID = tb4.CD_ID
    WHERE
        tb1.NAME = 'dwl_test_ods'
    and	tb2.TBL_NAME = '%s'
    """ % table_name)

    hive_mysql_metal_data = hive_mysql_cursor.fetchall()

    if mysql_metal_data == hive_mysql_metal_data:
        print('%s 元数据一致' % table_name)
    elif mysql_metal_data != hive_mysql_metal_data:
        print('%s 元数据不一致!!!!!' % table_name)
        # 把不一致的表名添加到一下这个列表中
        different_table_names.append(table_name)
        print('different_table_names内容为 %s ' % different_table_names)

print('最终不一致的表名为 %s' % different_table_names)

# 关闭数据库连接
loan_mysql_db.close()

# 上面都是查出所有不一致的表名称,下面开始发送邮件
try:
    if different_table_names == []:
        print('没有元数据不一致的表')
    else:
        print('有元数据不一致的表,准备发送邮件')
finally:
    # 收件人和发件人
    receiver = 'XXXXX@qq.com'
    sender = 'xxxx@qq.com'

    # 发件人邮箱的SMTP服务器(即sender的SMTP服务器)
    smtpserver = 'smtp.qq.com'

    # 发件人邮箱的用户名和授权码(不是登陆邮箱的密码)
    username = 'xxxxx@qq.com'
    password = 'xxxxxxxx'

    mail_title = '测试邮件(元数据监控)'
    mail_body = '最终不一致的表名为 %s' % different_table_names

    # 创建一个实例
    message = MIMEText(mail_body, 'plain', 'utf-8')  # 邮件正文
    # (plain表示mail_body的内容直接显示,也可以用text,则mail_body的内容在正文中以文本的形式显示,需要下载)
    message['From'] = sender  # 邮件上显示的发件人
    message['To'] = receiver  # 邮件上显示的收件人
    message['Subject'] = Header(mail_title, 'utf-8')  # 邮件主题

    smtp = smtplib.SMTP()  # 创建一个连接
    smtp.connect(smtpserver)  # 连接发送邮件的服务器
    smtp.login(username, password)  # 登录服务器
    smtp.sendmail(sender, receiver, message.as_string())  # 填入邮件的相关信息并发送



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值