一些背景:我已经在Kubernetes上(在AWS上)设置了Airflow。我能够运行DAG来查询数据库,发送电子邮件或执行不需要Airflow尚未包含的软件包的任何操作。例如,如果我尝试运行使用Facebook-business SDK的DAG,则DAG显然会中断,因为该依赖项不可用。我尝试了几种其他方法来获取这种依赖关系,以及其他已安装但未成功的方法。
我试图通过修改调度程序和Web服务器部署来安装python软件包,以作为initContainer的一部分对我的依赖项进行pip安装。当我这样做时,DAG仍然损坏,因为它找不到所需的软件包。当打开外壳到我的Pod时,我可以看到尚未安装依赖项(我使用pip list
检查)。我还验证了没有安装其他python / pip版本。
我还尝试通过在外壳上打开外壳时运行pip安装来安装依赖项。这样可以成功将依赖项安装在正确的位置,并使它可用。但是,我收到this dag isn't available in the webserver dagbag object
消息,而不是显示我的DAG损坏的Web服务器UI。
我希望将pip install
作为initContainer或容器的一部分运行,将使这些依赖项在我的pod中可用。但是,事实并非如此。好像pip install运行时没有任何问题,但是到我的pod完全安装时,就找不到python软件包了
我忘了说了我已经找到了一种使其工作的方法,但感觉有些不可靠,希望有更好的方法 -如果我在Web服务器容器中打开外壳并安装所需的依赖项,然后在调度程序中打开外壳并执行相同的操作,则将找到依赖项,并且DAG可以正常工作。
答案 0 :(得分:1)
init容器是一个单独的docker实例。除非您为python库安装某种共享存储(这是非常可疑的),否则init容器中安装的任何pip都不会影响pod的运行容器。
我看到两个选择:
1)修改您正在使用的docker映像,以包括所需的软件包
2)在容器中正在运行的命令前面加上pip install
。为了在起始Pod中执行一系列操作,通常将几个命令与它们之间的&&
串在一起。
答案 1 :(得分:0)
我建议您更新Airflow Docker映像以包括所需的库。
如果您打算对特定DAG使用很多个不同的库,那么可能值得创建多个Docker映像,然后在任务级别引用它们。
qx