我正在使用Airflow在Google Cloud Composer上运行Spark作业。我需要
使用Airflow API-我可以读取YAML文件,并使用xcom在各个任务之间推送变量。
但是,考虑一下DataprocClusterCreateOperator()
cluster_name
project_id
zone
和其他一些参数标记为模板化。
如果我想以模板形式传入其他参数(当前不是这样)怎么办? -像image_version
,
num_workers
,worker_machine_type
等?
有什么解决方法吗?
答案 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级别?
或者您可以创建自己的操作员来完成工作并获取参数。