生成uuid并在Airflow DAG中使用它

时间:2019-04-18 14:21:41

标签: constants uuid airflow

我正在尝试创建具有以下2个任务的动态气流: 任务1:创建文件,文件中包含生成的UUID 任务2:对这些文件进行检查

因此,我定义了一个变量“ FILE_UUID”,并将其设置为:str(uuid.uuid4())。并且还创建了一个常量文件名: MY_FILE ='{file_uuid} _file.csv'.format(file_uuid = FILE_UUID}

然后-任务1是一个bashOperator,它将MY_FILE作为命令的一部分获取,并且成功创建了一个文件。 我可以看到生成的文件名称中包含一个特定的UUID

任务2失败的是一个将MY_FILE作为op_args的PythonOperator。但无法访问该文件。日志显示它尝试访问具有不同UUID的文件。

为什么我的“常数”在每个任务上都单独运行?有什么方法可以防止这种情况发生?

我正在使用Airflow 1.10,我的执行者是LocalExecutor。

我尝试在“ with DAG”外部和内部设置常量,也尝试使用宏,但是PythonOperator只是使用它们持有的值按字面意义使用宏字符串。

1 个答案:

答案 0 :(得分:0)

您必须记住,DAG定义文件是一种“配置脚本”,而不是运行DAG的实际可执行文件。这些任务是在完全不同的环境中执行的,大多数情况下甚至不在同一台计算机上执行。可以将其想象为一种配置XML,它可以设置您的任务,然后在云中的其他计算机上构建和执行任务-但它是Python而不是XML。

总而言之-您的DAG代码是Python,但不是在任务运行时执行的代码。因此,如果您在此处生成一个随机的uuid,它将在未知时间多次评估-针对每个任务,在不同的机器上。

要使其在所有任务中保持一致,您需要找到另一种方法,例如:

  • 使用XCOM,以便第一个任务使用它获得的uuid,然后将其写入XCOM,以供所有下游任务使用。
  • 为uuid固定管道中的常量,源,日期或其他任何内容(例如,如果是日常任务,则可以从日期部分混合一些dag /任务细节等来构建uuid,无论如何)使您的uuid在所有任务中都一样,但在唯一的日子里是唯一的)