Luigi 未能完成 require 方法中列出的所有任务

Posted

技术标签:

【中文标题】Luigi 未能完成 require 方法中列出的所有任务【英文标题】:Luigi fails to finish all tasks listed in the require method 【发布时间】:2016-08-14 04:21:47 【问题描述】:

假设我有一个具有以下依赖结构的任务

class ParentTask(luigi.Task):
    def requires(self):
        return [ChildTask(classLevel=x) for x in self.class_level_list]
    def run(self):
        yadayda

子任务自己运行良好。父级正确检查所有子级任务的完成状态。然而,当第一个子任务完成时,调度程序将父任务标记为已完成。带有以下消息:

   Scheduled 15 tasks of which:
* 3 ran successfully:
    - 1 CleanRecord(...)
    - 1 EstimateQuestionParameter(classLevel=6, qdt=2016-04-19, subject=english)
    - 1 GetLog(classLevel=6, qdt=2016-04-19, subject=english)
* 12 were left pending, among these:
    * 12 were left pending because of unknown reason:
        - 5 EstimateQuestionParameter(classLevel=1...5, qdt=2016-04-19, subject=english)
        - 5 GetLog(pool=None, classLevel=1...5, qdt=2016-04-19, subject=english)
        - 1 UpdateQuestionParameter(qdt=2016-04-19, lastQdt=2016-03-23, subject=english, isInit=False)
        - 1 UpdateQuestionParameterBuffer(qdt=2016-04-19, subject=english, src_table=edw.edw_behavior_question_record_exam_new)

This progress looks :) because there were no failed tasks or missing external dependencies

【问题讨论】:

从来没有见过这个错误发生......我认为如果没有看到你正在运行的代码就很难知道发生了什么 你有嫌疑人吗?我不能发布所有的 src 代码,但可以构造一些代表任务的伪代码。 @Junchen 请贴出相关代码或伪代码。 我也遇到了同样的情况,你查出原因了吗? 在我的例子中,它原来是一个断开连接的工作人员(即停止响应 ping)。 【参考方案1】:

我认为这是因为您的工作人员与调度程序断开连接。由于网络分区,或者更有可能是因为issue,它们从未发送过,因此工作人员的心跳没有到达调度程序。

您有两种解决问题的方法:

增加worker-disconnect-delay设置(配置中[scheduler]部分,默认60s) 为您的工作使用多个工人,例如--workers 2(如果是后一种原因)

【讨论】:

我在 luigi 配置文件的 worker 部分添加了 keep_alive。问题不再出现。我认为您的解决方案是正确的。

以上是关于Luigi 未能完成 require 方法中列出的所有任务的主要内容,如果未能解决你的问题,请参考以下文章

Luigi 参数默认值和模拟

Pyscard 未能列出读者

如何从 Python Luigi 登录

如何在 Python Luigi 中使用参数

Luigi 没有接下一个要运行的任务,剩下一堆待处理的任务,没有失败的任务

luigi框架--关于python运行spark程序