Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在气流中生成多个任务时反向的上游/下游关系_Python_Python 3.x_Airflow_Apache Airflow - Fatal编程技术网

Python 在气流中生成多个任务时反向的上游/下游关系

Python 在气流中生成多个任务时反向的上游/下游关系,python,python-3.x,airflow,apache-airflow,Python,Python 3.x,Airflow,Apache Airflow,可以找到与此问题相关的原始代码 我对向上移位运算符和set\u上游/set\u下游方法在我在DAG中定义的任务循环中工作感到困惑。当DAG的主执行循环配置如下: for uid in dash_workers.get_id_creds(): clear_tables.set_downstream(id_worker(uid)) 或 该图如下所示(字母数字序列是用户ID,也定义了任务ID): 当我像这样配置DAG的主执行循环时: for uid in dash_workers.get_

可以找到与此问题相关的原始代码

我对向上移位运算符和
set\u上游
/
set\u下游
方法在我在DAG中定义的任务循环中工作感到困惑。当DAG的主执行循环配置如下:

for uid in dash_workers.get_id_creds():
    clear_tables.set_downstream(id_worker(uid))

该图如下所示(字母数字序列是用户ID,也定义了任务ID):

当我像这样配置DAG的主执行循环时:

for uid in dash_workers.get_id_creds():
    clear_tables.set_upstream(id_worker(uid))

图表如下所示:

for uid in dash_workers.get_id_creds():
    clear_tables.set_upstream(id_worker(uid))

第二张图是我想要的/我期望在阅读文档的基础上产生的前两段代码。如果我想在触发针对不同用户id的一批数据分析任务之前先执行
clear\u tables
,我是否应该将其指示为
clear\u tables>>id\u worker(uid)

编辑——以下是完整的代码,在我发布最后几个问题后已更新,以供参考:

from datetime import datetime
import os
import sys

from airflow.models import DAG
from airflow.operators.python_operator import PythonOperator

import ds_dependencies

SCRIPT_PATH = os.getenv('DASH_PREPROC_PATH')
if SCRIPT_PATH:
    sys.path.insert(0, SCRIPT_PATH)
    import dash_workers
else:
    print('Define DASH_PREPROC_PATH value in environmental variables')
    sys.exit(1)

ENV = os.environ

default_args = {
  'start_date': datetime.now(),
}

DAG = DAG(
  dag_id='dash_preproc',
  default_args=default_args
)

clear_tables = PythonOperator(
  task_id='clear_tables',
  python_callable=dash_workers.clear_db,
  dag=DAG)

def id_worker(uid):
    return PythonOperator(
        task_id=id,
        python_callable=dash_workers.main_preprocess,
        op_args=[uid],
        dag=DAG)

for uid in dash_workers.get_id_creds():
    preproc_task = id_worker(uid)
    clear_tables << preproc_task
从日期时间导入日期时间
导入操作系统
导入系统
从airflow.models导入DAG
从afflow.operators.python_operator导入PythonOperator
导入ds_依赖项
SCRIPT\u PATH=os.getenv('DASH\u PREPROC\u PATH')
如果脚本路径为:
sys.path.insert(0,脚本路径)
输入劳工
其他:
打印('在环境变量中定义破折号\预处理\路径值')
系统出口(1)
ENV=os.environ
默认参数={
“开始日期”:datetime.now(),
}
DAG=DAG(
dag_id='dash_preproc',
默认参数=默认参数
)
clear_tables=蟒蛇算子(
任务\u id='clear\u tables',
python\u callable=dash\u workers.clear\u db,
dag=dag)
def id_工作者(uid):
回流蟒蛇器(
任务_id=id,
python\u callable=dash\u workers.main\u预处理,
op_args=[uid],
dag=dag)
用于dash\u workers中的uid。获取\u id\u creds():
预处理任务=id\u工作者(uid)

清除表格查看其他代码,似乎
get\u id\u creds
是您的任务,您正在尝试循环,这会产生一些奇怪的交互

一个可行的模式是:

clear_tables = MyOperator()

for uid in uid_list:
  my_task = MyOperator(task_id=uid)
  clear_tables >> my_task

通过查看其他代码,您的任务似乎是
get\u id\u creds
,您正在尝试循环,这会产生一些奇怪的交互

一个可行的模式是:

clear_tables = MyOperator()

for uid in uid_list:
  my_task = MyOperator(task_id=uid)
  clear_tables >> my_task

气流中的树状视图与你(和我!)最初的想法“背道而驰”。在您的第一个屏幕截图中,它显示“clear_tables”必须在“AAAG5608078M2”运行任务之前运行。DAG状态取决于每个id工作任务。因此,它不是任务订单,而是状态链的树。如果这有任何意义的话

(一开始这可能看起来很奇怪,但这是因为DAG可以向外分支,也可以向内分支。)


您可能会更幸运地查看dag的图形视图。这一个有箭头,以更直观的方式显示执行顺序。(虽然我现在确实发现树状视图很有用,但开始时就不那么清晰了)

气流中的树状视图与您(和我!)最初的想法“背道而驰”。在您的第一个屏幕截图中,它显示“clear_tables”必须在“AAAG5608078M2”运行任务之前运行。DAG状态取决于每个id工作任务。因此,它不是任务订单,而是状态链的树。如果这有任何意义的话

(一开始这可能看起来很奇怪,但这是因为DAG可以向外分支,也可以向内分支。)


您可能会更幸运地查看dag的图形视图。这一个有箭头,以更直观的方式显示执行顺序。(虽然我现在确实发现树状视图很有用,只是开始时不够清晰)

谢谢@LadislavIndra,但这仍然不起作用。我将用完整的代码更新这个问题。谢谢@LadislavIndra,但这仍然不起作用。我要用完整的代码来更新这个问题。@AshBerli Taylor——搞定了!从图表视图发布带有屏幕截图的更新。这应该在中提到。尽管
DAG
不能直接表示为
(这是许多人没有意识到的,),但理解
气流
的树视图是从右向左绘制的(这对初学者来说只是一个粗略的陈述,并不完全正确)@AshBerli Taylor——没错!从图表视图发布带有屏幕截图的更新。这应该在中提到。尽管
DAG
不能直接表示为
(这是许多人没有意识到的,),但理解
气流
的树视图是从右向左绘制的(这对于初学者来说只是一个粗略的陈述,并不完全正确)几乎是违反直觉的