气流滞后中特定任务的执行时间和状态

时间:2020-09-28 21:58:15

标签: airflow google-cloud-composer

我想提取Airflow Dag中特定任务的所有执行时间。我宁愿写另一个Dag来做。

我已使用以下Dag来提取另一个Dag的状态和执行时间


import pandas as pd
import numpy as np
import pandas_gbq
from google.cloud import storage as gcs
from google.cloud import bigquery

dag_id = 'my_dag'
dag_runs = DagRun.find(dag_id=my_dag)
        
# Declare empty array

arr = []
arr1 = []

for dag_run in dag_runs:
    arr.append(dag_run.state)
    arr1.append(dag_run.execution_date)
 

dag_info = {'time': arr1, 'dag_status': arr}

df = pd.DataFrame(dag_info)

## Keep failed and successful dag runs    
df_status = df[(df.dag_status == "failed") | (df.dag_status == "success")] 

df_status.loc[df_status['dag_status']=='success','flag'] = 0
df_status.loc[df_status['dag_status']=='failed','flag'] = 1

### Code to save the table in Bigquery


return None

我想做同样的事情,但是这次要提取“ my_dag”的任务信息。我已经试过给定Status of Airflow task within the dag的解决方案,但是它返回“ None”,尽管我知道任务和dag正在运行。

def task_status_check(**kwargs):

        ##### TESTING. ####

        import pandas as pd
        import datetime

        my_date = datetime.datetime(2020, 9, 28)

        my_dag_id = 'my_dag'
        my_task_id = 'my_task'


        dag_folder = conf.get('core','DAGS_FOLDER')
        dagbag = DagBag(dag_folder)
        check_dag = dagbag.dags[my_dag_id]
        my_task = check_dag.get_task(my_task_id)

        for n in range(1, 500, 2):

            time_delta = timedelta(minutes = n)
            my_date_1 = my_date + time_delta 
            ti = TaskInstance(my_task, my_date_1)

            print("######################")
            print(ti.current_state())

我们将不胜感激任何帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

我怀疑TaskInstance()模型中的问题,但是task_status_check()函数中包含的自定义代码逻辑不是问题。基本上,TaskInstance()类提供了各种Airflow任务管理功能,这些资源利用SQLAlchemy OMR Python工具对整个Airflow元数据数据库执行查询,并从task_instance SQL表中获取记录,并查看源代码。可能会得到#L203来反映这一点。

我已经在非常常见的类似情况下尝试了您的代码,并且遇到了相同的None返回状态。回顾最初的问题堆栈thread中提到的用户的努力,并深入研究问题,我已经调整get_task_instance()来检查行为,并指出此功能以提取特定Airflow任务的状态。只要get_task_instance()是实验性的package,看来它正在调用TaskInstance()类来发现任务状态:

def task_check(**kwargs):
  import datetime
  from datetime import timezone
  from airflow import configuration as conf
  import logging
  from airflow.api.common.experimental.get_task_instance import get_task_instance
  
  my_date = datetime.datetime('yyyy', 'mm', 'dd', 'hour', 'min', 'sec')
  my_date = my_date.replace(tzinfo=timezone.utc) 

  my_dag_id = "Dag_id"
  my_task_id = "Task_id"
  ti = get_task_instance(my_dag_id,my_task_id,my_date)

我检查了对Airflow DB的请求是否成功,但是get_task_instance函数返回了相同的None状态:

{python_operator.py:114}信息-完成。返回值为:无

与此同时,在做进一步研究时,考虑了提取气流任务状态的其他方法,而他们只是使这项工作做得很好。

  • Airflow command-line执行器,已调整为在以下其中一种运行 作曲工作者:

    kubectl -it exec $(kubectl get po -l run=airflow-worker -o jsonpath='{.items[0].metadata.name}' \
        -n $(kubectl get ns| grep composer*| awk '{print $1}')) -n $(kubectl get ns| grep composer*| awk '{print $1}') \
        -c airflow-worker airflow task_state <Dag_ID> <Task_ID> 2020-09-27T23:59:21+00:00
    
  • 相应地查询元数据MySQL task_instance

   SELECT task_id, state, execution_date
   FROM task_instance
   WHERE dag_id = 'dag_id'
   AND DATE(execution_date) = 'execution_date'
   AND task_id = 'task_id'