Python 在Luigi管道中释放“资源”
我有一个Luigi管道,它由我成批运行的任务图组成。其中一些任务依赖于昂贵的资源(例如AWS EC2计算机集群或其他昂贵的资源) 我试图以智能的方式使用此Python 在Luigi管道中释放“资源”,python,pipeline,luigi,Python,Pipeline,Luigi,我有一个Luigi管道,它由我成批运行的任务图组成。其中一些任务依赖于昂贵的资源(例如AWS EC2计算机集群或其他昂贵的资源) 我试图以智能的方式使用此资源,以便在运行任务之前获取它,并在所有任务完成后尽快释放它。一般来说,昂贵的资源是在管道开始时分配的,而依赖关系图的一半很可能会被释放 在Luigi中,是否有一种有效的方法对此进行建模,以实现资源的获取和释放 根据Aquire和Releaseluigi.Tasks对其进行建模并不是最优的,因为它给我的图表增加了很多复杂性和不必要的边。理想情况
资源
,以便在运行任务之前获取它,并在所有任务完成后尽快释放它。一般来说,昂贵的资源是在管道开始时分配的,而依赖关系图的一半很可能会被释放
在Luigi中,是否有一种有效的方法对此进行建模,以实现资源的获取
和释放
根据Aquire
和Release
luigi.Task
s对其进行建模并不是最优的,因为它给我的图表增加了很多复杂性和不必要的边。理想情况下,调度器
将检查其状态
,当不再有正在运行
或挂起的
任务需要资源时,它可以释放它
这是否已经存在,或者我必须自己将此功能添加到Luigi中?Luigi支持资源的概念,这些资源将在任务计划和运行时占用,然后在TAK完成时释放。为什么您需要更高级的方法
从:
此部分可以包含任意键。其中每一项都指定调度器允许工作人员使用的全局资源量。计划程序将阻止使用指定资源运行的作业超过本节中的计数。假定未指定的资源具有限制1。具有2个配置单元资源和1个mysql资源的配置的示例资源部分:
在您的案例中,您可以通过使用aws:1来对此进行建模。该资源一次只使用一次。现在,如果您想要控制任务的调度方式,那么您可以尝试使用优先级
然后,您可以在任务中添加:
resources = {"aws": 1}
据我所知,无法直接获取资源,因为这是由任务执行控制的
更新了(来自评论):
例如,如果您想要执行某些事情(例如清理),您可能需要使用事件处理程序来执行
@luigi.Task.event_handler(luigi.Event.FAILURE)
def handler_failure(self, exception):
# do cleanups
有关更多信息,请参阅全文 谢谢你的回答,@mfcabrera。我已经在管道中使用了Luigi资源的这个概念。然而,这仅在调度器在给定资源耗尽时不启动许多任务的情况下才有用。假设EC2一次只能处理1个Luigi任务,并且您有4个工人,那么这很有用。然而,它与实际资源(比如EC2)的实际获取和释放无关。在您的示例中,您将如何实现实际AWS资源(例如tasks StartCluster和StopCluster)的启动和停止,特别是在出现故障和禁用任务的情况下?具体地说,在我当前的管道中,StopCluster是DAG中的最后一个任务。因此,在DAG中间的任何故障和上游都会导致StCu簇不被调用,这意味着在错误的情况下,我不能释放EC2实例。@ AntonEvangelatov,您尝试过事件处理程序吗?我会更新答案。也许有帮助,还没有。不清楚每次失败后是否会触发此回调,或者最终在任务失败后是否会触发重试次数。目前,StopCluster被建模为所有可能失败的任务的包装器。如果我可以动态更新StopCluster的依赖项(例如,如果失败3次,则删除失败的任务),这可能会解决问题。
@luigi.Task.event_handler(luigi.Event.FAILURE)
def handler_failure(self, exception):
# do cleanups