Python 损坏的DAG:[/home/aiffort/gcs/dags/aiffort_test_task.py]名称';cfg&x27;没有定义

Python 损坏的DAG:[/home/aiffort/gcs/dags/aiffort_test_task.py]名称';cfg&x27;没有定义,python,python-3.x,google-cloud-platform,airflow,Python,Python 3.x,Google Cloud Platform,Airflow,我是python和airflow方面的新手,我正在使用GCP composer环境创建DAG。 在这段python代码中,我创建了两个任务,一个用于读取zip或csv文件,另一个用于创建dataproc集群。在一个任务中,我调用了一个readYML方法,该方法正在读取dataproc集群参数(如集群名称、项目id等)的yml配置文件,我在第二个任务中进一步使用了相同的参数,请参阅下面的代码以获得更好的理解 # Importing Modules from airflow import DAG

我是python和airflow方面的新手,我正在使用GCP composer环境创建DAG。
在这段python代码中,我创建了两个任务,一个用于读取zip或csv文件,另一个用于创建dataproc集群。在一个任务中,我调用了一个readYML方法,该方法正在读取dataproc集群参数(如集群名称、项目id等)的yml配置文件,我在第二个任务中进一步使用了相同的参数,请参阅下面的代码以获得更好的理解

# Importing Modules

from airflow import DAG

from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta
from zipfile import ZipFile

from airflow.models import Variable
import yaml
from google.cloud import storage
from airflow.contrib.operators import dataproc_operator
import pandas as pd


global cfg

def readYML():
    print("inside readzip")
    file_name = "/home/airflow/gcs/data/cluster_config.yml"
    with open(file_name, 'r') as ymlfile:
        cfg = yaml.load(ymlfile)
    print("inside readYML method : ", cfg['configs']['project_id'])


def iterate_bucket():
    global blobs
    bucket_name = 'europe-west1-airflow-test-9bbb5fc7-bucket'
    storage_client = storage.Client.from_service_account_json(
        '/home/airflow/gcs/data/service_account_key_gcp_compute_bmg.json')
    bucket = storage_client.get_bucket(bucket_name)
    blobs = bucket.list_blobs()


def print_PcsvData():
    iterate_bucket()
    readYML()
    global readPcsv

    for blob in blobs:
        if "physical.zip" in blob.name:
            print("hello : ", blob.name)
            file_name = "/home/airflow/gcs/" + blob.name

    with ZipFile(file_name, 'r') as zip:
        # printing all the contents of the zip file
        for info in zip.infolist():
            readfilename = info.filename
            print(readfilename)

    readPcsv = pd.read_csv("/home/airflow/gcs/data/" + readfilename)

    print("physi cal.csv : ", readPcsv)
    print('Done!')


dag_name = Variable.get("dag_name")

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime.now(),
    'email': ['airflow@example.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    'cluster_name': cfg['configs']['cluster_name'],   
 }

  # Instantiate a DAG

   dag = DAG(dag_id='read_yml', default_args=default_args, 
   schedule_interval=timedelta(days=1))

 # Creating Tasks   

t1 = PythonOperator(task_id='Raw1', python_callable=print_PcsvData, 
dag=dag)

create_dataproc_cluster = dataproc_operator.DataprocClusterCreateOperator(
    task_id='create_dataproc_cluster',
    project_id=cfg['configs']['project_id'],
    cluster_name=cfg['configs']['cluster_name'],
    num_workers=cfg['configs']['num_workers'],
    zone=cfg['configs']['zone'],
    master_machine_type=cfg['configs']['master_machine_type'],
    worker_machine_type=cfg['configs']['worker_machine_type'],
    dag=dag)

t1 >> create_dataproc_cluster
在这段代码中,我想全局使用cfg变量,在默认参数中,我也想访问这个变量,但我得到了错误,我不知道它的范围相关的问题,甚至我在readYML方法中声明了什么cfg变量,但错误仍然存在。 任何帮助都将不胜感激。
提前感谢

检查下面您应该使用的DAG文件:

您应该做的一些更改:

  • 更改全局变量并从函数返回值
  • 永远不要使用
    datetime.now()
    -
更新的文件

#导入模块
从气流导入DAG
从afflow.operators.python_operator导入PythonOperator
从datetime导入datetime,timedelta
从zipfile导入zipfile
从airflow.models导入变量
进口yaml
从google.cloud导入存储
从airflow.contrib.operators导入dataproc_运算符
作为pd进口熊猫
def readYML():
打印(“内部readzip”)
file_name=“/home/afflow/gcs/data/cluster_config.yml”
以ymlfile形式打开(文件名为“r”):
cfg=yaml.荷载(ymlfile)
打印(“内部readYML方法:”,cfg['configs']['project\u id'])
返回cfg
def iterate_bucket():
bucket_name='europe-west1-airflow-test-9bbb5fc7-bucket'
storage\u client=storage.client.from\u service\u account\u json(
“/home/aiffair/gcs/data/service\u account\u key\u gcp\u compute\u bmg.json”)
bucket=存储\客户端。获取\ bucket(bucket\名称)
blobs=bucket.list_blobs()
返回斑点
def print_PcsvData():
blobs=iterate_bucket()
对于blob中的blob:
如果blob.name中的“physical.zip”:
打印(“你好:”,blob.name)
file_name=“/home/afflow/gcs/”+blob.name
ZipFile(文件名为“r”)作为zip:
#打印zip文件的所有内容
对于zip.infolist()中的信息:
readfilename=info.filename
打印(readfilename)
readPcsv=pd.read\u csv(“/home/afflow/gcs/data/”+readfilename)
打印(“physi-cal.csv:,readPcsv”)
打印('Done!')
返回readPcsv
dag_name=变量.get(“dag_name”)
cfg=readYML()
默认参数={
“所有者”:“气流”,
“依赖于过去”:False,
“开始日期”:气流.utils.dates.days(2),
'电子邮件':['airflow@example.com'],
“失败时发送电子邮件”:False,
“重试时发送电子邮件”:False,
“重试”:1,
“重试延迟”:时间增量(分钟=5),
“群集名称”:cfg['configs']['cluster\u name'],
}
#实例化一个DAG
dag=dag(dag\u id='read\u yml',default\u args=default\u args,
计划时间间隔=时间增量(天数=1))
#创建任务
t1=PythonOperator(task\u id='Raw1',python\u callable=print\u PcsvData,
dag=dag)
create_dataproc_cluster=dataproc_operator.DataprocClusterCreateOperator(
task_id='create_dataproc_cluster',
project\u id=cfg['configs']['project\u id'],
cluster\u name=cfg['configs']['cluster\u name'],
num_workers=cfg['configs']['num_workers'],
zone=cfg['configs']['zone'],
主机器类型=cfg['configs']['master\u machine\u type'],
worker\u machine\u type=cfg['configs']['worker\u machine\u type'],
dag=dag)
t1>>创建数据处理集群