我们有一个包含不同类型工作的系统。例如,我们称它们为:
job_1
job_2
job_3
它们都需要不同的参数集(和可选参数)。即我们job_1(x)
为不同的x=
A, B, C ...
. job_2
运行一组参数,这些参数取决于结果job_1(x)
并job_2
加载job_A(x)
存储的数据。等等。
结果是依赖关系的树结构。现在,这些工作偶尔会因为某种原因而失败。因此,如果job_A
forx=B
失败,该树的分支将完全失败并且不应该运行。所有其他分支都应该运行。
所有作业都用 Python 编写并使用并行性(基于生成 SLURM 作业)。它们是用 cron 安排的。这显然不是很好,并且有两个主要缺点:
- 调试非常困难。无论树中较高的作业是否失败,所有作业都会运行。如果不深入了解依赖关系,很难看出问题出在哪里。
- 如果更高的作业(例如
job_A
)未完成,则job_B
可能会安排运行,并且会失败或根据过时的日期运行。
为了解决这个问题,我们正在研究用于调度或可视化的气流,因为它是用 Python 编写的,并且似乎大致符合我们的需求。我看到了不同的挑战:
- 作业的依赖树要么非常通用(即取决于
job_B
)job_A
,要么非常宽(即job_B(y)
对于 100 个参数取决于job_A(x=A)
对于某个参数失败。后一种情况下的可视化树将非常宽,大约有 300 个叶子。它会更准确,但可视化可能难以阅读。我们可以过滤失败的作业,只查看它们的依赖关系吗? - 我们在作业中具有并行性(我们需要它,否则作业运行超过一天,并且我们希望每天重新运行全部)这是否会破坏我们的调度?
- 我们希望尽可能少地改变我们的工作和数据管理。
- 我们能否以一种易于理解的方式实施接下来要产生哪些工作的规则系统?
气流是一个不错的选择吗?我知道还有其他一些(luigi、Azkaban 等)与 Hadoop 堆栈有些相关(我们没有使用它,因为它不是大数据)。需要多少黑客攻击?多少黑客行为是明智的?