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

时间:2020-01-10 15:28:33

标签: python airflow google-cloud-composer orchestration

我正在尝试创建一个DAG,该DAG基于存储中的JSON文件动态生成任务。我逐步遵循了本指南:

https://bigdata-etl.com/apache-airflow-create-dynamic-dag/

但是DAG陷入了以下消息:

Dag getting stuck

是否可以读取外部文件并使用它在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

1 个答案:

答案 0 :(得分:0)

可以创建DAG,该DAG基于JSON文件动态地生成任务,该文件位于Cloud Storage存储桶中。我遵循了您提供的指南,在我的情况下,它可以很好地工作。

首先,您需要将JSON配置文件上传到$AIRFLOW_HOME/dags目录,然后将DAG python文件上传到相同的路径(您可以在airflow.cfg文件中找到该路径,该文件位于存储桶中)

稍后,您将能够在Airflow UI中看到DAG:

enter image description here

正如您看到的日志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设置。解决方法是添加一个虚拟环境变量:

  • 在GCP中打开Composer实例
  • 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

我希望以上信息对您有用。