我创建了一个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
答案 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
吗?