如果我有多个气流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)
是否有办法使它正常工作?气流是否还有其他旨在让人们解决(或避免)此类问题的最佳实践方法?
答案 0 :(得分:1)
有运行 Python 的操作符。有一个相对较新的 PythonVirtualenvOperator,它将创建一个临时的 virtualenv,安装您的依赖项,运行您的 Python,然后拆除环境。这确实会产生一些每个任务的开销,但对于您的依赖重叠问题来说,这是一种功能性(如果不是理想的)方法。
答案 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)
在气流障碍中。