我有自己的自定义运算符扩展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
答案 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类型可以解决此问题。