有一个原始数据库 A,里面包含所有需要的数据。
例子中主要是数据分析的脚本,在实际中不仅限于此,还有不少 log 分析的脚本,警报脚本等等。
这样的需要定时运行的小脚本有 40 多个。现在全靠 crontab 和 jenkins 运行,已经感觉难以管理了。
对于这些要长不长,要短不短的小脚本,大家有什么比较好的管理方案吗?
支持定时启动
满足某些条件(某个脚本运行完,某个脚本的输出结果满足什么条件等等)启动
热拔插,添加 /修改新脚本不影响老脚本
新脚本可以轻松获取某个或者某些老脚本的输出结果
脚本量大了以后,快速找到实现某个功能的脚本文件以方便排查问题
在 Python 2 时代,有一个 Frabic 可以大致实现这个功能,不知道在 Python 3 时代,有没有更好的方式?
1
chenqh 2018-03-06 22:16:19 +08:00 via iPhone
这不是写文档的作用吗
|
3
ToT 2018-03-07 04:21:09 +08:00
公司内部有 scheduler, 可以将任何 job 部署到指定 nodes 运行,可以订制时间+dependency。Python 应该也有类似 lib 吧。
http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html 小报告多的话,我是单独写一个 UI 让大家查看的。 |
4
bxh566 2018-03-07 07:45:14 +08:00 via Android
luigi?
|
6
httplife 2018-03-07 08:22:17 +08:00
再写一个 管理 py
|
8
udumbara 2018-03-07 09:03:54 +08:00 via Android
airflow
|
9
monsterxx03 2018-03-07 10:04:04 +08:00
用过 luigi, airflow, 这些为了 ETL 做的工具不太适合管理这些脚本,这些工具都需要脚本做适配, 我们的问题是脚本数太多,还是分散到好多人写的,最后框架还是自己写的,给每个脚本写一段 yaml 的配置定义:
daily_log_cal: type: call once: per_day timeout: 600 func: 'path.to.moudule:main' args: - a - b kwargs: c: 1 slack: - '@somebody' deps: - upstream_job1 每个脚本暴露一个 main 入口函数, 可以从 yaml 中传入参数, 用子进程来运行每个任务,防止一些脚本写的有问题耗内存太多不释放, 用 signal 实现超时控制, 任务运行失败直接 slack 通知到人, deps 定义一个简单的 DAG 依赖管理, 上游任务失败直接跳过. 还可以根据需求定制一些其他类型的任务,比如 type: sql, 就是制定一个 sql 文件,直接在数据仓库里执行(一般是刷新一些表). 至于运行启动时间, 如果任务有精确到几点几分的要求就单独设置 cronjob,如果只是要求 hourly 或者 daily 运行一次,就定制一个任务 list 作为入口,用 cronjob 触发. |
10
locktionc OP @monsterxx03 yaml 对缩进太敏感了。实在要自己写的话,我们可能会用 ini 或者 json
|
11
iyaozhen 2018-03-07 10:17:11 +08:00 via Android
@locktionc 😂哥你都用游标卡尺了。还怕配置文件的缩进。yaml 用作配置文件比 json 和 ini 体验好很多
|
12
wibile 2018-03-07 10:21:36 +08:00
airflow
|
14
RangerWolf 2018-03-07 23:27:05 +08:00
遇到同样的问题!
没有什么太好的解决方案, 目前也是 crontab 为主。 |