在Airflow中,我们创建了多个DAGS。其中一些共享通用属性,例如从中读取文件的目录。当前,这些属性在每个单独的DAG中被列为属性,这在将来显然会成为问题。假设目录名称要更改,我们必须进入每个DAG并更新这段代码(甚至可能丢失其中的一段代码)。
我一直在寻找创建某种配置文件,可以将其解析为Airflow并在需要特定属性时供各种DAGS使用,但是我似乎找不到任何类型的文档或操作指南这个。我最多能找到的是建立连接ID的文档,但这不符合我的用例。
我的帖子的问题是,是否可以做上述情况?如何做?
谢谢。
答案 0 :(得分:2)
有几种方法可以根据您的设置来完成此操作:
您可以在具有函数生成DAG的情况下使用DagFactory类型的方法。您可以找到一个类似here
您可以将JSON配置存储为Airflow Variable,并对其进行解析以生成DAG。您可以在Admin->变量中存储以下内容:
[{
"table": "users",
"schema":"app_one",
"s3_bucket":"etl_bucket",
"s3_key":"app_one_users",
"redshift_conn_id":"postgres_default" },
{
"table": "users",
"schema":"app_two",
"s3_bucket":"etl_bucket",
"s3_key":"app_two_users",
"redshift_conn_id":"postgres_default"}]
您的DAG可能生成为:
sync_config = json.loads(Variable.get("sync_config"))
with dag:
start = DummyOperator(task_id='begin_dag')
for table in sync_config:
d1 = RedshiftToS3Transfer(
task_id='{0}'.format(table['s3_key']),
table=table['table'],
schema=table['schema'],
s3_bucket=table['s3_bucket'],
s3_key=table['s3_key'],
redshift_conn_id=table['redshift_conn_id']
)
start >> d1
类似地,您可以将该配置存储为本地文件,然后像打开其他任何文件一样打开它。请记住,对此的最佳答案将取决于您的基础结构和用例。