我主要是擅长气流。
我有两个步骤:
这些文件压缩了半个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吗?
答案 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视图。
您可以通过列出文件并为每个文件创建一个任务来使用此概念,而不是像在示例中那样以随机数生成它们。任务本身可以并行排列(如我所做),顺序排列或以任何有效的有向非循环布局。