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 = '[email protected]'
    sender = '[email protected]'

    # 發件人郵箱的SMTP服務器(即sender的SMTP服務器)
    smtpserver = 'smtp.qq.com'

    # 發件人郵箱的用戶名和授權碼(不是登陸郵箱的密碼)
    username = '[email protected]'
    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())  # 填入郵件的相關信息併發送



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章