如何传递动态参数Airflow运算符?

时间:2019-03-22 13:15:14

标签: google-cloud-platform airflow google-cloud-composer apache-airflow-xcom

我正在使用Airflow在Google Cloud Composer上运行Spark作业。我需要

  • 创建集群(用户提供的YAML参数)
  • 火花作业列表(作业参数也由每个作业YAML提供)

使用Airflow API-我可以读取YAML文件,并使用xcom在各个任务之间推送变量。

但是,考虑一下DataprocClusterCreateOperator()

  • cluster_name
  • project_id
  • zone

和其他一些参数标记为模板化。

如果我想以模板形式传入其他参数(当前不是这样)怎么办? -像image_versionnum_workersworker_machine_type等?

有什么解决方法吗?

1 个答案:

答案 0 :(得分:4)

不确定“动态”的含义,但是当yaml文件更新时,如果读取文件进程在dag文件主体中,则dag将被刷新以从yaml文件中申请新的args。因此,实际上,您不需要XCOM来获取参数。 只需简单地创建一个params字典,然后传递给default_args:

CONFIGFILE = os.path.join(
    os.path.dirname(os.path.realpath(\__file__)), 'your_yaml_file')

with open(CONFIGFILE, 'r') as ymlfile:
    CFG = yaml.load(ymlfile)

default_args = {
    'cluster_name': CFG['section_A']['cluster_name'], # edit here according to the structure of your yaml file.
    'project_id': CFG['section_A']['project_id'],
    'zone': CFG['section_A']['zone'],
    'mage_version': CFG['section_A']['image_version'],
    'num_workers': CFG['section_A']['num_workers'],
    'worker_machine_type': CFG['section_A']['worker_machine_type'],
    # you can add all needs params here.
}

DAG = DAG(
    dag_id=DAG_NAME,
    schedule_interval=SCHEDULE_INTEVAL,
    default_args=default_args, # pass the params to DAG environment
)

Task1 = DataprocClusterCreateOperator(
    task_id='your_task_id',
    dag=DAG
)

但是,如果您想要动态的dag而不是参数,则可能需要其他策略,例如this

因此,您可能需要弄清楚基本概念: 动态在哪一级?任务级别? DAG级别?

或者您可以创建自己的操作员来完成工作并获取参数。