我正在尝试创建一个DAG,该DAG基于存储中的JSON文件动态生成任务。我逐步遵循了本指南:
https://bigdata-etl.com/apache-airflow-create-dynamic-dag/
但是DAG陷入了以下消息:
是否可以读取外部文件并使用它在Composer中动态创建任务?当我仅从airflow变量中读取数据时,可以执行此操作,但是当我读取外部文件时,dag卡在isn't available in the web server's DagBag object
状态。我需要从外部文件中读取内容,因为JSON的内容将在每次执行时更改。
我正在使用composer-1.8.2-airflow-1.10.2
。
我阅读了类似问题的答案:
Dynamic task definition in Airflow
但是我不是试图基于单独的任务来创建任务,而只是基于外部文件来创建任务。
这是我的第二种方法,也会陷入这种错误状态:
import datetime
import airflow
from airflow.operators import bash_operator
from airflow.operators.dummy_operator import DummyOperator
from airflow.models import Variable
import json
import os
products = json.loads(Variable.get("products"))
default_args = {
'owner': 'Composer Example',
'depends_on_past': False,
'email': [''],
'email_on_failure': False,
'email_on_retry': False,
'retries': 0,
'retry_delay': datetime.timedelta(minutes=5),
'start_date': datetime.datetime(2020, 1, 10),
}
with airflow.DAG(
'json_test2',
default_args=default_args,
# Not scheduled, trigger only
schedule_interval=None) as dag:
# Print the dag_run's configuration, which includes information about the
# Cloud Storage object change.
def read_json_file(file_path):
if os.path.exists(file_path):
with open(file_path, 'r') as f:
return json.load(f)
def get_run_list(files):
run_list = []
#The file is uploaded in the storage bucket used as a volume by Composer
last_exec_json = read_json_file("/home/airflow/gcs/data/last_execution.json")
date = last_exec_json["date"]
hour = last_exec_json["hour"]
for file in files:
#Testing by adding just date and hour
name = file['name']+f'_{date}_{hour}'
run_list.append(name)
return run_list
rl = get_run_list(products)
start = DummyOperator(task_id='start', dag=dag)
end = DummyOperator(task_id='end', dag=dag)
for name in rl:
tsk = DummyOperator(task_id=name, dag=dag)
start >> tsk >> end
答案 0 :(得分:0)
可以创建DAG,该DAG基于JSON
文件动态地生成任务,该文件位于Cloud Storage存储桶中。我遵循了您提供的指南,在我的情况下,它可以很好地工作。
首先,您需要将JSON配置文件上传到$AIRFLOW_HOME/dags
目录,然后将DAG python文件上传到相同的路径(您可以在airflow.cfg
文件中找到该路径,该文件位于存储桶中)
稍后,您将能够在Airflow UI中看到DAG:
正如您看到的日志DAG isn't available in the web server's DagBag object
所示,DAG在Airflow Web服务器上不可用。但是,由于Airflow Scheduler与Airflow Web Server独立工作,因此可以将DAG调度为活动状态。
将许多DAG立即加载到Composer环境时,它可能会在该环境上过载。由于Airflow网络服务器位于Google托管的项目中,因此仅某些类型的更新将导致网络服务器容器重新启动,例如添加或升级PyPI软件包之一或更改Airflow设置。解决方法是添加一个虚拟环境变量:
ENVIRONMENT VARIABLE
标签Edit
,然后添加环境变量和Submit
您可以使用以下命令重新启动它:
gcloud composer environments update ${ENVIRONMENT_NAME} --location=${ENV_LOCATION} --update-airflow-configs=core-dummy=true
gcloud composer environments update ${ENVIRONMENT_NAME} --location=${ENV_LOCATION} --remove-airflow-configs=core-dummy
我希望以上信息对您有用。