目前,我有一堆排队的luigi任务,带有一个简单的依赖链(a -> b -> c -> d
).d
首先执行,a
最后执行.a
是被触发的任务.
所有目标除了a
返回一个luigi.LocalTarget()
对象并且具有一个通用luigi.Parameter()
字符串(包含日期和时间).在luigi中央服务器上运行(已启用历史记录).
问题是,当我重新运行上述任务时a
,luigi检查历史记录并查看之前是否运行过该特定任务,如果状态为DONE,则不执行任务(d
在本例中)并且我不能有,改变字符串没有帮助(添加一个随机的微秒).如何强制执行任务?
首先评论:Luigi任务是幂等的.如果您运行具有相同参数值的任务,无论您运行多少次,它都必须始终返回相同的输出.因此,不止一次运行它是没有意义的.这使得Luigi变得强大:如果你有一项重大任务会让很多事情花费很多时间并且在某个地方失败,那么你必须从头开始重新运行它.如果将它拆分为较小的任务,运行它并且失败,您只需要运行管道中的其余任务.
当您运行任务时,Luigi会检查该任务的输出以查看它们是否存在.如果他们不这样做,Luigi会检查它所依赖的任务的输出.如果它们存在,那么它将只运行当前任务并生成输出Target
.如果依赖项输出不存在,那么它将运行该任务.
因此,如果要重新运行任务,则必须删除其Target
输出.如果要重新运行整个管道,则必须删除任务依赖于级联的所有任务的所有输出.
有一个在这个问题正在讨论中路易吉库.看一下这个评论,因为它会指向一些脚本来获取给定任务的输出目标并删除它们.