繁体   English   中英

功能中的气流 DAG?

[英]Airflow DAG in functions?

我在$AIRFLOW_HOME/dags工作。 我创建了以下文件:

- common
  |- __init__.py   # empty
  |- common.py     # common code
- foo_v1.py        # dag instanciation

common.py

default_args = ...

def create_dag(project, version):
  dag_id = project + '_' + version
  dag = DAG(dag_id, default_args=default_args, schedule_interval='*/10 * * * *', catchup=False)
  print('creating DAG ' + dag_id)

  t1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag)

  t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

  t2.set_upstream(t1)

foo_v1.py

 from common.common import create_dag

 create_dag('foo', 'v1')

使用 python 测试脚本时,看起来没问题:

 $ python foo_v1.py
 [2018-10-29 17:08:37,016] {__init__.py:57} INFO - Using executor SequentialExecutor
 creating DAG pgrandjean_pgrandjean_spark2.1.0_hadoop2.6.0

然后我在本地启动网络服务器和调度程序。 我的问题是我没有看到任何 ID 为foo_v1 DAG。 没有创建pyc文件。 做错了什么? 为什么foo_v1.py中的代码foo_v1.py被执行?

要被 Airflow 找到, create_dag()返回的 DAG 对象必须在foo_v1.py模块的全局命名空间中。 将 DAG 放置在全局命名空间中的一种方法是将其分配给模块级变量:

from common.common import create_dag

dag = create_dag('foo', 'v1')

另一种方法是使用globals()更新全局命名空间:

globals()['foo_v1'] = create_dag('foo', 'v1')

后者可能看起来有点矫枉过正,但它对于动态创建多个 DAG很有用。 例如,在 for 循环中:

for i in range(10):
    globals()[f'foo_v{i}'] = create_dag('foo', f'v{i}')

注意:放置在$AIRFLOW_HOME/dags任何*.py文件(甚至在子目录中,例如您的情况中的common )都将被 Airflow 解析。 如果您不想这样做,您可以使用.airflowignore打包的 DAG

您需要将 dag 分配给模块中的导出变量。 如果 dag 不在模块__dict__气流的 DagBag 处理器将不会拾取它。

在此处查看源: https : //github.com/apache/incubator-airflow/blob/master/airflow/models.py#L428

正如这里提到的,您必须在创建后返回 dag!

default_args = ...

def create_dag(project, version):
  dag_id = project + '_' + version
  dag = DAG(dag_id, default_args=default_args, schedule_interval='*/10 * * * *', catchup=False)
  print('creating DAG ' + dag_id)

  t1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag)

  t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

  t2.set_upstream(t1)

  return dag # Add this line to your code!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM