对于我来说,从自定义的科学工作流管理(python)转向一些团队工作的时间已经过去了。简而言之,我的工作流程涉及长时间运行的(天)流程,其中包含大量共享参数。作为依赖图,节点是产生输出或执行某些其他工作的任务。这在工作流工具中似乎相当普遍。
然而,我需要的关键是每个任务都是由它所需的参数定义的。根据这些参数及其依赖项的所有参数的状态实例化任务。因此,如果一个任务已经根据给定的参数状态完成了它的作业,那么它就是完成的,并且不会重新运行。此参数状态不是全局参数状态,而只是与DAG的该部分相关的状态。这种对参数状态而不是完成时间的依赖似乎是我的需求和现有工具之间的本质区别(至少我从Luigi和Airflow的快速浏览中收集到的)。完成时间可以是一个这样的参数,但通常它不是确定DAG的(重新)运行的时间,而是确定参数状态是否与调用任务的参数状态一致。对我来说,‘参数爆炸’以及与参数状态和DAG的关系不是无关紧要的问题,但这些不是我的问题。
我的问题是,哪种现有的python工具更容易定义与此参数状态相关的“完整”?有人建议Luigi可以通过编写一个自定义的complete方法来兼容我的需求,该方法可以将构建数据(‘target’)的元数据与所需的参数状态进行比较。
那气流呢?我没有看到任何关于这个问题的提及,但只是简单地阅读了一下文档。由于添加此功能是一项重要的工作,这会占用我的“科学”工作,因此我想从更好的工具开始。Airflow肯定有动力,但我的需求可能离它的目的太远了。定义完整的参数状态有两个原因-- 1)对于复杂的长时间运行的任务,我不能每次在非常大的全局参数状态下更改某些参数时都重新运行DAG;2)出于科学和数据完整性的原因,我需要知道中间和最终结果是如何产生的。
发布于 2020-04-06 16:42:12
我进一步研究了Luigi和Airflow,据我所知,它们都不适合根据我的需要进行修改。主要的不兼容性是这些工具基本上基于预先确定的DAG/工作流。我的现有框架在实例化的和完全指定的DAG上运行,这些DAG是在运行时发现的,而不是在外部简洁地描述的--这是必要的,因为对于给定的请求,了解每个任务是否完成取决于许多参数值的组合,这些参数值定义了该任务的输出和所有上游任务的已用输出。通过实例化,我指的是各个运行的“中间”结果,每个结果都由复制(承受任何随机元素)来自该任务的相同输出所必需的完整参数状态(变量值)描述。
因此,提前在DAG上运行的“Scheduler”是没有用的。
一般来说,大多数现有的工作流框架,至少在python中,似乎更多地被设计为以一种易于扩展和健壮的方式,通过并行化来自动化许多相对简单的任务,而很少强调更复杂的分析的增量构建,以及在可能的情况下必须重用的结果,以链接复杂和昂贵的计算任务,这些任务的输出可能会被用作额外的不可预见的分析的输入。
今天早上我刚刚发现了'Prefect‘工作流程,我很想了解更多--至少它显然资金充足;-)。我最初的感觉是,它可能对预调度的依赖较少,因此更具流动性,更容易适应我的需求,但这只是一种预感。在许多方面,我的一些更复杂的“单一”任务可能非常适合包装整个Prefect流,如果它们很好地一起玩。我的需求似乎在深度复杂的DAG频谱的另一端(我不会尝试写出我的需求!)永远不会结束下游的添加。
我将更仔细地研究Prefect和Luigi,看看我可以借鉴什么来使我的框架更健壮,更少巴洛克风格。或者我可以在Prefect中添加一层完整的数据描述...
更新--与Prefect人员讨论,明确我需要从底层的Dask开始,看看它是否足够灵活--也许使用Dask delayed或futures。显然,Dask是非同寻常的。建立在Dask之上的Graphchain是在正确的方向上的一步,它促进了在由代码库和参数的散列识别的依赖‘链’上计算的‘中间’输出的永久存储。与我需要的非常接近,尽管对那些确定定义输出的参数进行了更明确的处理。
https://stackoverflow.com/questions/60938401
复制相似问题