2

我有一个 Luigi 管道,其中包含我批量运行的任务图。其中一些任务依赖于昂贵的资源(例如 AWS EC2 机器集群或其他昂贵的资源)。

我正在尝试以resource一种智能的方式使用它,以便acquire在运行任务之前使用release它,并且在所有任务完成后立即使用它。一般来说,昂贵的资源是在管道的开始分配的,并且在依赖图的中途可以很好地释放。

是否有一种有效的方法可以在 Luigi 中对此进行建模,以实现资源的aquirerelease

Aquire用and s对其进行建模Release luigi.Task并不是最优的,因为它给我的图增加了很多复杂性和不必要的边。理想情况下,scheduler它会检查它state,当没有更多RUNNINGPENDING需要资源的任务时,它可以检查release它。

这是否已经存在,或者我必须自己将此功能添加到 Luigi?

4

1 回答 1

1

Luigi 支持资源的概念,当任务被调度和运行时将占用它,然后在任务完成时释放。为什么需要更高级的方法。

文档

此部分可以包含任意键。这些中的每一个都指定了调度程序可以允许工作人员使用的全局资源的数量。调度程序将防止运行具有指定资源的作业超过本节中的计数。假定未指定的资源具有限制 1。具有 2 个 hive 资源和 1 个 mysql 资源的配置的示例资源部分:

[resources]
hive: 2
mysql: 1

在您的情况下,您可以通过 ie 对此进行建模 aws : 1。然后,该资源一次只能使用一次。现在,如果您想要控制任务的安排方式,那么您可以尝试使用优先级。

在您的任务中,您可以添加:

resources = {"aws": 1}

据我所知,没有办法直接获取资源,因为这是由任务执行控制的。

更新(来自评论):

例如,如果您想要执行某些事情(即清理),您可能想要为此使用事件处理程序。

 @luigi.Task.event_handler(luigi.Event.FAILURE)
 def handler_failure(self, exception):
       # do cleanups

有关更多信息,请参阅完整文档

于 2017-03-27T10:28:20.987 回答