apache airflow - 无法加载dag包来处理故障

时间:2018-05-08 06:58:05

标签: airflow

我创建了一个on_failure_callback函数(引用Airflow default on_failure_callback)来处理任务失败。

当DAG中只有一个任务时,它运行良好,但是,如果还有2个任务,则任务随机失败since the operator is null,稍后可以通过manully恢复。在airflow-scheduler.out中,日志是:

  

[2018-05-08 14:24:21,237] {models.py:1595}错误 - 执行人报告   任务实例%s已完成(%s),尽管该任务表示其%s。是的   外部任务被杀? NoneType [2018-05-08 14:24:21,238]   {jobs.py:1435}错误 - 无法加载dag包来处理失败   。将任务设置为FAILED而不是   回调或重试。你有足够的资源吗?

DAG代码是:

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import timedelta
import airflow
from devops.util import WechatUtil
from devops.util import JiraUtil

def on_failure_callback(context):
    ti = context['task_instance']
    log_url = ti.log_url
    owner = ti.task.owner
    ti_str = str(context['task_instance'])
    wechat_msg = "%s - Owner:%s"%(ti_str,owner)
    WeChatUtil.notify_team(wechat_msg)

    jira_desc = "Please check log from url %s"%(log_url)
    JiraUtil.create_incident("DW",ti_str,jira_desc,owner)


args = {
    'queue': 'default',
    'start_date': airflow.utils.dates.days_ago(1),
    'retry_delay': timedelta(minutes=1),
    'on_failure_callback': on_failure_callback,
    'owner': 'user1',
    }
dag = DAG(dag_id='test_dependence1',default_args=args,schedule_interval='10 16 * * *')

load_crm_goods = BashOperator(
    task_id='crm_goods_job',
    bash_command='date',
    dag=dag)

load_crm_memeber = BashOperator(
    task_id='crm_member_job',
    bash_command='date',
    dag=dag)

load_crm_order = BashOperator(
    task_id='crm_order_job',
    bash_command='date',
    dag=dag)

load_crm_eur_invt = BashOperator(
    task_id='crm_eur_invt_job',
    bash_command='date',
    dag=dag)

crm_member_cohort_analysis = BashOperator(
    task_id='crm_member_cohort_analysis_job',
    bash_command='date',
    dag=dag)

crm_member_cohort_analysis.set_upstream(load_crm_goods)
crm_member_cohort_analysis.set_upstream(load_crm_memeber)
crm_member_cohort_analysis.set_upstream(load_crm_order)
crm_member_cohort_analysis.set_upstream(load_crm_eur_invt)

crm_member_kpi_daily = BashOperator(
    task_id='crm_member_kpi_daily_job',
    bash_command='date',
    dag=dag)

crm_member_kpi_daily.set_upstream(crm_member_cohort_analysis)

我曾尝试通过添加512到甚至4096的默认内存来更新airflow.cfg,但没有运气。有人会有什么建议吗?

我也尝试更新我的JiraUtil和WechatUtil,如下所示,包含相同的错误

WechatUtil:

import requests

class WechatUtil:
    @staticmethod
    def notify_trendy_user(user_ldap_id, message):
        return None

    @staticmethod
    def notify_bigdata_team(message):
        return None

JiraUtil:

import json
import requests
class JiraUtil:
    @staticmethod
    def execute_jql(jql):
        return None

    @staticmethod
    def create_incident(projectKey, summary, desc, assignee=None):
        return None

1 个答案:

答案 0 :(得分:0)

(我在这里拍摄一些示踪剂子弹,所以如果这个答案在第一次尝试时没有正确的话,请耐心等待。)

多个任务实例的null操作符问题很奇怪...如果你可以将当前代码简化为MCVE例如1-2个运算符并排除JiraUtil和WechatUtil部分,它将有助于解决此问题如果它们与回调失败无关。

以下是2个想法:

1。您是否可以尝试更改从上下文中取出任务实例的行,看看这是否会产生影响?

在:

def on_failure_callback(context):
    ti = context['task_instance']
    ...

后:

def on_failure_callback(context):
    ti = context['ti']
    ...

我在Airflow回购(https://github.com/apache/incubator-airflow/blob/c1d583f91a0b4185f760a64acbeae86739479cdb/airflow/contrib/hooks/qubole_check_hook.py#L88)中看到了这种用法。它可以双向访问。

2。您可以尝试在运算符上添加provide_context=True作为kwarg或default_args吗?