想要创建当前任务下游的气流任务

时间:2018-01-10 23:26:11

标签: python airflow apache-airflow

我主要是擅长气流。

我有两个步骤:

  1. 获取符合条件的所有文件
  2. 解压缩文件
  3. 这些文件压缩了半个gig,未压缩时为2 - 3 gig。我可以轻松地一次处理20多个文件,这意味着解压缩所有文件的运行时间可能超过任何合理的超时

    我可以使用XCom来获得第1步的结果,但我想做的是这样的:

    def processFiles (reqDir, gvcfDir, matchSuffix):
        theFiles = getFiles (reqDir, gvcfDir, matchSuffix)
    
        for filePair in theFiles:
            task = PythonOperator (task_id = "Uncompress_" + os.path.basename (theFile), 
                                    python_callable = expandFile, 
                                    op_kwargs = {'theFile': theFile}, 
                                    dag = dag)
    task.set_upstream (runThis)
    

    问题是" runThis"是调用processFiles的PythonOperator,因此必须在processFiles之后声明。

    有没有办法让这项工作?

    这是XCom存在的原因,我应该抛弃这种方法并使用XCom吗?

1 个答案:

答案 0 :(得分:3)

关于您提出的解决方案,我认为您不能使用XCom来实现这一目标,因为它们仅适用于实例,而不是在您定义DAG时(据我所知)。

但是,您可以使用SubDAG来实现目标。 SubDagOperator获取一个函数,该函数将在执行操作符并生成DAG时调用,使您有机会动态创建工作流的子部分。

您可以使用这个简单的示例测试这个想法,每次调用时都会生成一个随机的任务:

import airflow
from builtins import range
from random import randint
from airflow.operators.bash_operator import BashOperator
from airflow.operators.subdag_operator import SubDagOperator
from airflow.models import DAG

args = {
    'owner': 'airflow',
    'start_date': airflow.utils.dates.days_ago(2)
}

dag = DAG(dag_id='dynamic_dag', default_args=args)

def generate_subdag(parent_dag, dag_id, default_args):
    # pseudo-randomly determine a number of tasks to be created
    n_tasks = randint(1, 10)

    subdag = DAG(
        '%s.%s' % (parent_dag.dag_id, dag_id),
        schedule_interval=parent_dag.schedule_interval,
        start_date=parent_dag.start_date,
        default_args=default_args
    )
    for i in range(n_tasks):
        i = str(i)
        task = BashOperator(task_id='echo_%s' % i, bash_command='echo %s' % i, dag=subdag)

    return subdag

subdag_dag_id = 'dynamic_subdag'

SubDagOperator(
    subdag=generate_subdag(dag, subdag_dag_id, args),
    task_id=subdag_dag_id,
    dag=dag
)

如果执行此操作,您会注意到在不同的运行中,SubDAG可能包含不同数量的任务(我在1.8.0版本中对此进行了测试)。您可以通过访问图表视图,单击灰色的SubDAG节点,然后点击"放大到SubDAG"来访问WebUI上的SubDAG视图。

您可以通过列出文件并为每个文件创建一个任务来使用此概念,而不是像在示例中那样以随机数生成它们。任务本身可以并行排列(如我所做),顺序排列或以任何有效的有向非循环布局。