Python 获取 datax 执行结果保存到数据库的方法


Posted in Python onJuly 11, 2019

执行 datax 作业,创建执行文件,在 crontab 中每天1点(下面有关系)执行:

其中 job_start 及 job_finish 这两行记录是自己添加的,为了方便识别出哪张表。

#!/bin/bash
source /etc/profile
user1="root"
pass1="pwd"
user2="root"
pass2="pwd"
job_path="/opt/datax/job/"
 
jobfile=(
job_table_a.json
job_table_b.json
)
 
for filename in ${jobfile[@]}
do
	echo "job_start: "`date "+%Y-%m-%d %H:%M:%S"`" ${filename}"
	python /opt/datax/bin/datax.py -p "-Duser1=${user1} -Dpass1=${pass1} -Duser2=${user2} -Dpass2=${pass2}" ${job_path}${filename}
	echo "job_finish: "`date "+%Y-%m-%d %H:%M:%S"`" ${filename}"
done
 
# 0 1 * * * /opt/datax/job/dc_to_ods_incr.sh >> /opt/datax/job/log/dc_to_ods_incr_$(date +\%Y\%m\%d_\%H\%M\%S).log 2>&1
# egrep '任务|速度|总数|job_start|job_finish' /opt/datax/job/log/

datax 执行日志:

job_start: 2018-08-08 01:13:28 job_table_a.json
任务启动时刻          : 2018-08-08 01:13:28
任务结束时刻          : 2018-08-08 01:14:49
任务总计耗时          :         81s
任务平均流量          :     192.82KB/s
记录写入速度          :      1998rec/s
读出记录总数          :       159916
读写失败总数          :          0
job_finish: 2018-08-08 01:14:49 job_table_a.json
job_start: 2018-08-08 01:14:49 job_table_b.json
任务启动时刻          : 2018-08-08 01:14:50
任务结束时刻          : 2018-08-08 01:15:01
任务总计耗时          :         11s
任务平均流量          :        0B/s
记录写入速度          :       0rec/s
读出记录总数          :          0
读写失败总数          :          0
job_finish: 2018-08-08 01:15:01 job_table_b.json

接下来读取这些信息保存到数据库,在数据库中创建表:

CREATE TABLE `datax_job_result` (
 `log_file` varchar(200) DEFAULT NULL,
 `job_file` varchar(200) DEFAULT NULL,
 `start_time` datetime DEFAULT NULL,
 `end_time` datetime DEFAULT NULL,
 `seconds` int(11) DEFAULT NULL,
 `traffic` varchar(50) DEFAULT NULL,
 `write_speed` varchar(50) DEFAULT NULL,
 `read_record` int(11) DEFAULT NULL,
 `failed_record` int(11) DEFAULT NULL,
 `job_start` varchar(200) DEFAULT NULL,
 `job_finish` varchar(200) DEFAULT NULL,
 `insert_time` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

定时执行以下文件,因为 datax 作业 1 点执行,为了获取一天内最新生产的日志,脚本中取 82800内生产的日志文件,及23 小时内生产的那个最新日志。所以一天内任何时间执行都可以。此文件也是定时每天执行(判断 datax 作业完成后执行)

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 0 5 * * * source /etc/profile && /usr/bin/python2.7 /opt/datax/job/save_log_to_db.py > /dev/null 2>&1
 
import re
import os
import sqlalchemy
import pandas as pd
import datetime as dt
 
def save_to_db(df):
	engine = sqlalchemy.create_engine("mysql+pymysql://root:pwd@localhost:3306/test", encoding="utf-8") 
	df.to_sql("datax_job_result", engine, index=False, if_exists='append') 
 
def get_the_latest_file(path):
	t0 = dt.datetime.utcfromtimestamp(0)
	d2 = (dt.datetime.now() - t0).total_seconds()
	d1 = d2 - 82800
	for (dirpath, dirnames, filenames) in os.walk(path):
		for filename in sorted(filenames, reverse = True):
			if filename.endswith(".log"):
				f = os.path.join(dirpath,filename)
				ctime = os.stat(f)[-1]
				if ctime>=d1 and ctime <=d2:
					return f
			
def get_job_result_from_logfile(path):
	result = pd.DataFrame(columns=['log_file','job_file','start_time','end_time','seconds','traffic','write_speed','read_record','failed_record','job_start','job_finish'])
	log_file = get_the_latest_file(path)
	index = 0
	content = open(log_file, "r")
	for line in content:
		result.loc[index, 'log_file'] = log_file
		if re.compile(r'job_start').match(line):
			result.loc[index, 'job_file'] = line.split(' ')[4].strip()
			result.loc[index, 'job_start'] = line,
		elif re.compile(r'任务启动时刻').match(line):
			result.loc[index, 'start_time'] = line.split('刻')[1].strip().split(' ')[1].strip() + ' ' + line.split('刻')[1].strip().split(' ')[2].strip()
		elif re.compile(r'任务结束时刻').match(line):
			result.loc[index, 'end_time'] = line.split('刻')[1].strip().split(' ')[1].strip() + ' ' + line.split('刻')[1].strip().split(' ')[2].strip()
		elif re.compile(r'任务总计耗时').match(line):
			result.loc[index, 'seconds'] = line.split(':')[1].strip().replace('s','')
		elif re.compile(r'任务平均流量').match(line):
			result.loc[index, 'traffic'] = line.split(':')[1].strip()
		elif re.compile(r'记录写入速度').match(line):
			result.loc[index, 'write_speed'] = line.split(':')[1].strip()
		elif re.compile(r'读出记录总数').match(line):
			result.loc[index, 'read_record'] = line.split(':')[1].strip()
		elif re.compile(r'读写失败总数').match(line):
			result.loc[index, 'failed_record'] = line.split(':')[1].strip()
		elif re.compile(r'job_finish').match(line):
			result.loc[index, 'job_finish'] = line,
			index = index + 1
		else:
			pass
	save_to_db(result)
 
get_job_result_from_logfile("/opt/datax/job/log")

以上这篇Python 获取 datax 执行结果保存到数据库的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析json实例方法
Nov 19 Python
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
python实现字典(dict)和字符串(string)的相互转换方法
Mar 01 Python
python 从csv读数据到mysql的实例
Jun 21 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
什么是Python包的循环导入
Sep 08 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 Python
python中filter,map,reduce的作用
Jun 10 Python
virtualenv隔离Python环境的问题解析
Jun 21 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 #Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 #Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 #Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 #Python
Python用字典构建多级菜单功能
Jul 11 #Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 #Python
python切片的步进、添加、连接简单操作示例
Jul 11 #Python
You might like
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
php多文件上传下载示例分享
2014/02/20 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript重写alert方法的实例代码
2013/03/29 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python正则表达式之作业计算器
2016/03/18 Python
python 网络编程常用代码段
2016/08/28 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
2014新课程改革心得体会
2014/03/10 职场文书
抽奖活动主持词
2014/03/31 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
寒山寺导游词
2015/02/03 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers