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

1. 错误描述

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 日志显示界面,不支持中文字符串的显示,包括中文符号,否则会引发意想不到的事故。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值