触发执行超时时,不会停止气流任务

时间:2018-04-27 03:28:03

标签: airflow

我有自己的自定义运算符扩展BaseOperator,如下所示。 如果任务运行超过30分钟,我试图杀死任务。 超时似乎是根据日志触发但任务仍在继续。

我错过了什么吗?我检查了官方文件,但不知道出了什么问题。 https://airflow.apache.org/code.html#baseoperator

我的运营商如下。

class MyOperator(BaseOperator):
    @apply_defaults
    def __init__(
      self,
      some_parameters_here,
      *args,
      **kwargs):
      *args,
      **kwargs):
      super(MyOperator, self).__init__(*args, **kwargs)
      # some initialization here

    def execute(self, context):
      # some code here

我的任务如下。

t = MyOperator(
     task_id='task',
     dag=scheduled_dag,
     execution_timeout=timedelta(minutes=30)

我发现了这个错误,但任务仍在继续。

[2018-04-12 03:30:28,353] {base_task_runner.py:98} INFO - Subtask: [Stage 6:==================================================(1380 + -160) / 1224][2018-04- 
12 03:30:28,353] {timeout.py:36} ERROR - Process timed out

参考。 https://issues.apache.org/jira/browse/AIRFLOW-2385

2 个答案:

答案 0 :(得分:1)

此气流作业运行Spark作业。 因此,当超时时调用on_kill方法时,我需要停止Spark会话。

def on_kill(self):
    if (self.spark):
        logging.error('on_kill: stopping spark session...')
        self.spark.stop()

答案 1 :(得分:0)

您应该检查任务代码是否包含“ Exception除外”这样的内容。

def func(**kwargs):
    try:
        time.sleep(3*60)
        _log.info('sleep 3*60s finished')
    except Exception:
        _log.error('except exception:', exc_info=True)
    return 'success'

它将捕获AirflowTaskTimeout异常,因此该过程不会按预期中止。

[2019-12-27 10:59:54,064] {logging_mixin.py:95} INFO - [2019-12-27 10:59:54,061] {timeout.py:42} ERROR - Process timed out, PID: 62104
[2019-12-27 10:59:54,065] {test_timeout.py:61} ERROR - except exception:
Traceback (most recent call last):
  File "~/airflow/dags/test_timeout.py", line 58, in func
    time.sleep(3*60)
  File "~/airflow/airflow/utils/timeout.py", line 43, in handle_timeout
    raise AirflowTaskTimeout(self.error_message)
airflow.exceptions.AirflowTaskTimeout: Timeout, PID: 62104
[2019-12-27 10:59:54,070] {python_operator.py:115} INFO - Done. Returned value was: success

使用指定的Exception类型可以解决此问题。