我使用CeleryExecutor在Kubernetes中运行了Airflow。 Airflow使用DatabricksOperator提交并监视Spark作业。
我的流式Spark作业的运行时间非常长(除非失败或被取消,否则它们将永远运行)。在运行流作业时杀死Airflow worker的pod时,会发生以下情况:
如何强制工人在我的Spark作业关闭之前将其杀死?
我尝试用TERM信号杀死Celery工人,但是显然这导致Celery停止接受新任务并等待当前任务完成(docs)。
答案 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.
"""