我想提取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())
我们将不胜感激任何帮助。
谢谢
答案 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'