[python]数据同步工具DataX之Mysql同步数据至Hive (下)

上文请点击:[python]数据同步工具DataX之Mysql同步数据至Hive (上)

4.告警邮件配置

如果我们配置的是ETL定时任务,当DataX任务调度结束后,往往需要了解运行的结果是什么。因此我们需要为调度任务增加一个报错邮件告警的功能(任务正常执行的话就不再发送邮件),便于我们及时处理报错的任务。
这里我们主要使用python的email模块。


class emailhelper:
    def __init__(self, hostkey="", type=""):
        if hostkey != "" and type != "":
            self.hostServer = configHelper.emailConfig[hostkey]
            self.fileSizeMax = 30
            self.mailType = type
        pass

    # 通用邮件发送
    def sendmail(self, subject, to_addr_list, content="", filename=""):
        msg = MIMEMultipart('related')
        to_addr = ','.join(to_addr_list)
        msg['Subject'] = subject                      # 标题
        msg['to'] = to_addr                           # 收件人邮箱
        msg['from'] = self.hostServer['user']         # 发件人信息

        # 发送一般的邮件
        if self.mailType == 0:
            cont = MIMEText(content.encode('utf-8'), 'plain', 'utf-8')     #content为邮件正文
            msg.attach(cont)

        # 发送带HTML的邮件
        if self.mailType == 1:
            if content == "":
                print("error : sendmail() 参数content不能为空")
                sys.exit(1)
            cont = MIMEText(content.encode('utf-8'), 'html', 'utf-8')
            msg.attach(cont)

之后我们在任务中调用该函数就可以啦

mail = emailhelper("database", 1)
mail.sendmail("数据同步报错,请速处理", ["[email protected]"], errorMessage)

5.对执行成功的任务做标记

假设表a的数据要流向表b,当上游表a的的数据跑完后,下游表b才能执行。如果表b提前跑了,那么表b的数据可能就会出现为空的现象。 因此我们需要让表a执行完成后做一个标记,只有当表b看到标记后才能开始执行。
在这里插入图片描述
通过以下函数我们就可以实现_success文件的标记

    def runRemoteResultSuccess(self, dt, path, iserror):
        dt_path = path + "/dt=" + dt
        hdfsUser = self.hdfsUser
        hdfsHost = self.hdfsHost
        hiveServer = self.hiveServer
        hdfsUser = self.hdfsUser
        command = """
                hadoop fs -touchz %(dt_path)s/_SUCCESS
                "
        """ % vars()
        print("执行:" + command)
        st = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        for item in st.stdout.readlines():
            print(item)
        status = st.wait()
        if iserror and status > 0:
            print("执行失败" + status)
            sys.exit(1)
        print("执行成功")

6.定时调度配置

关于调度配置这块儿有多种方法,最简单的是直接通过crontab -e 来设置定时脚本执行。 其次就是结合公司的情况,可以使用airflow或者oozie等常见的调度平台,这里就不再过多的介绍了。

猜你喜欢

转载自blog.csdn.net/Lyx_____h/article/details/105977984