Python 使用外部文件在气流中动态创建任务
我试图创建一个DAG,它根据存储中的JSON文件动态生成任务。我一步一步地遵循这个指南: 但是DAG被以下信息卡住了: 是否可以读取外部文件并使用它在Composer中动态创建任务?当我仅从气流变量读取数据时,我可以执行此操作,但当我读取外部文件时,dag会卡在web服务器的DagBag对象状态下不可用的Python 使用外部文件在气流中动态创建任务,python,airflow,google-cloud-composer,orchestration,Python,Airflow,Google Cloud Composer,Orchestration,我试图创建一个DAG,它根据存储中的JSON文件动态生成任务。我一步一步地遵循这个指南: 但是DAG被以下信息卡住了: 是否可以读取外部文件并使用它在Composer中动态创建任务?当我仅从气流变量读取数据时,我可以执行此操作,但当我读取外部文件时,dag会卡在web服务器的DagBag对象状态下不可用的中。我需要从外部文件读取,因为JSON的内容会随着每次执行而改变 我使用的是composer-1.8.2-aiffort-1.10.2 我读到了一个类似问题的答案: 但是,我并没有试图基于
中。我需要从外部文件读取,因为JSON的内容会随着每次执行而改变
我使用的是composer-1.8.2-aiffort-1.10.2
我读到了一个类似问题的答案:
但是,我并没有试图基于单独的任务创建任务,只是基于外部文件
这是我的第二种方法,它也陷入了错误状态:
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
可以创建基于JSON
文件动态生成任务的DAG,该文件位于云存储桶中。我遵循了你们提供的指南,它在我的情况下非常有效
首先,您需要将JSON配置文件上载到$afflow\u HOME/dags
目录,然后将DAG python文件上载到同一路径(您可以在位于bucket中的afflow.cfg
文件中找到路径)
稍后,您将能够在气流UI中看到DAG:
如您所见,日志DAG在web服务器的DagBag对象中不可用,DAG在web服务器上不可用。但是,可以将DAG计划为活动状态,因为气流调度器与气流Web服务器独立工作
当一次将大量DAG加载到Composer环境中时,它可能会在环境中过载。由于Airflow Web服务器位于Google管理的项目中,只有某些类型的更新会导致Web服务器容器重新启动,例如添加或升级一个PyPI包或更改Airflow设置。解决方法是添加虚拟环境变量:
- 在GCP中打开Composer实例
环境变量
选项卡
编辑
,然后添加环境变量并提交
您可以使用以下命令重新启动它:
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
我希望您会发现上述信息有用。可以创建DAG,该DAG基于位于云存储桶中的JSON
文件动态生成任务。我遵循了你们提供的指南,它在我的情况下非常有效
首先,您需要将JSON配置文件上载到$afflow\u HOME/dags
目录,然后将DAG python文件上载到同一路径(您可以在位于bucket中的afflow.cfg
文件中找到路径)
稍后,您将能够在气流UI中看到DAG:
如您所见,日志DAG在web服务器的DagBag对象中不可用,DAG在web服务器上不可用。但是,可以将DAG计划为活动状态,因为气流调度器与气流Web服务器独立工作
当一次将大量DAG加载到Composer环境中时,它可能会在环境中过载。由于Airflow Web服务器位于Google管理的项目中,只有某些类型的更新会导致Web服务器容器重新启动,例如添加或升级一个PyPI包或更改Airflow设置。解决方法是添加虚拟环境变量:
- 在GCP中打开Composer实例
环境变量
选项卡
编辑
,然后添加环境变量并提交
您可以使用以下命令重新启动它:
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
我希望您能发现上述信息有用。检查您的Web服务器日志,很可能是将DAG导入DAGBAG时出错。您的回答与我遵循的步骤完全相同,但不起作用。稍后我将重试并更新您。检查您的Web服务器日志,很可能是将DAG导入DAGBAG时出错。您的回答与我遵循的步骤完全相同,但不起作用。我将稍后重试并向您更新。