上文请点击:[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等常见的调度平台,这里就不再过多的介绍了。