Python 使用外部文件在气流中动态创建任务

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 我读到了一个类似问题的答案: 但是,我并没有试图基于

我试图创建一个DAG,它根据存储中的JSON文件动态生成任务。我一步一步地遵循这个指南:

但是DAG被以下信息卡住了:

是否可以读取外部文件并使用它在Composer中动态创建任务?当我仅从气流变量读取数据时,我可以执行此操作,但当我读取外部文件时,dag会卡在web服务器的DagBag对象状态下不可用的
中。我需要从外部文件读取,因为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时出错。您的回答与我遵循的步骤完全相同,但不起作用。我将稍后重试并向您更新。