如何管理气流dag之间的python软件包?

时间:2019-10-15 23:32:28

标签: airflow

如果我有多个气流dag,并且它们之间有一些重叠的python软件包依赖项,那么如何保留每个项目部门。解耦?例如。如果我在同一台服务器上有项目A和B,我将使用类似...的方式运行它们中的每一个

source /path/to/virtualenv_a/activate
python script_a.py
deactivate
source /path/to/virtualenv_b/activate
python script_b.py
deactivate

基本上,我想在相同的情况下运行dag(例如,每个dag使用的Python脚本可能具有重叠的包dep。我想单独开发(即,当使用包时不必更新所有代码)想要仅针对一个项目更新软件包))。请注意,我一直在使用BashOperator运行python任务,例如...

do_stuff = BashOperator(
        task_id='my_task',
        bash_command='python /path/to/script.py'),
        execution_timeout=timedelta(minutes=30),
        dag=dag)

是否有办法使它正常工作?气流是否还有其他旨在让人们解决(或避免)此类问题的最佳实践方法?

3 个答案:

答案 0 :(得分:1)

有运行 Python 的操作符。有一个相对较新的 PythonVirtualenvOperator,它将创建一个临时的 virtualenv,安装您的依赖项,运行您的 Python,然后拆除环境。这确实会产生一些每个任务的开销,但对于您的依赖重叠问题来说,这是一种功能性(如果不是理想的)方法。

https://airflow.apache.org/docs/apache-airflow/stable/howto/operator/python.html#pythonvirtualenvoperator

答案 1 :(得分:0)

您可以使用打包的dag,其中每个dag都与它的依赖项打包在一起 http://airflow.apache.org/concepts.html#packaged-dags

答案 2 :(得分:0)

基于apache-airflow邮件列表的讨论,最简单的答案(例如,我使用各种python脚本执行任务的模块化方式)是针对每个脚本或模块直接调用virtualenv python解释程序二进制文件。

source /path/to/virtualenv_a/activate
python script_a.py
deactivate
source /path/to/virtualenv_b/activate
python script_b.py
deactivate

将翻译为类似的东西

do_stuff_a = BashOperator(
        task_id='my_task_a',
        bash_command='/path/to/virtualenv_a/bin/python /path/to/script_a.py'),
        execution_timeout=timedelta(minutes=30),
        dag=dag)
do_stuff_b = BashOperator(
        task_id='my_task_b',
        bash_command='/path/to/virtualenv_b/bin/python /path/to/script_b.py'),
        execution_timeout=timedelta(minutes=30),
        dag=dag)

在气流障碍中。