DataX+Crontab实现多任务顺序定时同步
前言
DataX
是一款支持在异构数据源之间离线同步数据的工具, DataX
通过输入一些命令执行 json
配置文件,这样使用起来并不是很方便, DataX
也不支持定时任务调度,它仅支持一次性同步任务。所以 DataX
的这些特点造成了它无法完成一些复杂的任务编排工作,如多个任务之间的依赖调用。
市面上对 DataX
扩展的开源项目很好的解决了这些问题:
DataX Web
:是一个基于DataX
构建的图形化数据同步平台。DataX
本身是一个高效的数据同步工具,而DataX Web
则提供了一个用户友好的界面,使得数据同步任务的配置、管理和监控变得更加直观和便捷。
Apache airflow
:是一个开源平台,用于准备、监控和调度工作流。它允许你定义复杂的数据管道,并且可以轻松地管理这些管道的依赖关系。Airflow
采用Python
编写,使用DAG
(有向无环图)来表示工作流,这使得它非常适合用于构建和管理数据工程中的各种任务。
本文介绍的一种 DataX
顺序编排任务调度的方式是采用是 Shell
脚本实现的,这种方式相对于以上两种开源项目来说更加轻量,虽然功能没有它们强大,但是在一些简单的业务场景中使用更具性价比。
DataX顺序调用
以下是一个顺序调用的 Shell
脚本,它的作用是调用此脚本的时候传入多个 DataX
的 json
配置文件路径,此脚本会调用 datax.py
的代码,并顺序执行 json
配置,如果中途有某个 json
配置执行失败,则返回失败提示。
Shell 脚本代码
bash
#!/bin/bash
source /etc/profile
# 定义一个函数来执行同步操作
execute_sync() {
local json_file="$1"
local task_name="${json_file##*/}" # 提取文件名作为任务名
task_name="${task_name%.*}" # 去掉文件扩展名
python /path/to/datax/bin/datax.py "$json_file"
local EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
echo "----------------------- $task_name 同步任务执行失败,退出码为 $EXIT_CODE -----------------------"
exit $EXIT_CODE
else
echo "----------------------- $task_name 同步任务执行成功 -----------------------"
fi
}
# 检查是否有足够的参数
if [ "$#" -eq 0 ]; then
echo "请提供要同步的 JSON 文件名作为参数。"
exit 1
fi
# 迭代所有传入的参数
for json_file in "$@"; do
execute_sync "$json_file"
done
解释代码:
source /etc/profile
:这行命令会加载系统的环境变量配置文件,通常用于更新环境变量,使得脚本能够访问或使用这些环境变量。加上这行代码是为了防止执行Crontab
时脚本找不到Java
环境变量,提示找不到Java
命令。- 参数检查:如果没有参数传入脚本,则打印错误消息并退出脚本
execute_sync
函数:- 接受一个参数
$1
,即传递给该函数的第一个参数,这里是指定的JSON
文件路径 - 提取文件名作为任务名
- 去除文件扩展名
- 执行
datax.py
脚本并传入json_file
作为参数 - 获取脚本执行后的退出状态码$?并存储在EXIT_CODE变量中
- 根据退出状态码判断
datax.py
是否成功执行,并相应地打印信息或退出脚本
- 接受一个参数
- 循环处理所有传入的参数:对于每个传入的
JSON
文件名,调用execute_sync
函数
执行脚本
赋予脚本权限:
bash
chmod +x /path/to/datax.sh
先执行命令测试一下接口是否能成功执行。
bash
/path/to/datax.sh /path/to/xxx.json
当看到同步成功的返回信息时说明执行 DataX 成功了。
多任务
传入多个 json
配置文件,顺序执行多个同步任务,命令如下:
bash
/path/to/datax.sh /path/to/1.json /path/to/2.json
Crontab
大部分 Linux
系统都自带 Crontab
。 Crontab
的名字来源于 cron table
,即 cron 表
的意思。Crontab
使用起来也很简单,它允许用户编辑一个文本文件用来描述调度任务的 cron
表达式及任务的执行命令。格式如下:
bash
* * * * * command_to_execute
这里5个星号从左到右分别代表:
分钟
(0-59)小时
(0-23)月份中的日期
(1-31)月份
(1-12)一周中的哪一天
(0-6),其中 0 和 7 代表周日
请看一组 cron
表达式的示例:
0 2 * * *
: 每天凌晨两点整点执行30 4 * * 1
:每周一的早上四点半执行0 1 * * 1,5
:每周一和周五的凌晨一点执行。0 0 1 * *
:每个月的第一天午夜零点执行。*/5 * * * *
:每隔五分钟执行一次。
如果自己写出了一个 cron
表达式,但是不知道写的是否正确,可以去这个网址 Crontab.guru - The cron schedule expression generator 检验一下。
DataX 定时任务
先来学习一下 Crontab
最常用到的几个命令:
bash
# 查询调度
crontab -l
# 编辑调度
crontab -e
# 删除所有调度
crontab -r
执行 crontab -l
命令,可以看到目前还一个定时任务都没有。
执行 crontab -e
命令,出现一个类似于 vi
或 vim
的编辑界面。按键盘 i
键进入编辑模式,将任务表达式复制到第一行。
按键盘 ESC
键退出编辑模式,按 SHIFT + :
键,最下面一行出现命令行输入的位置,输入 wq
表示退出并保存,结束本次 Crontab
的编辑。如果想退出不保存可以在下方命令行输入 q!
退出。
再次敲下命令 crontab -l
查看定时任务,刚才创建的定时任务已经存在了。
我创建的是一个每小时一次整点触发的定时任务,想要看它是否执行以及执行的情况可以执行以下命令:
bash
# 查询运行状态
systemctl status crond
# 查看cron日志
tail -200f /var/log/messages
tail -200f /var/log/cron
查看运行状态显示 running
表示正在运行中
/var/log/cron
日志只能看到一条日志记录,这条记录表示你创建的任务执行了,但不知道有没有报错,执行成功没有。想要看到更详细的日志,我们可以在编辑 crontab
的时候,在命令后面追加日志的保存文件路径。
bash
0 * * * * /path/to/datax.sh /path/to/1.json /path/to/2.json >> /path/to/datax/job/log/dm_swlztb_qjzl.log 2>&1
>>
符号后面的 log
文件就是要保存的日志文件, 2>&1
是固定写法,不必深究其含义。
总结
本文介绍了一种 DataX
多个任务顺序调用的轻量解决方案,采用的是 DataX + Shell + Crontab
的方式,利用 Shell
脚本循环调用 DataX
一次性任务,同时利用 Crontab
对 Shell
脚本定时调用。这种方案的优势在于部署的组件更少,通过调用 Shell
脚本传参的灵活方式达到多任务的效果。