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

本文介绍如何使用DataX进行数据同步作业的调度,包括通过CronTab设置每日执行,以及如何从执行日志中解析关键信息并保存至数据库,以便于后续的数据分析与监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行 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")

 

### DataX 安装指南 DataX 是一款高效的数据同步工具,支持多种数据源之间的数据迁移和同步。以下是详细的安装步骤: 1. **下载与上传** 首先,从官方渠道获取 DataX 的安装包(通常为 `datax.tar.gz` 文件),然后将其上传到目标服务器的指定目录,例如 `/opt/modules`。 2. **解压安装包** 使用以下命令将压缩包解压到安装目录: ```bash tar -zxvf datax.tar.gz -C /opt/installs ``` 3. **配置环境变量** 编辑系统环境变量配置文件 `/etc/profile`,添加以下内容以设置 `DATAX_HOME` 和 `PATH`: ```bash export DATAX_HOME=/opt/installs/datax export PATH=$PATH:$DATAX_HOME/bin ``` 保存后,运行以下命令使配置生效: ```bash source /etc/profile ``` 4. **验证安装** 执行以下命令检查 DataX 是否安装成功: ```bash datax.py --version ``` 如果输出显示 DataX 的版本信息,则表示安装成功。 ### DataX 使用教程 #### 1. **准备配置文件** DataX 的任务执行依赖于 JSON 格式的配置文件。该文件定义了数据源、目标端、同步策略等信息。一个典型的配置文件如下所示: ```json { "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "connection": [ { "jdbcUrl": "jdbc:mysql://localhost:3306/test", "table": ["user"], "username": "root", "password": "123456" } ], "column": ["*"] } }, "writer": { "name": "hdfswriter", "parameter": { "defaultFS": "hdfs://localhost:9000", "fileType": "text", "path": "/user/hive/warehouse/user", "fileName": "user_data", "column": [ {"name": "id", "type": "INT"}, {"name": "name", "type": "STRING"} ] } } } ], "setting": { "speed": { "channel": "3" } } } } ``` 上述示例中,MySQL 数据库中的 `user` 表被同步到 HDFS 上。 #### 2. **启动 DataX 任务** 使用 `datax.py` 脚本启动任务,命令格式如下: ```bash python /path/to/datax.py /path/to/job.json ``` 其中,`/path/to/datax.py` 是 DataX 主程序路径,`/path/to/job.json` 是任务配置文件路径。 #### 3. **监控与调试** 在任务执行过程中,可以通过日志查看进度和状态。如果出现错误,可以结合日志分析原因并调整配置。 #### 4. **性能优化** DataX 提供了多种切分策略,确保作业能够合理切分成多个 Task 并行执行。通过调整并发数 (`channel`),可以在源端和目的端性能充足的情况下,最大化网络带宽利用率。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值