Machine A
能够访问SQL数据库,Machine B
能够访问Google Drive。如果UploadToDrive
依赖于DownloadSQLData
某个地方,如何确保任务在正确的机器上运行?你知道吗
目前Machine A
运行DoSomethingElseWithData
,Machine B
运行UploadToDrive
几分钟后。直到有一天Machine A
可能不起作用,此时Machine B
将尝试DownloadSQLData
作为上游依赖项并失败为止,这都是正常的。你知道吗
class DownloadSQLData(luigi.Task):
# ...
def run(self):
# Only Machine A can do this
# ...
class TransformData(luigi.Task):
# ...
def requires(self):
return DownloadSQLData(date=self.date)
class UploadToDrive(luigi.Task):
# ...
def requires(self):
return TransformData(date=self.date)
def run(self):
# Only Machine B can do this
# ...
class DoSomethingElseWithData(luigi.Task):
#...
def requires(self):
return TransformData(date=self.date)
这个例子中的SQL数据库实际上不是SQL数据库,而是我们公司内部的一个旧系统。当未经授权的用户试图访问它时,它不会优雅地失败,我们希望避免任何来自Machine B
的尝试。你知道吗
Luigi本身不能进行调度,即在某些机器上运行某些任务或将任务调度到某个时间运行。也就是说,有很多方法可以实现你想要的。你知道吗
解决方案1:让我们介绍机器
C
,它可以访问机器A
和B
。使用许多工具(https://wiki.python.org/moin/SecureShell)机器C
可以运行任务从A
检索数据,在C
上转换数据,然后在上载之前传输到B
。你知道吗解决方案2:此解决方案很可能工作量过大和/或不可行。在网络调度器(类似slurmhttps://www.schedmd.com/)中设置机器
A,B,C
,以C
作为头调度器,并将A
和B
指定为特定类型的资源(可能是SQL
和GDrive
)。然后,从C
开始,将slurm任务安排为luigi作业(https://github.com/pharmbio/sciluigi可以提供帮助)。这些slurm任务应该指定每个任务所需的给定资源。这就是它!你知道吗相关问题 更多 >
编程相关推荐