管理大量 Python 3 数据分析小脚本的最佳方案是什么?

2018-03-06 19:07:23 +08:00
 locktionc

应用场景

有一个原始数据库 A,里面包含所有需要的数据。

例子中主要是数据分析的脚本,在实际中不仅限于此,还有不少 log 分析的脚本,警报脚本等等。

这样的需要定时运行的小脚本有 40 多个。现在全靠 crontab 和 jenkins 运行,已经感觉难以管理了。

对于这些要长不长,要短不短的小脚本,大家有什么比较好的管理方案吗?

需求

  1. 支持定时启动

  2. 满足某些条件(某个脚本运行完,某个脚本的输出结果满足什么条件等等)启动

  3. 热拔插,添加 /修改新脚本不影响老脚本

  4. 新脚本可以轻松获取某个或者某些老脚本的输出结果

  5. 脚本量大了以后,快速找到实现某个功能的脚本文件以方便排查问题

在 Python 2 时代,有一个 Frabic 可以大致实现这个功能,不知道在 Python 3 时代,有没有更好的方式?

2992 次点击
所在节点    问与答
14 条回复
chenqh
2018-03-06 22:16:19 +08:00
这不是写文档的作用吗
locktionc
2018-03-06 23:25:34 +08:00
@chenqh 文档不能解决小脚本的调度和组合的问题。
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 让大家查看的。
bxh566
2018-03-07 07:45:14 +08:00
luigi?
locktionc
2018-03-07 08:12:16 +08:00
@bxh566 我看看
httplife
2018-03-07 08:22:17 +08:00
再写一个 管理 py
locktionc
2018-03-07 09:01:48 +08:00
@httplife 实在找不到更好的情况下,也只有这样做了。
udumbara
2018-03-07 09:03:54 +08:00
airflow
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 触发.
locktionc
2018-03-07 10:12:54 +08:00
@monsterxx03 yaml 对缩进太敏感了。实在要自己写的话,我们可能会用 ini 或者 json
iyaozhen
2018-03-07 10:17:11 +08:00
@locktionc 😂哥你都用游标卡尺了。还怕配置文件的缩进。yaml 用作配置文件比 json 和 ini 体验好很多
wibile
2018-03-07 10:21:36 +08:00
airflow
locktionc
2018-03-07 17:22:51 +08:00
@wibile 我看看
RangerWolf
2018-03-07 23:27:05 +08:00
遇到同样的问题!
没有什么太好的解决方案, 目前也是 crontab 为主。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/435487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX