如何安全地重新启动Airflow并终止长时间运行的任务?

时间:2020-07-28 20:03:14

标签: celery spark-streaming databricks airflow-worker

我使用CeleryExecutor在Kubernetes中运行了Airflow。 Airflow使用DatabricksOperator提交并监视Spark作业。

我的流式Spark作业的运行时间非常长(除非失败或被取消,否则它们将永远运行)。在运行流作业时杀死Airflow worker的pod时,会发生以下情况:

  1. 关联的任务变为僵尸(运行状态,但无心跳进程)
  2. 当气流收起僵尸时,任务被标记为失败
  3. 火花流作业继续运行

如何强制工人在我的Spark作业关闭之前将其杀死?

我尝试用TERM信号杀死Celery工人,但是显然这导致Celery停止接受新任务并等待当前任务完成(docs)。

1 个答案:

答案 0 :(得分:1)

您需要更清楚地了解这个问题。如果您说Spark集群按预期完成了工作,而不是调用on_kill函数,则这是预期的行为。根据kill函数上的文档是在任务被杀死后进行清理。

def on_kill(self) -> None:
    """
    Override this method to cleanup subprocesses when a task instance
    gets killed. Any use of the threading, subprocess or multiprocessing
    module within an operator needs to be cleaned up or it will leave
    ghost processes behind.
    """

以您为例,当您手动取消作业时,它正在执行其必须执行的操作。

现在,即使您希望在成功完成作业后也进行清理,请覆盖post_execute函数。 根据文档。帖子执行是

def post_execute(self, context: Any, result: Any = None):
    """
    This hook is triggered right after self.execute() is called.
    It is passed the execution context and any results returned by the
    operator.
    """