Airflow Apache最佳实践:(Python)操作符或bash操作符

Airflow Apache最佳实践:(Python)操作符或bash操作符,airflow,apache-airflow,Airflow,Apache Airflow,这些天我在做一个新的ETL项目,我想尝试一下作为工作经理。 我和我的同事都是第一次使用Airflow,我们采用了两种不同的方法:我决定编写python函数(类似于apache Airflow项目中包含的操作符),而我的同事使用Airflow通过BashOperator调用外部python脚本 我想知道是否有类似“好的实践”的东西,如果这两种方法同样好,或者我应该考虑另一种方法。 对我来说,主要的区别是: -使用BashOperator,您可以使用具有特定包的特定python环境调用python脚

这些天我在做一个新的ETL项目,我想尝试一下作为工作经理。 我和我的同事都是第一次使用Airflow,我们采用了两种不同的方法:我决定编写python函数(类似于apache Airflow项目中包含的操作符),而我的同事使用Airflow通过BashOperator调用外部python脚本

我想知道是否有类似“好的实践”的东西,如果这两种方法同样好,或者我应该考虑另一种方法。

对我来说,主要的区别是: -使用BashOperator,您可以使用具有特定包的特定python环境调用python脚本 -使用BashOperator,任务更加独立,如果气流失控,可以手动启动 -使用BashOperator,任务之间的通信更难管理 -使用bash,操作员任务错误和失败更难管理(bash任务如何在失败或成功之前知道任务是失败的?)


你觉得怎么样?

在这种情况下,我个人倾向于使用蟒蛇操作员而不是Bash操作员。以下是我的工作和原因:

  • 包含我的所有DAG的单一回购。该回购协议还有一个
    setup.py
    ,其中包含气流作为依赖项,以及我的DAG需要的任何其他内容。Airflow服务由安装这些依赖项的virtualenv运行。这将处理您提到的关于BashOperator的python环境
  • 我尝试将所有与气流无关的Python逻辑放在它自己的外部打包Python库中。该代码应该有自己的单元测试,也有自己的main,这样就可以在命令行上独立地调用它。这解决了你关于气流失控的问题
  • 如果逻辑足够小,无法将其分离到自己的库中,我会将其放在我的DAG repo中的utils文件夹中,当然还是单元测试
  • 然后我把这个逻辑称为PythonOperator的气流。python可调用函数可以很容易地进行单元测试,这与BashOperator模板脚本不同。这也意味着您可以访问诸如启动Airflow DB会话、将多个值推送到XCom等内容
  • 正如您提到的,Python的错误处理稍微容易一些。您可以轻松捕获异常并检查返回值。您可以选择使用
    raise AirflowSkipException
    将任务标记为跳过

供BashOperator参考,如果脚本退出时带有错误代码,则会将任务标记为失败。

TaskA检查源位置的数据可用性。TaskB处理它

任务A>>任务B


这两个任务都使用BashOperator调用python脚本。我过去常常从TaskA触发的script1返回sys.exit(1)(当源代码中没有数据时)作为传递Task a失败的一种方式,因为没有数据,也不需要运行Task B。

如果您有50多个独立的工作流,每个工作流都需要独立的版本和库演化,我看不到这个单一的repo环境实际工作。