我正在使用带有Kubernetes执行器和KubernetesPodOperator
的Airflow。我有两个工作:
为了能够在作业之间共享数据,我想在同一个Pod上运行它们,然后A将数据写入卷,B将读取该卷中的数据。
Kubernetes执行器将为每个任务实例创建一个新的pod。
有什么办法可以做到这一点?如果没有,建议在作业之间传递数据的推荐方法是什么?
答案 0 :(得分:2)
抱歉,这不可能-每个吊舱只能完成一项工作。
最好使用任务1将数据放在众所周知的位置(例如,在云桶中),然后从第二个任务中获取数据。或者只是将两个任务结合在一起。
答案 1 :(得分:1)
是的,您可以在job内部使用init容器来执行此操作,因此在同一个pod中,在init容器完成其任务之前不会触发该工作
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
这是广告连播的示例,您可以将其应用于同类工作
答案 2 :(得分:1)
您绝对可以使用subdags和SubDag运算符来完成此操作。当您开始子数据发布时,kubernetes执行程序会在子数据层次上创建一个Pod,所有子任务都在该Pod上运行。
似乎没有记录此行为。我们最近在对流程进行故障排除时发现了这一点。
答案 3 :(得分:0)
您可以有2个单独的任务A和B,可以将数据从A传送到B。K8S对此类卷具有开箱即用的支持。 例如。 https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore。 在这里,将由一个容器生成的数据将是持久的,因此当容器被删除时,数据不会丢失。相同的卷可以由另一个容器挂载,并且可以访问数据。