我正在维护一个数据仓库系统,它涉及许多相关作业(数据导入、转换等)。我一直使用 Linuxcrontab
来管理它们,直到作业之间的依赖关系变得复杂。
基本上,我正在寻找一些cron
可以帮助我解决以下情况的替代品:
在(简单)处运行作业 A。
00:05
通常这是导入作业。安排作业 B、C、D 在作业 A 完成后运行。作业 D 仅在作业 A 完成后 30 分钟运行(以分配负载)。这些是转换作业。
当 B、C、D 全部完成后,作业 E 运行。通常,此作业将汇总数据带入 Web 前端数据库。
所有这些都发生在同一个节点上。
我想象它看起来像一个拓扑图。
A--> B -------------->---> E
\-> C -------------/ /
\-> (delay 30mins) -> D
有没有支持这个的基于 Linux 的简单工具?我研究过Airbnb 的 Chronos但这似乎超出了我的需要。
编辑:上述场景只是正在发生的事情的简化版本。我们有很多日常工作,依赖关系也复杂得多。所以我实际上正在寻找一些“强化版 cron”,而不是逐个案例的 bash 脚本来满足每种情况。
答案1
正如 Michael Kjörling 在评论中所建议的,你应该能够使用一个简单的 bash 脚本来做到这一点。就像这样:
#!/usr/bin/env bash
## Log file to which the "echo" commands bellow will write
logfile="/tmp/$$.log"
## Change "ls /etc >/dev/null " to reflect the actual
## jobs you want to run but keep the "&& echo job N finished" as is.
jobA="ls /etc >/dev/null"
jobB="ls /etc >/dev/null && echo 'job B finished' >> $logfile"
jobC="ls /etc >/dev/null && echo 'job C finished' >> $logfile"
jobD="ls /etc >/dev/null && echo 'job D finished' >> $logfile"
jobE="ls /etc >/dev/null";
## Run job A, launch jobs B and C as soon as A is finished
## and launch job D 30 minutes after A finishes.
eval $jobA && (sleep 30 && eval $jobD) & eval $jobB & eval $jobC &
## Now, monitor the logfile and run job E when the rest have finished
while true; do
lines=`wc -l $logfile | cut -f 1 -d ' '`;
echo "$logfile : $lines"
## The logfile will contain 4 lines if all jobs have finished
if [ "$lines" -eq 3 ];
then
## Run job E
eval $jobE
## Delete the logfile
rm $logfile
## exit the script
exit 0;
fi
## Only check if the jobs are finished once a minute
sleep 60;
done
如果你cron
在 00:05 启动此脚本,它应该会执行你想要的操作。这里的主要技巧是使用子壳 ()
和&&
。Subshels 允许您运行多个后台作业,并且&&
仅在另一个作业成功退出后才运行作业。
答案2
这些看起来很有趣:
- https://airflow.incubator.apache.org/
不是那么简单,但功能强大,由 apache 支持,通过代码配置,现在被广泛使用
- https://www.digdag.io/
类似 java airflow,配置更简单
- https://github.com/thieman/dagobah
Python 中基于 DAG 的简单作业调度程序
- https://github.com/spotify/luigi(图片来源:Spotify)
Luigi 是一个 Python 模块,可以帮助您构建复杂的批处理作业管道。
这些都是 python 项目(digdag 除外),旨在用漂亮的 GUI 替换 cron 来查看依赖关系图。
我曾经使用 bash 来做这些事情,但是当你发展到复杂的系统时它就变得丑陋了。
答案3
BMC Software 推出了一款名为 Control-M 的产品,它完全符合您对问题的描述。但是,它不是免费的 :(
我们使用它来管理大约 500 个生产作业,以及大约 400 个测试作业。您可以在任何需要的机器上安装客户端,然后在 Control-M 服务器上设置作业以在客户端上运行。有很多可配置的参数和调度标准,所有这些都可以通过 GUI 或命令行进行管理。最适合您的问题的部分是,它擅长为作业设置输入/输出条件,这样您只需在作业之间进行拖放即可拥有依赖关系。我们使用它来一次设置 20 多个作业的工作流。