我有一个Luigi管道,其中包含我批量运行的任务图。其中一些任务依赖于昂贵的资源(例如AWS EC2集群的机器或其他昂贵的资源)。
我正在尝试以聪明的方式使用此resource
,以便在运行任务之前acquire
,并在所有任务完成后release
。通常,在管道的开头分配昂贵的资源,并且可以很好地释放依赖图的中途。
是否有一种有效的方法可以在Luigi中对此进行建模,以实现资源的aquire
和release
?
根据Aquire
和Release
luigi.Task
对其进行建模并非最佳,因为它会给我的图形增加许多复杂性和不必要的边缘。理想情况下,scheduler
会检查其state
,当不再需要资源的RUNNING
或PENDING
任务时,它可以release
。
这是否已经存在,或者我必须自己将此功能添加到Luigi?
答案 0 :(得分:0)
Luigi支持在任务计划和运行时将采用它的资源概念,然后在完成任务时释放。为什么需要更先进的方法。
来自doc:
此部分可包含任意键。其中每个都指定了调度程序可以允许工作人员使用的全局资源的数量。调度程序将阻止运行指定资源超出本节计数的作业。假定未指定的资源具有限制1.具有2个配置单元资源和1个mysql资源的配置的示例资源部分:
[resources]
hive: 2
mysql: 1
在您的情况下,您可以通过设置aws : 1
来对此进行建模。此资源将仅在当时使用一次。现在,如果您想要控制任务的安排方式,那么您可以尝试使用优先级。
在您的任务中,您可以添加:
resources = {"aws": 1}
据我所知,没有办法直接获取资源,因为这是由任务执行控制的。
更新(来自评论):
例如,如果您想执行某些操作(即清理),则可能需要使用事件处理程序。
@luigi.Task.event_handler(luigi.Event.FAILURE)
def handler_failure(self, exception):
# do cleanups
有关详细信息,请参阅完整的documentation。