airflow问题系列2 —— task保持running假死状态

. 错误描述
airflow 被调度后,一直处于 running 状态假死,而且日志打印不完全,从某一行以下就不会打印日志了。

 

 

2. 错误原因
经过查找源码中从这一行打印的日志来看,因为在日志里面输出了中文的字符串(包括中文的括号和分号以及冒号等),只要日志中包含中文字符,airflow 就无法将其打印在 web 页面,并且包含中文字符这一行以下的日志也都不会输出。

 

3. 解决方案
经过与同事的沟通以及网上资料查阅,有两个方案可实施,并且最好同时实施。

第一个是解决日志显示的问题,修改日志输出不要输出中文字符串即可。

第二个是保障系统方案,即设置超时 kill ,配合失败重试配置机制,即可有效防止系统故障。

1)超时重试机制需要配置两个地方,导入包和参数设置。

在头部导入 timedelta 的包,“from datetime import timedelta”。

在 default_args 参数中加入 ‘execution_timeout‘: timedelta(hours=1) ,表示如果一小时还没有运行完,就置为失败。如果有重试机制会在重试时间后进行重试,如果没有重试机制会进行下一个 dag 任务或者结束运行。

 

# encoding: utf-8
import airflow
import time
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta
from airflow.operators.dagrun_operator import TriggerDagRunOperator


default_args = {
‘owner‘: ‘airflow‘,
‘depends_on_past‘: False,
‘execution_timeout‘: timedelta(hours=1),
‘start_date‘: airflow.utils.dates.days_ago(1),
}
2)设置重试机制

在 airflow 的 task 任务配置中,retries 表示重试的次数,重试多少次后跳过此 task 。retry_delay 参数表示失败多久后进行重试,次数设置的是1分钟,也需要导入 timedelta 包,方法同上。在同一个 dag 中,导入一遍即可。

de4c65baf941f8f2ed775339fd0c733a = BashOperator(
task_id =‘de4c65baf941f8f2ed775339fd0c733a‘,
retries = 5,
retry_delay = timedelta(minutes=1),
bash_command =command,
params={"table_name":"test"},
trigger_rule=‘all_done‘,
dag=dag)
4. 总结
由于不细心的原因,由一个中文“:”引发的血案,而且根据第一张图所示,如果有大量的处于 running 状态的 task 任务,也会对其他 dag 的 task 调度任务带来影响,在我这里的影响是让我们项目组最核心的调度 dag 中的 task 也处于 running 中卡住,导致重大的生产事故。故总结于此,警示自己也提醒萌新小伙伴们,注意防坑注意踩雷。

本文要点:airflow 的 web 日志显示界面,不支持中文字符串的显示,包括中文符号,否则会引发意想不到的事故。

airflow问题系列2 —— task保持running假死状态

上一篇:RBAC---(1)


下一篇:for循环结构